顾客评价网站,如何再网站上做免费广告词,泉州seo全网营销,韩国风格网站模板下载Python中的顺序表
Python中的list和tuple两种类型采用了顺序表的实现技术#xff0c;具有前面讨论的顺序表的所有性质。
tuple是不可变类型#xff0c;即不变的顺序表#xff0c;因此不支持改变其内部状态的任何操作#xff0c;而其他方面#xff0c;则与list的性质类似。…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的三种方式a. 尾端加入元素时间复杂度为O(1)
b. 非保序的加入元素不常见时间复杂度为O(1)
c. 保序的元素加入时间复杂度为O(n)
删除元素a. 删除表尾元素时间复杂度为O(1)
b. 非保序的元素删除不常见时间复杂度为O(1)
c. 保序的元素删除时间复杂度为O(n)
链表
为什么需要链表
顺序表的构建需要预先知道数据大小来申请连续的存储空间而在进行扩充时又需要进行数据的搬迁所以使用起来并不是很灵活。
链表结构可以充分利用计算机内存空间实现灵活的内存动态管理。
链表的定义
链表Linked list是一种常见的基础数据结构是一种线性表但是不像顺序表一样连续存储数据而是在每一个节点数据存储单元里存放下一个节点的位置信息即地址。链表与顺序表的对比
链表失去了顺序表随机读取的优点同时链表由于增加了结点的指针域空间开销比较大但对存储空间的使用要相对灵活。
链表与顺序表的各种操作复杂度如下所示
操作链表顺序表
访问元素
O(n)
O(1)
在头部插入/删除
O(1)
O(n)
在尾部插入/删除
O(n)
O(1)
在中间插入/删除
O(n)
O(n)
注意虽然表面看起来复杂度都是 O(n)但是链表和顺序表在插入和删除时进行的是完全不同的操作。链表的主要耗时操作是遍历查找删除和插入操作本身的复杂度是O(1)。顺序表查找很快主要耗时的操作是拷贝覆盖。因为除了目标元素在尾部的特殊情况顺序表进行插入和删除时需要对操作点之后的所有元素进行前后移位操作只能通过拷贝和覆盖的方法进行。