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函数的参数的默认值所引发的问题的原因
Mar 30 Python
快速解决pandas.read_csv()乱码的问题
Jun 15 Python
Appium+Python自动化测试之运行App程序示例
Jan 23 Python
如何使用pyinstaller打包32位的exe程序
May 26 Python
TensorFlow实现简单的CNN的方法
Jul 18 Python
修改 CentOS 6.x 上默认Python的方法
Sep 06 Python
基于python+selenium的二次封装的实现
Jan 06 Python
Python matplotlib修改默认字体的操作
Mar 05 Python
python 瀑布线指标编写实例
Jun 03 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
Dec 14 Python
pip install命令安装扩展库整理
Mar 02 Python
Python Matplotlib绘制等高线图与渐变色扇形图
Apr 14 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在项目中寻找代码的坏味道(综艺命名)
2012/07/19 PHP
使用PHP计算两个路径的相对路径
2013/06/14 PHP
Joomla调用系统自带编辑器的实现方法
2016/05/05 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
window.open的功能全解析
2006/10/10 Javascript
jqgrid 简单学习笔记
2011/05/03 Javascript
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
JavaScript中的onerror事件概述及使用
2013/04/01 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
2017/07/12 Javascript
原生JS实现Ajax跨域请求flask响应内容
2017/10/24 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
vue使用一些外部插件及样式的配置代码
2019/11/18 Javascript
vue-cli或vue项目利用HBuilder打包成移动端app操作
2020/07/29 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
2020/08/27 Javascript
py2exe 编译ico图标的代码
2013/03/08 Python
简单的Apache+FastCGI+Django配置指南
2015/07/22 Python
Python使用multiprocessing实现一个最简单的分布式作业调度系统
2016/03/14 Python
Python使用正则表达式抓取网页图片的方法示例
2017/04/21 Python
Python中用字符串调用函数或方法示例代码
2017/08/04 Python
浅谈numpy数组的几种排序方式
2017/12/15 Python
python实现百万答题自动百度搜索答案
2018/01/16 Python
pandas 两列时间相减换算为秒的方法
2018/04/20 Python
Python3中_(下划线)和__(双下划线)的用途和区别
2019/04/26 Python
在windows下使用python进行串口通讯的方法
2019/07/02 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
解决Python 写文件报错TypeError的问题
2020/10/23 Python
What's the difference between an interface and abstract class? (接口与抽象类有什么区别)
2012/10/29 面试题
个人简历自我评价八例
2013/10/31 职场文书
新教师岗前培训方案
2014/06/05 职场文书
2015年市场部工作总结
2015/04/30 职场文书
服装店员工管理制度
2015/08/07 职场文书
浅谈Redis位图(Bitmap)及Redis二进制中的问题
2021/07/15 Redis
英镑符号 £
2022/02/17 杂记
python Tkinter模块使用方法详解
2022/04/07 Python