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 14 Python
Python文件去除注释的方法
May 25 Python
Python制作词云的方法
Jan 03 Python
Python数据处理numpy.median的实例讲解
Apr 02 Python
python3之模块psutil系统性能信息使用
May 30 Python
Python从使用线程到使用async/await的深入讲解
Sep 16 Python
python pandas实现excel转为html格式的方法
Oct 23 Python
对Python3 解析html的几种操作方式小结
Feb 16 Python
利用Python模拟登录pastebin.com的实现方法
Jul 12 Python
python与C、C++混编的四种方式(小结)
Jul 15 Python
Python字符串中删除特定字符的方法
Jan 15 Python
Python 抓取数据存储到Redis中的操作
Jul 16 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
PHP构造函数与析构函数用法示例
2016/09/28 PHP
PHP实现断点续传乱序合并文件的方法
2018/09/06 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
用JS实现一个页面多个css样式实现
2008/05/29 Javascript
javascript 面向对象编程 function也是类
2009/09/17 Javascript
在子窗口中关闭父窗口的一句代码
2013/10/21 Javascript
解决jquery中美元符号命名冲突问题
2014/01/08 Javascript
中文输入法不触发onkeyup事件的解决办法
2014/07/09 Javascript
Javascript保存网页为图片借助于html2canvas库实现
2014/09/05 Javascript
Bootstrap每天必学之表单
2015/11/23 Javascript
JavaScript中的原型prototype完全解析
2016/05/10 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
喜大普奔!jQuery发布 3.0 最终版
2016/06/12 Javascript
xmlplus组件设计系列之列表(4)
2017/04/26 Javascript
Mongoose实现虚拟字段查询的方法详解
2017/08/15 Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
2018/02/03 Javascript
JavaScript实现一个带AI的井字棋游戏源码
2018/05/21 Javascript
jquery简单实现纵向的无缝滚动代码实例
2019/04/01 jQuery
ES6基础之数组和对象的拓展实例详解
2019/08/22 Javascript
使用layer.msg 时间设置不起作用的解决方法
2019/09/12 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
2019/10/15 Javascript
[01:06:54]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第一场 1月24日
2021/03/11 DOTA
Python读取键盘输入的2种方法
2015/06/16 Python
Python 关于反射和类的特殊成员方法
2017/09/14 Python
python 正确保留多位小数的实例
2018/07/16 Python
python 实现语音聊天机器人的示例代码
2018/12/02 Python
Python Pandas对缺失值的处理方法
2019/09/27 Python
Python如何使用argparse模块处理命令行参数
2019/12/11 Python
最小二乘法及其python实现详解
2020/02/24 Python
特罗佩亚包官方网站:Tropea
2017/01/03 全球购物
自荐书模板
2013/12/15 职场文书
优秀毕业生自我鉴定
2014/02/11 职场文书
经典促销广告词大全
2014/03/19 职场文书
计算机科学技术自荐信
2014/06/12 职场文书
中秋节慰问信
2015/02/15 职场文书
Python+Pillow+Pytesseract实现验证码识别
2022/05/11 Python