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实现DNS正向查询、反向查询的例子
Apr 25 Python
Python入门篇之列表和元组
Oct 17 Python
Python的Django中django-userena组件的简单使用教程
May 30 Python
Python的Flask框架的简介和安装方法
Nov 13 Python
python中aioysql(异步操作MySQL)的方法
Apr 11 Python
Pandas数据离散化原理及实例解析
Nov 16 Python
Python pip配置国内源的方法
Feb 14 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
Feb 26 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
May 26 Python
如何基于Python爬取隐秘的角落评论
Jul 02 Python
用python绘制樱花树
Oct 09 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
Dec 13 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的Yii框架中进行错误和异常处理
2016/03/17 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
PHP PDOStatement::setAttribute讲解
2019/02/01 PHP
Laravel框架Auth用户认证操作实例分析
2019/09/29 PHP
将jQuery应用于login页面的问题及解决
2009/10/17 Javascript
Dojo 学习笔记入门篇 First Dojo Example
2009/11/15 Javascript
javascript简单性能问题及学习笔记
2014/02/04 Javascript
如何实现移动端浏览器不显示 pc 端的广告
2015/10/15 Javascript
vue页面使用阿里oss上传功能的实例(一)
2017/08/09 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
Material(包括Material Icon)在Angular2中的使用详解
2018/02/11 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
2019/11/05 Javascript
JavaScript实现烟花绽放动画效果
2020/08/04 Javascript
[36:19]2018DOTA2亚洲邀请赛 小组赛 A组加赛 Newbee vs LGD
2018/04/03 DOTA
python实现探测socket和web服务示例
2014/03/28 Python
用python实现面向对像的ASP程序实例
2014/11/10 Python
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
Java分治归并排序算法实例详解
2017/12/12 Python
python执行CMD指令,并获取返回的方法
2018/12/19 Python
python实现控制台打印的方法
2019/01/12 Python
Python 开发工具PyCharm安装教程图文详解(新手必看)
2020/02/28 Python
Python-for循环的内部机制
2020/06/12 Python
Python约瑟夫生者死者小游戏实例讲解
2021/01/04 Python
美国药妆网站:EDCskincare.com(防晒、痤疮、抗衰老等)
2017/04/28 全球购物
新加坡网上花店:FlowerAdvisor新加坡
2018/10/05 全球购物
学雷锋演讲稿
2014/03/04 职场文书
科学发展观标语
2014/10/08 职场文书
2014年高校辅导员工作总结
2014/12/09 职场文书
有关西游记的读书笔记
2015/06/25 职场文书
2016年4月份红领巾广播稿
2015/12/21 职场文书
Spring Security中用JWT退出登录时遇到的坑
2021/10/16 Java/Android
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技