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编程中的字符串
Oct 14 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
Sep 11 Python
python实现简单点对点(p2p)聊天
Sep 13 Python
Python实现购物系统(示例讲解)
Sep 13 Python
浅谈Django自定义模板标签template_tags的用处
Dec 20 Python
python实现关闭第三方窗口的方法
Jun 28 Python
Django模板语言 Tags使用详解
Sep 09 Python
基于python的selenium两种文件上传操作实现详解
Sep 19 Python
Python 可变类型和不可变类型及引用过程解析
Sep 27 Python
Python3和PyCharm安装与环境配置【图文教程】
Feb 14 Python
AUC计算方法与Python实现代码
Feb 28 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
Apr 21 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新手上路(十一)
2006/10/09 PHP
php绘制一条直线的方法
2015/01/24 PHP
PHP中的switch语句的用法实例详解
2015/10/21 PHP
JQuery模板插件 jquery.tmpl 动态ajax扩展
2011/11/10 Javascript
iphone safari不支持position fixed的解决方法
2012/05/04 Javascript
Node.js开发指南中的简单实例(mysql版)
2013/09/17 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
javascript 控制input只允许输入的各种指定内容
2014/06/19 Javascript
一个不错的js html页面倒计时可精确到秒
2014/10/22 Javascript
解决jquery中动态新增的元素节点无法触发事件问题的两种方法
2015/10/30 Javascript
JS插件overlib用法实例详解
2015/12/26 Javascript
在IE8上JS实现combobox支持拼音检索功能
2016/05/23 Javascript
全面理解JavaScript中的继承(必看)
2016/06/16 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
jQuery实现表格与ckeckbox的全选与单选功能
2016/11/24 Javascript
vue中的计算属性实例详解
2018/09/19 Javascript
小程序实现列表点赞功能
2018/11/02 Javascript
浅谈vuex actions和mutation的异曲同工
2018/12/13 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
vue router返回到指定的路由的场景分析
2020/11/10 Javascript
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
Python 冒泡,选择,插入排序使用实例
2015/02/05 Python
Python的Flask框架中Flask-Admin库的简单入门指引
2015/04/07 Python
python+selenium+autoit实现文件上传功能
2017/08/23 Python
Python实现输出程序执行进度百分比的方法
2017/09/16 Python
pytorch 图像预处理之减去均值,除以方差的实例
2020/01/02 Python
python十进制转二进制的详解
2020/02/07 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
2020/06/03 Python
最新Python idle下载、安装与使用教程图文详解
2020/11/28 Python
CSS3 中的@keyframes介绍
2014/09/02 HTML / CSS
2014年冬季防火方案
2014/05/21 职场文书
机电一体化应届生求职信
2014/08/09 职场文书
2014年政风行风评议工作总结
2014/10/21 职场文书
关于感恩的歌曲整理(8首)
2019/08/14 职场文书
聘任书的格式及模板
2019/10/28 职场文书