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迭代用法实例教程
Sep 08 Python
Python 解决中文写入Excel时抛异常的问题
May 03 Python
python输入整条数据分割存入数组的方法
Nov 13 Python
谈一谈基于python的面向对象编程基础
May 21 Python
python实现中文文本分句的例子
Jul 15 Python
Python和Sublime整合过程图示
Dec 25 Python
基于python和flask实现http接口过程解析
Jun 15 Python
Python基于Twilio及腾讯云实现国际国内短信接口
Jun 18 Python
浅谈Django前端后端值传递问题
Jul 15 Python
Python classmethod装饰器原理及用法解析
Oct 17 Python
python爬虫爬取某网站视频的示例代码
Feb 20 Python
OpenCV-Python直方图均衡化实现图像去雾
Jun 07 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数组输出html表格的方法
2014/02/24 PHP
thinkphp循环结构用法实例
2014/11/24 PHP
PHP会话操作之cookie用法分析
2016/09/28 PHP
JavaScript脚本性能的优化方法
2007/02/02 Javascript
javascript编程起步(第四课)
2007/02/27 Javascript
jQuery学习笔记 获取jQuery对象
2012/09/19 Javascript
JavaScript二维数组实现的省市联动菜单
2014/05/08 Javascript
自己封装的javascript事件队列函数版
2014/06/12 Javascript
JS实现鼠标经过好友列表中的好友头像时显示资料卡的效果
2014/07/02 Javascript
jQuery+ajax实现文章点赞功能的方法
2015/12/31 Javascript
谈一谈jQuery核心架构设计
2016/03/28 Javascript
jquery validate表单验证插件
2016/09/06 Javascript
jQuery实现手机版页面翻页效果的简单实例
2016/10/05 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
微信小程序之自定义组件的实现代码(附源码)
2018/08/02 Javascript
vue filter 完美时间日期格式的代码
2019/08/14 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
国内常用的js类库大全(CDN公共库)
2020/06/24 Javascript
[45:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第二场 6.2
2018/06/04 DOTA
Python使用新浪微博API发送微博的例子
2014/04/10 Python
Python使用multiprocessing创建进程的方法
2015/06/04 Python
解决PyCharm import torch包失败的问题
2018/10/13 Python
理想高通滤波实现Python opencv示例
2019/01/30 Python
Python 实现平台类游戏添加跳跃功能
2020/03/27 Python
Python如何给你的程序做性能测试
2020/07/29 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
Numpy中的数组搜索中np.where方法详细介绍
2021/01/08 Python
python生成word合同的实例方法
2021/01/12 Python
施华洛世奇意大利官网:SWAROVSKI意大利
2018/07/23 全球购物
优秀管理者事迹材料
2014/05/22 职场文书
领导班子四风查摆对照检查材料思想汇报
2014/10/05 职场文书
关于运动会广播稿200字
2014/10/08 职场文书
2015年学校减负工作总结
2015/05/19 职场文书
运动会5000米加油稿
2015/07/21 职场文书
Python+uiautomator2实现自动刷抖音视频功能
2021/04/29 Python
Netflix《海贼王》真人版剧集多张片场照曝光
2022/04/04 日漫