顺序表
顺序表,将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示。
数据元素本身连续存储,每个元素所占的存储单元大小固定相同,元素的下标是其逻辑地址,而元素存储的物理地址(实际内存地址)可以通过存储区的起始地址Loc (e0)加上逻辑地址(第i个元素)与存储单元大小(c)的乘积计算而得,即:Loc(ei) = Loc(e0) + c*i,时间复杂度为O(1)。
如果元素的大小不统一,则须采用图b的元素外置的形式,将实际数据元素另行存储,而顺序表中各单元位置保存对应元素的地址信息(即链接)
顺序表完整信息=元素集合+整体情况信息【元素个数+容量】
顺序表的两种实现方式:
一体式:完整信息在一个表中
分离式:表中只存整体情况信息,外链实际元素集合;动态顺序表:容量可以在使用中动态变化
顺序表的操作:增加和删除,各分为尾部O(1)、非保序O(1)、保序O(n)
python中list和tuple,更多是用list,分离式技术实现的动态顺序表
ist实现采用了如下的策略:在建立空表(或者很小的表)时,系统分配一块能容纳8个元素的存储区;在执行插入操作(insert或append)时,如果元素存储区满就换一块4倍大的存储区。但如果此时的表已经很大(目前的阀值为50000),则改变策略,采用加一倍的方法。引入这种改变策略的方式,是为了避免出现过多空闲的存储位置。
单向链表
创建一个链表中的节点类(item,next)
class Node():
def __init__(self,item):#节点初始条件有值
self.item=item
self.next=None
#创建链表的类
class SingleLink():
#初始化,给定链表的头部属性
def __init__(self,node=None):
self.__head=node
#判断链表是否为空,即判断链表的head指针是否指向空
def is_empty(self):
return self.__head==None #为None返回True,不为None,False
#判断链表的长度
def length(self):
if self.is_empty():
return 0
else:
currentnode=self.__head #代表currentnode指向当前节点的游标与head指针指向同一个节点
lengthcount=1#对比注释部分另一个方法,lengthcount=0
while currentnode.next!=None:
lengthcount+=1
currentnode=currentnode.next
return lengthcount
#遍历整个链表
def travel(self):
if self.is_empty():
return None
else:
allitemlist = []
currentnode = self.__head
allitemlist.append(currentnode.item)#先加入第一个
while currentnode.next != None:
currentnode = currentnode.next#尽管最后一个currentnode.next==None,但已经加入过
allitemlist.append(currentnode.item)
return allitemlist
#链表头部加入元素
def a