python实现跳表SkipList的示例代码

python实现跳表SkipList的示例代码,博智网带你了解详细信息 。
跳表跳表 , 又叫做跳跃表、跳跃列表 , 在有序链表的基础上增加了“跳跃”的功能 , 由William Pugh于1990年发布 , 设计的初衷是为了取代平衡树(比如红黑树) 。
Redis、LevelDB 都是著名的 Key-Value 数据库 , 而Redis中 的 SortedSet、LevelDB 中的 MemTable 都用到了跳表 。
对比平衡树 , 跳表的实现和维护会更加简单 , 跳表的搜索、删除、添加的平均时间复杂度是 O(logn) 。
跳表的结构如图所示:

python实现跳表SkipList的示例代码


python实现跳表SkipList的示例代码


【python实现跳表SkipList的示例代码】可以发现 , 对于一个节点Node , 其含有多个next指针 , 不同索引的next分别代表不同层次的下一个节点 , 下次是节点类Node的python定义:
class Node():def __init__(self,key,value,level):''':param level:每个node对应的nexts层数不同'''self.key=keyself.value=https://www.yf-zs.com/redian/valueself.nexts=[None]*level#节点类型next指针 , 初始值为空def __str__(self):#return"[key:"+str(self.key)+", value:"+str(self.value)+" len:"+str(len(self.nexts))+"]"return "["+str(self.key)+","+str(self.value)+","+str(len(self.nexts))+"]"
关于添加、删除、查找见一下完整代码:
'''跳表 Skip List  , 其初衷是为了替代红黑树'''import randomimport mkl_randomimport timeclass SkipList():def __init__(self):#头节点不存储任何数据self.MAX_LEVEL = 32# 最大level层数self.__first=SkipList.Node(None, None, self.MAX_LEVEL)#头节点self.__level=0#实际的level层数self.__size=0#Jiedian个数self.__p=0.25#用于生成添加节点时的随机levelreturnclass Node():def __init__(self,key,value,level):''':param level:每个node对应的nexts层数不同'''self.key=keyself.value=https://www.yf-zs.com/redian/valueself.nexts=[None]*leveldef __str__(self):#return"[key:"+str(self.key)+", value:"+str(self.value)+" len:"+str(len(self.nexts))+"]"return "["+str(self.key)+","+str(self.value)+","+str(len(self.nexts))+"]"def get(self,key):''':param key::return: key对应的value'''self.keyCheck(key)node=self.__firstfor level in range(self.__level - 1,-1,-1):#在该层查找 , key大于节点的key向前查找while node.nexts[level] and node.nexts[level].key<key:node=node.nexts[level]if node.nexts[level] and node.nexts[level].key==key:#相等则找到 , 否则向下寻找return node.nexts[level].valuereturn Nonedef put(self,key,value):'''return:原来的value , 原来不存在key则为空'''self.keyCheck(key)prev=[None]*self.__levelnode=self.__firstfor i in range(self.__level - 1, -1, -1):while node.nexts[i] and node.nexts[i].key<key:node=node.nexts[i]if node.nexts[i] and node.nexts[i].key==key:oldValue=https://www.yf-zs.com/redian/node.nexts[i].valuenode.nexts[i].value=valuereturn oldValueprev[i]=node#保存当前level小于key的nodenewLevel=self.randomLevel()newNode=SkipList.Node(key,value,newLevel)for i in range(newLevel):if i

推荐阅读