真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python怎么實(shí)現(xiàn)跳表SkipList

本篇內(nèi)容介紹了“python怎么實(shí)現(xiàn)跳表SkipList”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

成都創(chuàng)新互聯(lián)公司于2013年成立,公司以網(wǎng)站建設(shè)、成都做網(wǎng)站、系統(tǒng)開發(fā)、網(wǎng)絡(luò)推廣、文化傳媒、企業(yè)宣傳、平面廣告設(shè)計(jì)等為主要業(yè)務(wù),適用行業(yè)近百種。服務(wù)企業(yè)客戶上1000家,涉及國內(nèi)多個(gè)省份客戶。擁有多年網(wǎng)站建設(shè)開發(fā)經(jīng)驗(yàn)。為企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、創(chuàng)意設(shè)計(jì)、宣傳推廣等服務(wù)。 通過專業(yè)的設(shè)計(jì)、獨(dú)特的風(fēng)格,為不同客戶提供各種風(fēng)格的特色服務(wù)。

跳表

跳表,又叫做跳躍表、跳躍列表,在有序鏈表的基礎(chǔ)上增加了“跳躍”的功能,由William Pugh于1990年發(fā)布,設(shè)計(jì)的初衷是為了取代平衡樹(比如紅黑樹)。
redis、LevelDB 都是著名的 Key-Value 數(shù)據(jù)庫,而Redis中 的 SortedSet、LevelDB 中的 MemTable 都用到了跳表。
對(duì)比平衡樹,跳表的實(shí)現(xiàn)和維護(hù)會(huì)更加簡(jiǎn)單,跳表的搜索、刪除、添加的平均時(shí)間復(fù)雜度是 O(logn)。
跳表的結(jié)構(gòu)如圖所示:

python怎么實(shí)現(xiàn)跳表SkipList

可以發(fā)現(xiàn),對(duì)于一個(gè)節(jié)點(diǎn)Node,其含有多個(gè)next指針,不同索引的next分別代表不同層次的下一個(gè)節(jié)點(diǎn),下次是節(jié)點(diǎn)類Node的python定義:

class Node():
     def __init__(self,key,value,level):
         """
         :param level:每個(gè)node對(duì)應(yīng)的nexts層數(shù)不同
         """
         self.key=key
         self.value=value
         self.nexts=[None]*level#節(jié)點(diǎn)類型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))+"]"

關(guān)于添加、刪除、查找見一下完整代碼:

"""
跳表 Skip List ,其初衷是為了替代紅黑樹
"""
import random

import mkl_random
import time

class SkipList():
    def __init__(self):
        #頭節(jié)點(diǎn)不存儲(chǔ)任何數(shù)據(jù)
        self.MAX_LEVEL = 32  # 最大level層數(shù)
        self.__first=SkipList.Node(None, None, self.MAX_LEVEL)#頭節(jié)點(diǎn)
        self.__level=0#實(shí)際的level層數(shù)
        self.__size=0#Jiedian個(gè)數(shù)
        self.__p=0.25#用于生成添加節(jié)點(diǎn)時(shí)的隨機(jī)level
        return

    class Node():
        def __init__(self,key,value,level):
            """
            :param level:每個(gè)node對(duì)應(yīng)的nexts層數(shù)不同
            """
            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對(duì)應(yīng)的value
        """
        self.keyCheck(key)
        node=self.__first
        for level in range(self.__level - 1,-1,-1):
            #在該層查找,key大于節(jié)點(diǎn)的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):#生成一個(gè)隨機(jī)的層數(shù)
        level=1
        while mkl_random.rand()

“python怎么實(shí)現(xiàn)跳表SkipList”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!


分享標(biāo)題:python怎么實(shí)現(xiàn)跳表SkipList
分享鏈接:http://weahome.cn/article/ijohoe.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部