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中threading模块join函数用法实例分析
Jun 04 Python
python 采集中文乱码问题的完美解决方法
Sep 27 Python
Python实现抓取网页生成Excel文件的方法示例
Aug 05 Python
python数据封装json格式数据
Mar 04 Python
HTML的form表单和django的form表单
Jul 25 Python
浅谈Python 敏感词过滤的实现
Aug 15 Python
浅析PEP570新语法: 只接受位置参数
Oct 15 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
Dec 09 Python
pyqt5 QlistView列表显示的实现示例
Mar 24 Python
解决json中ensure_ascii=False的问题
Apr 03 Python
浅谈Python协程
Jun 17 Python
python如何使用腾讯云发送短信
Sep 17 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
用文本文件制作留言板提示(下)
2006/10/09 PHP
PHP 程序员也要学会使用“异常”
2009/06/16 PHP
护卫神php套件 php版本升级方法(php5.5.24)
2015/05/10 PHP
简单实现php上传文件功能
2017/09/21 PHP
jQuery 使用手册(七)
2009/09/23 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
让ie运行js时提示允许阻止内容运行的解决方法
2010/10/24 Javascript
window.showModalDialog()返回值的学习心得总结
2014/01/07 Javascript
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
javascript实现随时变化着的背景颜色
2015/04/02 Javascript
jQuery获取radio选中项的值实例
2016/06/18 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
Javascript中作用域的详细介绍
2016/10/06 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
2018/01/26 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
浅谈Vue.js路由管理器 Vue Router
2018/08/16 Javascript
使用preload预加载页面资源时注意事项
2020/02/03 Javascript
Python 错误和异常小结
2013/10/09 Python
Python中获取网页状态码的两个方法
2014/11/03 Python
python的中异常处理机制
2018/08/30 Python
在Python 字典中一键对应多个值的实例
2019/02/03 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
2020/02/12 Python
Matplotlib.pyplot 三维绘图的实现示例
2020/07/28 Python
css3之UI元素状态伪类选择器实例演示
2017/08/11 HTML / CSS
美国宠物商店:Wag.com
2016/10/25 全球购物
澳大利亚自然和有机的健康美容产品一站式商店:Ziani Beauty
2017/12/28 全球购物
美国隐形眼镜零售商:LensPure
2019/03/10 全球购物
新闻网站实习自我鉴定
2013/09/25 职场文书
应届毕业生的自我鉴定
2013/11/13 职场文书
夫妻忠诚协议书范本
2014/11/17 职场文书
python小程序之飘落的银杏
2021/04/17 Python
JavaScript中时间格式化新思路toLocaleString()
2021/11/07 Javascript