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实现在pickling的时候压缩的方法
Sep 25 Python
Flask框架中密码的加盐哈希加密和验证功能的用法详解
Jun 07 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
Python学习pygal绘制线图代码分享
Dec 09 Python
Python实现PS图像明亮度调整效果示例
Jan 23 Python
Python 实现字符串中指定位置插入一个字符
May 02 Python
django表单实现下拉框的示例讲解
May 29 Python
Python实现模拟登录网易邮箱的方法示例
Jul 05 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
Dec 26 Python
Python OpenCV对本地视频文件进行分帧保存的实例
Jan 08 Python
Python selenium根据class定位页面元素的方法
Feb 26 Python
Python并发concurrent.futures和asyncio实例
May 04 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的日期与时间函数技巧
2008/04/24 PHP
屏蔽Flash右键信息的js代码
2010/01/17 Javascript
Javascript学习笔记 delete运算符
2011/09/13 Javascript
Javascript this 的一些学习总结
2012/08/02 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
jQuery实现防止提交按钮被双击的方法
2015/03/24 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
JavaScript检测并限制复选框选中个数的方法
2015/08/12 Javascript
非常实用的js验证框架实现源码 附原理方法
2016/06/08 Javascript
js 基础篇必看(点击事件轮播图的简单实现)
2016/08/20 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
2016/10/11 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
2018/02/08 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
Vuex的实战使用详解
2019/10/31 Javascript
node+vue实现文件上传功能
2020/05/28 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
查看Django和flask版本的方法
2018/05/14 Python
Python定时任务APScheduler的实例实例详解
2019/07/22 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
2019/12/19 Python
python读取当前目录下的CSV文件数据
2020/03/11 Python
盖尔斯工厂店:GUESS Factory
2020/01/21 全球购物
地球鞋加拿大官网:Earth Shoes Canada
2020/11/17 全球购物
简单介绍Object类的功能、常用方法
2013/10/02 面试题
SQL SERVER面试资料
2013/03/30 面试题
医药专业应届毕业生求职信范文
2014/01/01 职场文书
家长给幼儿园的表扬信
2014/01/09 职场文书
自荐信需注意事项
2014/01/25 职场文书
创业女性典型材料
2014/05/02 职场文书
个人四风对照检查材料
2014/09/26 职场文书
写给父母的感谢信
2015/01/22 职场文书
明确岗位职责
2015/02/14 职场文书
2019入党申请书格式和范文
2019/06/25 职场文书
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python
vue中利用mqtt服务端实现即时通讯的步骤记录
2021/07/01 Vue.js