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的官方实现中,list实现采用了如下的策略:在建立空表(或者很小的表)时,系统分配一块能容纳8个元素的存储区;在执行插入操作(insert或append)时,如果元素存储区满就换一块4倍大的存储区。但如果此时的表已经很大(目前的阀值为50000),则改变策略,采用加一倍的方法。引入这种改变策略的方式,是为了避免出现过多空闲的存储位置。

顺序表的操作

增加元素

如图所示,为顺序表增加新元素111的三种方式

1740102-20190914140603324-1847317526.png

a. 尾端加入元素,时间复杂度为O(1)

b. 非保序的加入元素(不常见),时间复杂度为O(1)

c. 保序的元素加入,时间复杂度为O(n)

删除元素

1740102-20190914140624164-821735989.png

a. 删除表尾元素,时间复杂度为O(1)

b. 非保序的元素删除(不常见),时间复杂度为O(1)

c. 保序的元素删除,时间复杂度为O(n)

链表

为什么需要链表

顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来并不是很灵活。

链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。

链表的定义

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。

1740102-20190914140403098-867159239.png

链表与顺序表的对比

链表失去了顺序表随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大,但对存储空间的使用要相对灵活。

链表与顺序表的各种操作复杂度如下所示:

操作链表顺序表

访问元素

O(n)

O(1)

在头部插入/删除

O(1)

O(n)

在尾部插入/删除

O(n)

O(1)

在中间插入/删除

O(n)

O(n)

注意虽然表面看起来复杂度都是 O(n),但是链表和顺序表在插入和删除时进行的是完全不同的操作。链表的主要耗时操作是遍历查找,删除和插入操作本身的复杂度是O(1)。顺序表查找很快,主要耗时的操作是拷贝覆盖。因为除了目标元素在尾部的特殊情况,顺序表进行插入和删除时需要对操作点之后的所有元素进行前后移位操作,只能通过拷贝和覆盖的方法进行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python只读模式可以打印嘛_只读python属性?无法打印对象

在Python中,使用自定义描述符可以很容易地做到这一点。在看看HOWTO中的Descriptor Example。如果您只需更改__get__方法来引发一个AttributeError就这样了。我们不妨将其重命名,去掉日志记录,使之更简单。在class WriteOnly(object):"&q…

php 查文件sha1 内存不足,SHA是否足以检查文件重复? (PHP中的sha1_file)

