千家信息网

python怎么实现跳表SkipList

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,本篇内容介绍了"python怎么实现跳表SkipList"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成
千家信息网最后更新 2024年11月23日python怎么实现跳表SkipList

本篇内容介绍了"python怎么实现跳表SkipList"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

跳表

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

可以发现,对于一个节点Node,其含有多个next指针,不同索引的next分别代表不同层次的下一个节点,下次是节点类Node的python定义:

class Node():     def __init__(self,key,value,level):         """         :param level:每个node对应的nexts层数不同         """         self.key=key         self.value=value         self.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#用于生成添加节点时的随机level        return    class Node():        def __init__(self,key,value,level):            """            :param level:每个node对应的nexts层数不同            """            self.key=key            self.value=value            self.nexts=[None]*level        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))+"]"    def get(self,key):        """        :param key:        :return: key对应的value        """        self.keyCheck(key)        node=self.__first        for level in range(self.__level - 1,-1,-1):            #在该层查找,key大于节点的key向前查找            while node.nexts[level] and node.nexts[level].key0 and not self.__first.nexts[newLevel - 1]:            newLevel-=1        self.__level=newLevel        return removedNode.value    def keyCheck(self, key):        """        限制传入key不能为空        """        if key!=0 and not key:            raise AttributeError("key can not be None")    def size(self):        return self.__size    def isEmpty(self):        return self.__size == 0    def randomLevel(self):#生成一个随机的层数        level=1        while mkl_random.rand()

"python怎么实现跳表SkipList"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0