Python中顺序表原理与实现方法详解


Posted in Python onDecember 03, 2019

本文实例讲述了Python中顺序表原理与实现方法。分享给大家供大家参考,具体如下:

Python中的顺序表

Python中的list和tuple两种类型采用了顺序表的实现技术,具有顺序表的所有性质。

tuple是不可变类型,即不变的顺序表,因此不支持改变其内部状态的任何操作,而其他方面,则与list的性质类似。

list的基本实现技术

Python标准类型list就是一种元素个数可变的线性表,可以加入和删除元素,并在各种操作中维持已有元素的顺序(即保序),而且还具有以下行为特征:

  • 基于下标(位置)的高效元素访问和更新,时间复杂度应该是O(1);

    为满足该特征,应该采用顺序表技术,表中元素保存在一块连续的存储区中。

  • 允许任意加入元素,而且在不断加入元素的过程中,表对象的标识(函数id得到的值)不变。

    为满足该特征,就必须能更换元素存储区,并且为保证更换存储区时list对象的标识id不变,只能采用分离式实现技术。

在Python的官方实现中,list就是一种采用分离式技术实现的动态顺序表。这就是为什么用list.append(x) (或 list.insert(len(list), x),即尾部插入)比在指定位置插入元素效率高的原因。

《数据结构与算法 Python语言描述》 裘宗燕 著

在Python的官方实现中,list实现采用了如下的策略:在建立空表(或者很小的表)时,系统分配一块能容纳8个元素的存储区;在执行插入操作(insert或append)时,如果元素存储区满就换一块4倍大的存储区。但如果此时的表已经很大(目前的阀值为50000),则改变策略,采用加一倍的方法。引入这种改变策略的方式,是为了避免出现过多空闲的存储位置。

在Python的官方实现中,list实现采用了如下的策略:

/* This over-allocates proportional to the list size, making room
   * for additional growth. The over-allocation is mild, but is
   * enough to give linear-time amortized behavior over a long
   * sequence of appends() in the presence of a poorly-performing
   * system realloc().
   * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
   */
  new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);
  /* check for integer overflow */
  if (new_allocated > PY_SIZE_MAX - newsize) {
    PyErr_NoMemory();
    return -1;
  } else {
    new_allocated += newsize;
  }

python顺序表增删查实现

class shunxubiao:
  def __init__(self,length):#length表示顺序表的长度,决定此顺序表最多存储多少元素
    self.length=length
    self.data=[] #data表示顺序表内容
    self.biao=-1 #元素下标
  def weikong(self):#判断 这个顺序表是否是空的
    if self.biao==-1:
      return True
    else:
      return False
  def mande(self):#判断此顺序表是否是满的
    if self.biao+1==self.length:
      return True
    else:
      return False
  def qingkong(self):
    if not self.weikong():
      self.data=[]
      self.biao=-1
  def geshu(self):
    return self.biao+1
  def chazhao(self,x):#知道下标查找元素
    return self.data[x]
  def chazhao1(self,x):#知道元素查找下标
    if self.weikong():
      print('表为空')
      return -1
    for i in range(self.biao+1):
      if self.data[i]==x:
       return i
       break
       print('查找的元素不存在')
  def biaoweijia(self,x): #给顺序表表尾加一个元素
    if self.mande():
      print('biaoyiman')
    else:
     self.data.append(x)
    self.biao+=1
  def charu(self,index,x):#想顺序表的index位置插入x元素
    if self.mande():
      print('biayiman')
    elif index<0 or index>self.biao-1:
      print('bunengcharu')
    else:
      for i in range(self.biao,index-1):
        self.data[i+1]=self.data[i]
        self.data[index-1]=x
      self.biao+=1
  def shanchu(self,x):#删除指定元素x
    if self.weikong():#判断是不是空表
      print('kongde,bunengshanchu')
    index=-1#用index来找x的位置
    for i in (self.data):
      index+=1
      if i == x:
        break
    for i in range(index,self.biao-1):#把x元素之后的元素都向前推进一格
      self.data[i]=self.data[i+1]
    self.biao-=1
c=shunxubiao(6)
c.data=[2,4,5,6]
c.biao=3
c.weikong()
print(c.chazhao(2))#知道尾标2查找元素
print(c.chazhao1(4))#知道元素查找尾标
c.biaoweijia(7)#给表尾加元素
print(c.data)
print(c.biao)
c.charu(3,9)
print(c.data)
print(c.biao)
c.shanchu(7)
print(c.data)
print(c.biao)

输出结果:

[2, 4, 5, 6, 7] 4 [2, 4, 5, 6, 7] 5 [2, 4, 5, 6, 7] 4

思考:为什么没有把9添加进去,也没有把7删除掉

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python映射列表实例分析
Jan 26 Python
Python中内置的日志模块logging用法详解
Jul 12 Python
Python脚本实现12306火车票查询系统
Sep 30 Python
Python基于matplotlib绘制栈式直方图的方法示例
Aug 09 Python
Python微信公众号开发平台
Jan 25 Python
Pycharm简单使用教程(入门小结)
Jul 04 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
Oct 24 Python
python代码打印100-999之间的回文数示例
Nov 24 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
May 27 Python
使用npy转image图像并保存的实例
Jul 01 Python
Python利用命名空间解析XML文档
Aug 10 Python
celery在python爬虫中定时操作实例讲解
Nov 27 Python
python双向链表原理与实现方法详解
Dec 03 #Python
Python读取实时数据流示例
Dec 02 #Python
简单了解python元组tuple相关原理
Dec 02 #Python
python实现智能语音天气预报
Dec 02 #Python
Python:二维列表下标互换方式(矩阵转置)
Dec 02 #Python
python 实现二维列表转置
Dec 02 #Python
python列表推导式入门学习解析
Dec 02 #Python
You might like
【COS正片】蕾姆睡衣cos,纯洁可爱被治愈了 cn名濑弥七
2020/03/02 日漫
欧美媒体选出10年前最流行的17部动画
2017/01/18 日漫
php date与gmdate的获取日期的区别
2010/02/08 PHP
php array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
php中实现记住密码下次自动登录的例子
2014/11/06 PHP
Thinkphp框架开发移动端接口(2)
2016/08/18 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
初学JavaScript第二章
2008/09/30 Javascript
DOM下的节点属性和操作小结
2009/05/14 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
深入理解Javascript中的循环优化
2013/11/09 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
jquery通过visible来判断标签是否显示或隐藏
2014/05/08 Javascript
jquery表单验证插件formValidator使用方法
2016/04/01 Javascript
JS实现iframe自适应高度的方法(兼容IE与FireFox)
2016/06/24 Javascript
JQuery控制DIV的选取实现方法
2016/09/18 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
解决vue select当前value没有更新到vue对象属性的问题
2018/08/30 Javascript
Element Steps步骤条的使用方法
2020/07/26 Javascript
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
Python单元测试框架unittest简明使用实例
2015/04/13 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
python Django编写接口并用Jmeter测试的方法
2019/07/31 Python
python实现批量修改服务器密码的方法
2019/08/13 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
Pytorch实现LSTM和GRU示例
2020/01/14 Python
PyQt5的QWebEngineView使用示例
2020/10/20 Python
什么是smarty? Smarty的优点是什么?
2013/08/11 面试题
linux面试题参考答案(8)
2016/04/19 面试题
建筑工程自我鉴定
2013/10/18 职场文书
人力资源主管的岗位职责
2014/03/15 职场文书
党员个人公开承诺书
2014/08/29 职场文书
企业法人代表授权委托书
2014/10/02 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
工作年限证明模板
2014/11/01 职场文书