网站建设资讯

NEWS

网站建设资讯

python怎么实现跳表SkipList

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

成都创新互联公司于2013年成立,公司以网站建设、成都做网站、系统开发、网络推广、文化传媒、企业宣传、平面广告设计等为主要业务,适用行业近百种。服务企业客户上1000家,涉及国内多个省份客户。拥有多年网站建设开发经验。为企业提供专业的网站建设、创意设计、宣传推广等服务。 通过专业的设计、独特的风格,为不同客户提供各种风格的特色服务。

跳表

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

python怎么实现跳表SkipList

可以发现,对于一个节点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 random

import mkl_random
import time

class 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”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


本文名称:python怎么实现跳表SkipList
文章网址:http://njwzjz.com/article/ijohoe.html