实现:
原理什么的别人的博客有很多,我这就给个链接。
数据结构—–跳表
跳表 skiplist
使用一个类表示跳表的节点
#跳跃表节点的类
class SNode:
def __init__(self,key=None,value=None):
#键
self.key=key
#index表示数组中最末的元素
self.maxIndex=-1
#link使用一个数组 存放全部下节点的索引 link[i]表示第i层的索引
self.link=[]
self.value=value
跳表类 的构造方法
class SkipList:
def __init__(self,size=8,larger=65535):
#深度
self.size = size
'''
跳跃表的深度和你的数据有关 大约为 log n
'''
#尾节点指针
self.tial=SNode()
#头结点指针 存放头结点
self.head=SNode()
#存放在插入和删除操作中 每一个链上遇到的最后节点
self.last=[]
self.tial.key=larger#表示尾节点
self.head.key=-65535#表示节点
#头结点的全部指针指向尾节点
for i in range(self.size):
self.head.link.append(self.tial)
self.MAX_RAND=self.size
由于跳表的节点高度是随机的 要用一个函数 确定
#随机分配层数 但是不会超过最大层数
def randomDispenseLevel(self):
level=1
while random.randint(0,1)==1:
level+=1
return level if level<=self.MAX_RAND else self.MAX_RAND
last数组用来保存动态操作(插入和删除) 某节点后该节点前面的节点
#获取last数组里的值
def getLast(self,data):
#print(data)
num = self.size - 1 #数组存储时是自底向上 查找是自顶向下 所以num表示层数
p = self.head
while num >= 0:
while p.link[num].key <data:#和进行一次查找一样 如果小于,说明这个节点是待动态操作节点的前一个节点
p = p.link[num]
num -= 1
self.last.append(p if p != None else self.head)#如果节点不是空就加入last里
return self.last[len(self.last)-1]#p指向最底层的节点
查找
def find(self,data):
FLAGE=False#标准位 查询是否成功
temp=self.head #temp开始存放头指针
i=self.size-1 #i是最大长度-1 因为是从上往下找
while i>=0: #如果没有越界
if temp.link[i].key==self.tial.key:#如果到达最后的尾指针 说明当前层没有要找的节点
i-=1
continue
if temp.link[i].key<data:#如果小于待查找的数据 说明要将节点切换到下一个节点
temp=temp.link[i]
i=len(temp.link)-1
elif temp.link[i].key==data:#如果相等说明找到了
FLAGE=True
return temp.link[i],FLAGE
else:
if i>0:#如果没找到 切没有到最后一层 直接下降一层
i-=1
else:
return temp,FLAGE
return temp,FLAGE
插入
def