sha1_file足够好吗?使用sha1_file就足够了,碰撞的可能性非常小,但这种情况几乎不会发生.为了减少几乎0比较文件大小的几率:function is_duplicate_file( $file1,$file2){if(filesize($file1) ! filesize($file2)) return false;if( sha1_file($file1) s…

js for foreach 快慢_js基本搜索算法实现与170万条数据下的性能测试

前言今天让我们来继续聊一聊js算法,通过接下来的讲解,我们可以了解到搜索算法的基本实现以及各种实现方法的性能,进而发现for循环,forEach,While的性能差异,我们还会了解到如何通过web worker做算法分片&am…

python获取工作日_Python获取一段日期内的工作日和所有日期

Pandas1、获取工作日:bdate_rangeimport pandas as pde pd.bdate_range(8/7/2019, 8/31/2019)e.date #获取日期列表array([datetime.date(2019, 8, 7), datetime.date(2019, 8, 8),datetime.date(2019, 8, 9), datetime.date(2019, 8, 12),datetime.date(2019, 8, …

iterm php,iTerm2笔记

本文是 iTerm2 的使用笔记,不定期更新。1 注释说明对于 Preferences 的修改,> 表示需要切换选项卡,-> 表示在同一选项卡内2 参考3 杂301 如何随时随地一键调用 Quake-like iTerm2首先声明:由于 Mac OS 本身对窗体「最大化」…

python 正则表达式 sub_python 正则表达式 re.sub re.subn

python正则表达式模块简介Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。Python 1.5之前版本则是通过 regex 模块提供 Emacs 风格的模式。Emacs 风格模式可读性稍差些,而且功能也不强,因此编写新代码时尽量不要再使用 …

清浊音判别 matlab,matlab语音信号处理如何判别清浊音?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这是我一个学长给的程序,他说里面要算得基本上已经实现了改一下就可以用了。。。但是i本人不是主攻matlab的说白了就是不怎么会,,想问下该怎么改来实现判断清浊音的功能。%对语音信号采样分帧cle…

python upper_Python 3中的模块级string.upper函数在哪里?

如何让这段代码在3中运行? 请注意,我不是"foo".upper()在字符串实例级别询问。import string try: print("string module, upper function:") print(string.upper) foo string.upper("Foo") print("foo:%s" % …

python数据科学实践 常象宇_Python数据科学实践

章基于Python的数据科学环境搭建1.1Python是数据科学“大势所趋”1.2Anaconda入门——工欲善其事,必先利其器1.3JupyterNotebook入门1.4Markdown单元格的使用1.5Spyder入门1.6小结第2章Python基础2.1“火锅团购数据”简介2.2读写数据2.3Python数据类型与结构2.4控制…

matlab emd功率谱密度,【脑电信号分类】脑电信号提取PSD功率谱密度特征

脑电信号是一种非平稳的随机信号,一般而言随机信号的持续时间是无限长的,因此随机信号的总能量是无限的,而随机过程的任意一个样本函数都不满足绝对可积条件,所以其傅里叶变换不存在。不过,尽管随机信号的总能量是无限…

小甲鱼python课后题简书_Python练习题100道

1.有四个数字:1,2,3,4,能组成多少个互不相同且无重复数字的三位数?各是多少? 方法一:遍历所有可能,把重复的剃掉。 total0 for i in range(1,5): for j in range(1,5): for k in range(1,5): if((i!j)and(j…

决策算法python_GitHub - nxety/MachineLearning_Python: 机器学习算法python实现

机器学习算法Python实现目录1、代价函数其中:下面就是要求出theta,使代价最小,即代表我们拟合出来的方程距离真实值最近共有m条数据,其中代表我们要拟合出来的方程到真实值距离的平方,平方的原因是因为可能有负值&…

php7.1安装mysqli扩展,centos php7 安装mysqli扩展心得

在新配服务器时发现,php无法连接到mysql。通过phpinfo发现。根本没有显示mysqli的相关配置。经过一系列研究。总结了下。:第一步:在phpinfo里没有mysqli配置,原因是安装php7时没有configure mysqli安装php方法:wget ht…

组装服务器配置清单_2020年组装电脑配置清单列表

随着电脑技术的不断革新,越来越多的家庭都有各式各样的电子设备。而电脑现在基本上是家家都有的物品,可是在购买电脑的时候新手小白需要注意那些事项呢?今天我们就给告诉小白如何组装电脑以小白组装电脑配置清单。1、购买电脑,您首…

oracle 关于归档的视图,oracle 与归档日志相关的几个视图

归档日志占据的数据库举足轻重的位置,以下系统视图来了解归档日志情况V$ARCHIVEV$ARCHIVED_LOG 已归档日志详单V$ARCHIVE_GAP 归档日志丢失V$ARCHIVE_PROCESSES 归档进程信息V$ARCHIVE_DEST 查看备份路径情况V$ARCHIVE_DEST_STATUSv$recovery_f…

mysql python is not installed_最全的解决安装MySQL-Python出现的问题: pip install MySQl-Python 出现:下列问题...

问题 1:Microsoft Visual C 9.0 is required error: Microsoft Visual C 9.0 is required 在Windows下用pip安装MySQl-Python报如下错误,看错误提示就知道去http://aka.ms/vcpython27找解决方法了 error: Microsoft Visual C 9.0 is required (Unable to…

python旋转数组_Python3实现旋转数组的3种算法

一、试题给出一个数组,将数组中的元素往右边移动k个位置,当中k是非负数。比如说:输入:[1,2,3,4,5,6,7]和k3输出:[5,6,7,1,2,3,4]解释:往右边旋转1步:[7,1,2,3,4,5,6]往右边旋转2步:[6,7,1,2,3,4,5]往右边旋转3步:[5,6,7,1,2,3,4]*反映&#x…

python数字大小写转换代码_用python实现把数字人民币金额转换成大写的脚本程序...

# -*- coding: utf-8 -*- def Num2MoneyFormat( change_number ): """ .转换数字为大写货币格式( format_word.__len__() - 3 2位小数 ) change_number 支持 float, int, long, string """ format_word ["分", "角", &quo…

count数据库优化oracle,迷惑性SQL性能问题排查与优化

:数据科学、人工智能从业者的在线大学。数据科学(Python/R/Julia)数据分析、机器学习、深度学习作者简介戴秋龙,拥有超过八年的电信、保险、税务行业核心系统ORACLE数据库优化,优化经验,具备丰富的行业服务背景。对Oracle数据库有…

python getopt参数参数自动补全_如何在Python中使用getopt / OPTARG?如果给出过多的参数(9),如何转移参数?...

How to use getopt/optarg in Python?解决方案This is an example of how I do it, I usually use the same basic template:import sysimport getopttry:opts, args getopt.getopt(sys.argv[1:], m:p:h, [miner, params, help])except getopt.GetoptError:usage()sys.exit(2…