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解决网站的反爬虫策略总结
Oct 26 Python
致Python初学者 Anaconda入门使用指南完整版
Apr 05 Python
使用PM2+nginx部署python项目的方法示例
Nov 07 Python
padas 生成excel 增加sheet表的实例
Dec 11 Python
python shell命令行中import多层目录下的模块操作
Mar 09 Python
Python HTMLTestRunner可视化报告实现过程解析
Apr 10 Python
怎么快速自学python
Jun 22 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
Sep 14 Python
python 如何区分return和yield
Sep 22 Python
Python numpy大矩阵运算内存不足如何解决
Nov 19 Python
python实现图片九宫格分割的示例
Apr 25 Python
Python标准库之typing的用法(类型标注)
Jun 02 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程序
2006/10/09 PHP
PHP4实际应用经验篇(9)
2006/10/09 PHP
在VS2008中编译MYSQL5.1.48的方法
2010/07/03 PHP
一组PHP可逆加密解密算法实例代码
2014/01/21 PHP
PHP入门之常量简介和系统常量
2014/05/12 PHP
PHP读取CURL模拟登录时生成Cookie文件的方法
2014/11/04 PHP
Linux下快速搭建php开发环境
2017/03/13 PHP
Apache站点配置SSL强制跳转443
2021/03/09 Servers
js 目录列举函数
2008/11/06 Javascript
extJs 常用到的增,删,改,查操作代码
2009/12/28 Javascript
Js动态添加复选框Checkbox的实例方法
2013/04/08 Javascript
javascript获取设置div的高度和宽度兼容任何浏览器
2013/09/22 Javascript
jQuery实现瀑布流布局
2014/12/12 Javascript
基于JavaScript实现购物网站商品放大镜效果
2016/09/06 Javascript
纯JavaScript手写图片轮播代码
2016/10/20 Javascript
详解bootstrap导航栏.nav与.navbar区别
2017/11/23 Javascript
[09:22]2014DOTA2西雅图国际邀请赛 主赛事第二日TOPPLAY
2014/07/21 DOTA
Python脚本暴力破解栅栏密码
2015/10/19 Python
Python使用try except处理程序异常的三种常用方法分析
2018/09/05 Python
python实现键盘控制鼠标移动
2020/11/27 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
2019/04/15 Python
如何利用Python 进行边缘检测
2020/10/14 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
2020/11/17 Python
表单button的outline在firefox浏览器下的问题
2012/12/24 HTML / CSS
浅析HTML5 Landmark
2020/09/11 HTML / CSS
美国创意之家:BulbHead
2017/07/12 全球购物
美国批发供应商:Kole Imports
2019/04/10 全球购物
NBA欧洲商店(西班牙):NBA Europe Store ES
2019/04/16 全球购物
2014乡镇党委副书记对照检查材料思想汇报
2014/10/09 职场文书
邀请书格式范文
2015/02/02 职场文书
劳资员岗位职责
2015/02/13 职场文书
入党积极分子个人总结
2015/03/02 职场文书
2015教师节师德演讲稿
2015/03/19 职场文书
Python实现机器学习算法的分类
2021/06/03 Python
浅谈如何保证Mysql主从一致
2022/03/13 MySQL