前言
这一系列文章将介绍基于python语言的数据结构,主要涉及线性表、字符串、栈和队列、二叉树和树、图、字典和集合、排序等。
线性表及分类
线性表是一类元素序列的抽象,是某类元素的集合,记录着元素之间的顺序关系。python中的list和tuple都支持线性表的需要,只是tuple中元素固定,而list则灵活的多。
顺序表:将表中元素顺序地存储在一大块连续的存储区内,这样实现的表称为顺序表。
链表:将元素存储在由链接构造起来的一系列存储块内,这样实现的表称为链表。
基本操作
创建和访问操作
创建空表:分配存储区,记录表的容量并将元素计数值设为0,创建新表的存储区后,设置信息记录域(max和num),保证表处于合法状态。
加入元素:list.insert(i,x),将元素x插入到第i个位置
删除元素:del list[i],删除第i个元素;list.remove(x),删除值为x的元素
顺序表的优缺点
优点:O(1)时间的按位置访问元素;元素在表里存储紧凑,除表元素存储区外只需要O(1)空间存放少量的辅助信息。
缺点:需要连续存储,一旦确定存储块大小,表的存储容量就确定,更改麻烦,在执行加入和删除操作时,要移动许多元素。
Python中list基本实现
list是一种采用分离式技术实现的动态记录顺序表。
加入元素:list.insert(len(list),x),另一种等价写法:list.append(x)
list的实际策略:建立空表时,系统分配8个元素的存储区;在执行插入操作时,如果元素区满就换一块四倍大的存储区;如果表已经过大,换存储区时容量加倍。
一些操作的主要性质
len(list):计算列表元素个数,O(1)
元素访问,尾端加入和尾端删除都是O(1)操作
一般位置的元素插入、删除、替换、表连接(extend)都是O(n)操作
pop操作删除表尾元素复杂度为O(1),一般元素复杂度为O(n)
list.clear()清除list中所有元素,O(1)操作
list.reverse()元素顺序倒置,复杂度为O(n)
def reverse(self):
elems = self.elements
i, j = 0, len(elems)-1
while i < j:
elems[i], elems[j] = elems[j], elems[i]
i, j = i+1, j-1
list.sort()表中元素排序,最好的排序算法的平均和最坏情况的时间复杂度都是O(nlogn)