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 相关文章推荐
Windows下实现Python2和Python3两个版共存的方法
Jun 12 Python
解决Python字典写入文件出行首行有空格的问题
Sep 27 Python
python简单实现操作Mysql数据库
Jan 29 Python
用TensorFlow实现多类支持向量机的示例代码
Apr 28 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
Python对HTML转义字符进行反转义的实现方法
Apr 28 Python
Python中查看变量的类型内存地址所占字节的大小
Jun 26 Python
Python中字符串List按照长度排序
Jul 01 Python
python里运用私有属性和方法总结
Jul 08 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
Jan 25 Python
Python函数基本使用原理详解
Mar 19 Python
Matplotlib绘制混淆矩阵的实现
May 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
php中session_unset与session_destroy的区别分析
2011/06/16 PHP
php 模拟get_headers函数的代码示例
2013/04/27 PHP
解决file_get_contents无法请求https连接的方法
2013/12/17 PHP
基于PHP实现的事件机制实例分析
2015/06/18 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
2017/10/12 PHP
php判断/计算闰年的方法小结【三种方法】
2019/07/06 PHP
基于JQUERY的多级联动代码
2012/01/24 Javascript
javascript为下拉列表动态添加数据项
2014/05/23 Javascript
js实现div闪烁原理及实现代码
2014/06/24 Javascript
jQuery中Form相关知识汇总
2015/01/06 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
2015/05/09 Javascript
JavaScript实现点击文字切换登录窗口的方法
2015/05/11 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
2015/08/24 Javascript
JS日期加减,日期运算代码
2015/11/05 Javascript
javascript类型系统 Array对象学习笔记
2016/01/09 Javascript
详细总结Javascript中的焦点管理
2016/09/17 Javascript
vue学习笔记之v-if和v-show的区别
2017/09/20 Javascript
template.js前端模板引擎使用详解
2017/10/10 Javascript
Vue全家桶实践项目总结(推荐)
2017/11/04 Javascript
浅谈node模块与npm包管理工具
2018/01/03 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
2020/06/04 Javascript
[01:28:24]NAVI vs VG Supermajor 败者组 BO3 第三场 6.5
2018/06/06 DOTA
Python实现把回车符\r\n转换成\n
2015/04/23 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
Python异常对代码运行性能的影响实例解析
2018/02/08 Python
对Python 2.7 pandas 中的read_excel详解
2018/05/04 Python
Django choices下拉列表绑定实例
2020/03/13 Python
欧洲著名的珠宝和手表网上商城:uhrcenter
2017/04/10 全球购物
Beach Bunny Swimwear官网:设计师泳装和性感比基尼
2019/03/13 全球购物
黄金酒广告词
2014/03/21 职场文书
四年级学生期末评语
2014/12/26 职场文书
三八节祝酒词
2015/08/11 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
2016应届毕业生自荐信范文
2016/01/28 职场文书
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android