久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

python實(shí)現(xiàn)跳表SkipList的示例代碼

瀏覽:3日期:2022-07-28 09:34:31
跳表

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

python實(shí)現(xiàn)跳表SkipList的示例代碼

可以發(fā)現(xiàn),對于一個(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對應(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 randomimport mkl_randomimport timeclass SkipList(): def __init__(self):#頭節(jié)點(diǎn)不存儲任何數(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ī)levelreturn class Node():def __init__(self,key,value,level): ’’’ :param level:每個(gè)node對應(yīng)的nexts層數(shù)不同 ’’’ self.key=key self.value=value self.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對應(yīng)的value’’’self.keyCheck(key)node=self.__firstfor level in range(self.__level - 1,-1,-1): #在該層查找,key大于節(jié)點(diǎn)的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 None def 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=node.nexts[i].valuenode.nexts[i].value=valuereturn oldValue prev[i]=node#保存當(dāng)前l(fā)evel小于key的nodenewLevel=self.randomLevel()newNode=SkipList.Node(key,value,newLevel)for i in range(newLevel): if i<self.__level:newNode.nexts[i]=prev[i].nexts[i]prev[i].nexts[i]=newNode else:self.__first.nexts[i]=newNodeself.__size+=1self.__level=max(self.__level, newLevel)return None def remove(self,key):’’’:return: 節(jié)點(diǎn)對應(yīng)的value值,不存在則返回None’’’self.keyCheck(key)prev=[None]*self.__levelnode=self.__firstflag=False#該節(jié)點(diǎn)是否被查找到for 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].key==key:flag=True prev[i]=nodeif not flag: return NoneremovedNode=node.nexts[0]#需要被刪除的節(jié)點(diǎn)for i in range(len(removedNode.nexts)):#該nexts一定小于等于prev的長度 prev[i].next[i]=removedNode.nexts[i]self.__size-=1newLevel=self.__levelwhile newLevel>0 and not self.__first.nexts[newLevel - 1]: newLevel-=1self.__level=newLevelreturn 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=1while mkl_random.rand()<self.__p and level<self.MAX_LEVEL: level+=1return level def __str__(self):result=''for i in range(self.__level - 1, -1, -1): result+=str(i) node = self.__first while node.nexts[i]:result+=str(node.nexts[i])node=node.nexts[i] result+=’n’print('level:'+str(self.__level))return result def showFirst(self):for item in self.__first.nexts: print(item,end=’ ’)print()def timeCalculate(container, size:int): begin=time.time() for i in range(size):if isinstance(container,dict): container[i]= i * 3else: container.put(i, i * 3) error_count = 0 for i in range(size):if container.get(i) != i * 3: #print('wrong ' + str(i) + ':' + str(skipList.get(i))) error_count+=1 end=time.time() print(type(container)) print(f’error rate:{float(error_count) / size:0.5f}’) print(f’time cost:{float(end-begin)*1000:0.3f} ms’)if __name__==’__main__’: timeCalculate({},1000000) timeCalculate(SkipList(),10000)

到此這篇關(guān)于python實(shí)現(xiàn)跳表SkipList的文章就介紹到這了,更多相關(guān)python 跳表SkipList內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 人人干美女| 国产精品久久久久一区二区三区 | 51ⅴ精品国产91久久久久久 | 在线免费观看成年人视频 | 亚洲成av人片一区二区梦乃 | 日韩欧美在线视频 | 日本在线视频观看 | 中文字幕日本视频 | 中文字幕视频三区 | 天堂一区 | 91精品久久久久久久 | 人人草人人干 | 天堂资源网 | 色九九| 国产精品999 | 91精品国产九九九久久久亚洲 | 日韩av视屏| av一区二区三区 | 国产综合区 | 久久综合九色综合欧美狠狠 | 91.xxx.高清在线 | 欧美日韩国产一区二区在线观看 | 国产1级片 | 国产在线2| 一区二区三区影院 | 欧美国产日韩一区 | 国产成人在线一区二区 | 国产视频久久久 | 最新黄色网页 | 一本一道久久久a久久久精品91 | 欧美精品一区在线观看 | 欧美日韩精品一区二区三区四区 | 天天天干天天天操 | 爱草在线| 蜜桃精品在线观看 | 一本大道综合伊人精品热热 | 精品久久影院 | 欧日韩免费 | 国产美女精品一区二区三区 | 久久国产精品久久 | 91精品国产综合久久久久久丝袜 |