精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Python高級算法與數據結構:使用treap實現雙索引之一

開發 后端 大數據 算法
前面介紹的堆結構只能對數據進行部分排序,也就是它只能知道部分元素的排序,例如從根節點出發,沿著左孩子或右孩子前行,我們能得知所遍歷的元素一定是遞增(小堆)或是遞減(大堆)關系,但是我們無法得知左子樹與右子樹兩部分節點的排序關系。

\

前面介紹的堆結構只能對數據進行部分排序,也就是它只能知道部分元素的排序,例如從根節點出發,沿著左孩子或右孩子前行,我們能得知所遍歷的元素一定是遞增(小堆)或是遞減(大堆)關系,但是我們無法得知左子樹與右子樹兩部分節點的排序關系。

在很多應用場景下,我們不但需要堆的特性,例如快速知道數據最大值或最小值,同時還需要知道元素的排序信息,因此本節我們看看如何實現魚和熊掌如何兼得。假設我們有一系列數據,它的元素由兩部分組成,一部分對應商品的名稱,其類型為字符串,一部分對應商品的貨存數量,類型為整形,我們既需要將商品根據其名稱排序,同時我們又需要快速查詢當前貨存最小的商品,我們如何設計相應的算法和數據結構來滿足這樣特性呢。

舉個例子,如下圖:

從上圖看,它對應元素字符串是排序二叉樹,因此根節點左子樹對應元素的字符串都小于根字符串,同時右子樹對應的字符串都大于根節點字符串,同時每個元素還對應著相應商品的貨存數量,我們需要及時掌握當前貨存最少的商品,這樣才能在其耗盡之前迅速補貨。但是從上圖可以看到,要保證字符串的排序性就得犧牲對于商品數量的小堆性質,例如上圖中water對應的貨存與wine對應的貨存違背了小堆的性質,現在問題是如何在保證字符串排序的情況下,確保數量同時能滿足小堆性質。

首先我們先定義一下數據結構:

  1. class Node: 
  2.     def __init__(self, key: str, priority: float): 
  3.         self._key = key 
  4.         self._priority = priority 
  5.         self._left: Node = None 
  6.         self._right: Node = None 
  7.         self._parent: Node = None 
  8.  
  9.     @property 
  10.     def left(self): 
  11.         return self._left 
  12.  
  13.     @property 
  14.     def right(self): 
  15.         return self._right 
  16.  
  17.     @property 
  18.     def parent(self): 
  19.         return self._parent 
  20.  
  21.     @left.setter 
  22.     def left(self, node): 
  23.         self._left = node 
  24.         if node is not None: 
  25.             node.parent = self 
  26.  
  27.     @right.setter 
  28.     def right(self, node): 
  29.         self._right = node 
  30.         if node is not None: 
  31.             node.parent = self 
  32.  
  33.     @parent.setter 
  34.     def parent(self, node): 
  35.         self._parent = node 
  36.  
  37.     def is_root(self) -> bool: 
  38.         if self.parent is None: 
  39.             return True 
  40.         return False 
  41.  
  42.     def __repr__(self): 
  43.         return "({}, {})".format(self._key, self._priority) 
  44.  
  45.     def __str__(self): 
  46.         repr_str: str = "" 
  47.         repr_str += repr(self) 
  48.         if self.parent is not None: 
  49.             repr_str += " parent: " + repr(self.parent) 
  50.         else
  51.             repr_str += " parent: None" 
  52.  
  53.         if self.left is not None: 
  54.             repr_str += " left: " + repr(self.left
  55.         else
  56.             repr_str += " left: None" 
  57.  
  58.         if self.right is not None: 
  59.             repr_str += " right: " + repr(self.right
  60.         else
  61.             repr_str += " right: None" 
  62.  
  63.         return repr_str 
  64.  
  65. class Treap: 
  66.     def  __init__(self): 
  67.         self.root : Node = None 

當前問題是,當上圖所示的矛盾出現時,我們如何調整,使得字符串依然保持排序性質,同時貨存數值能滿足小堆性質。我們需要根據幾種情況采取不同操作,首先看第一種,如下圖:

從上圖看到,一種情況是父節點與左孩子在數值上違背了堆的性質,此時我們執行一種叫右旋轉操作,其步驟是,1,Beer節點逆時針旋轉,替換其父節點;2,父節點Cabbage順時針旋轉,成為Beer的右孩子節點;3,原來Beer的右孩子節點轉變為Cabbage的左孩子節點;完成后結果如下圖所示:

可以看到,此時字符串依然保持排序二叉樹性質,同時數值對應的小堆性質也得到了滿足。我們看看代碼實現:

  1. class Treap: 
  2.     def __init__(self): 
  3.         self._root: Node = None 
  4.  
  5.     def right_rotate(self, x: Node): 
  6.         if x is None or x.is_root() is True
  7.             return 
  8.  
  9.         y = x.parent 
  10.         if y.left != x:  # 必須是左孩子才能右旋轉 
  11.             return 
  12.  
  13.         p = y.parent 
  14.         if p is not None:  # 執行右旋轉 
  15.             if p.left == y: 
  16.                 p.left = x 
  17.             else
  18.                 p.right = x 
  19.         else
  20.             self._root = x 
  21.  
  22.         y.left = x.right 
  23.         x.right = y 

接下來我們構造一些數據測試一下上面的實現是否正確:

  1. def setup_right_rotate(): 
  2.     flour: Node = Node("Flour", 10) 
  3.     cabbage: Node = Node("Cabbage", 77) 
  4.     beer: Node = Node("Beer", 76) 
  5.     bacon: Node = Node("Bacon", 95) 
  6.     butter: Node = Node("Butter", 86) 
  7.  
  8.     flour.parent = None 
  9.     flour.left = cabbage 
  10.     flour.right = None 
  11.     cabbage.left = beer 
  12.  
  13.  
  14.     beer.left = bacon 
  15.     beer.right = butter 
  16.  
  17.     return flour, beer 
  18.  
  19. def print_treap(n: Node): 
  20.     if n is None: 
  21.         return 
  22.  
  23.     print(n) 
  24.     print_treap(n.left
  25.     print_treap(n.right
  26.  
  27. treap = Treap() 
  28. root, x , cabbage = setup_right_rotate() 
  29. print("---------before right rotate---------:"
  30. print_treap(root) 
  31. treap.right_rotate(x) 
  32. print("-------after right rotate-------"
  33. print_treap(root) 

上面代碼執行后輸出內容如下:

  1. ---------before right rotate---------: 
  2. (Flour, 10) parent: None left: (Cabbage, 77) right: None 
  3. (Cabbage, 77) parent: (Flour, 10) left: (Beer, 76) right: (Eggs, 129) 
  4. (Beer, 76) parent: (Cabbage, 77) left: (Bacon, 95) right: (Butter, 86) 
  5. (Bacon, 95) parent: (Beer, 76) left: None right: None 
  6. (Butter, 86) parent: (Beer, 76) left: None right: None 
  7. (Eggs, 129) parent: (Cabbage, 77) left: None right: None 
  8. -------after right rotate------- 
  9. (Flour, 10) parent: None left: (Beer, 76) right: None 
  10. (Beer, 76) parent: (Flour, 10) left: (Bacon, 95) right: (Cabbage, 77) 
  11. (Bacon, 95) parent: (Beer, 76) left: None right: None 
  12. (Cabbage, 77) parent: (Beer, 76) left: (Butter, 86) right: (Eggs, 129) 
  13. (Butter, 86) parent: (Cabbage, 77) left: None right: None 
  14. (Eggs, 129) parent: (Cabbage, 77) left: None right: None 

對比右旋轉前后輸出的二叉樹看,旋轉后的二叉樹打印信息的確跟上面我們旋轉后對應的圖像是一致的。接下來我們實現左旋轉,先把上圖中cabbage節點對應的值改成75,這樣它與父節點就違背了小堆性質:

我們要做的是:1,把cabbage節點向“左”旋轉到beer的位置;2,beer的父節點設置為cabbage;3:beer的右孩子設置為cabbage的左孩子;4,cabbage的左孩子變成beer;左旋轉后二叉樹應該成形如下:

從上圖看,左旋轉后,字符串依然保持二叉樹排序性,同時數值的排放也遵守小堆原則,我們看相應的代碼實現:

  1. class Treap: 
  2.    ... 
  3.  
  4.     def left_rotate(self, x : Node): 
  5.         if x is None or x.is_root() is True
  6.             return 
  7.  
  8.         y = x.parent 
  9.         if y.right is not x: # 只有右孩子才能左旋轉 
  10.             return 
  11.  
  12.         p = y.parent 
  13.         if p is not None: 
  14.             if p.left is y: 
  15.                 p.left = x 
  16.             else
  17.                 p.right = x 
  18.         else
  19.             self._root = x 
  20.  
  21.         y.right = x.left 
  22.         x.left = y 

為了測試上面代碼實現,我們首先把cabbage的值修改,然后調用上面代碼:

  1. cabbage._priority = 75 
  2. print("-------before left rotate--------"
  3. print_treap(root) 
  4. treap.left_rotate(cabbage) 
  5. print("-------after left rotate---------"
  6. print_treap(root) 

代碼運行后輸出結果為:

  1. -------before left rotate-------- 
  2. (Flour, 10) parent: None left: (Beer, 76) right: None 
  3. (Beer, 76) parent: (Flour, 10) left: (Bacon, 95) right: (Cabbage, 75) 
  4. (Bacon, 95) parent: (Beer, 76) left: None right: None 
  5. (Cabbage, 75) parent: (Beer, 76) left: (Butter, 86) right: (Eggs, 129) 
  6. (Butter, 86) parent: (Cabbage, 75) left: None right: None 
  7. (Eggs, 129) parent: (Cabbage, 75) left: None right: None 
  8. -------after left rotate--------- 
  9. (Flour, 10) parent: None left: (Cabbage, 75) right: None 
  10. (Cabbage, 75) parent: (Flour, 10) left: (Beer, 76) right: (Eggs, 129) 
  11. (Beer, 76) parent: (Cabbage, 75) left: (Bacon, 95) right: (Butter, 86) 
  12. (Bacon, 95) parent: (Beer, 76) left: None right: None 
  13. (Butter, 86) parent: (Beer, 76) left: None right: None 
  14. (Eggs, 129) parent: (Cabbage, 75) left: None right: None 

輸出結果的描述與上圖左旋轉后的結果是一致的。由于Treap相對于元素的key是排序二叉樹,因此在給定一個字符串后,我們很容易查詢字符串是否在Treap中,其本質就是排序二叉樹的搜索,其實現我們暫時忽略。

雖然查詢很簡單,但是插入節點則稍微麻煩,因為插入后,新節點與其父節點可能會違背小堆性質,因此在完成插入后,我們還需使用上面實現的左旋轉或右旋轉來進行調整。

 

責任編輯:武曉燕 來源: Coding迪斯尼
相關推薦

2023-09-25 12:23:18

Python

2020-10-21 14:57:04

數據結構算法圖形

2011-07-11 15:03:36

MySQL索引數據結構

2023-03-08 08:03:09

數據結構算法歸并排序

2023-10-27 07:04:20

2021-07-15 06:43:12

Python數據結構

2023-03-07 08:02:07

數據結構算法數列

2023-03-02 08:15:13

2023-03-10 08:07:39

數據結構算法計數排序

2022-01-09 17:41:37

python算法

2023-04-27 09:13:20

排序算法數據結構

2023-10-06 20:21:28

Python鏈表

2023-02-08 07:52:36

跳躍表數據結構

2023-10-30 08:31:42

數據結構算法

2023-03-13 10:08:31

數據結構算法

2023-11-06 06:43:23

單鏈表查詢數據結構

2023-09-15 10:33:41

算法數據結構

2017-08-31 09:45:43

JavaArrayList數據

2021-05-12 09:07:09

Java數據結構算法

2011-07-11 16:05:42

MySQL索引
點贊
收藏

51CTO技術棧公眾號

免费中文字幕在线观看| 亚洲精品成人在线播放| 理论在线观看| 久久草av在线| 欧美精品国产精品日韩精品| 自拍视频一区二区| 激情小说亚洲| 亚洲成人在线网站| 五月天色一区| 亚洲第一页视频| 久久久夜夜夜| 欧美精品在线观看91| 丰满大乳奶做爰ⅹxx视频| 国精品产品一区| 亚洲成在线观看| 日韩亚洲不卡在线| 国产人妖一区二区| 首页国产欧美日韩丝袜| 欧美激情国产精品| 免费一级黄色录像| 国产成人夜色高潮福利影视| 欧美色涩在线第一页| av女优在线播放| 美女羞羞视频在线观看| 成人av电影在线| 国产日韩精品电影| 日本一区二区三区精品| 国产精品久久| 久久精品国产成人精品| 大又大又粗又硬又爽少妇毛片| 日韩激情综合| 欧美乱妇20p| 国产精品拍拍拍| 色网在线免费观看| 亚洲综合久久久久| 欧美日韩一级在线| 在线观看a视频| 久久久亚洲午夜电影| 国产一区福利视频| 亚洲国产综合网| 国产中文字幕一区| 国产精品自拍网| 伊人网中文字幕| 久久精品日韩欧美| 2021国产精品视频| 日韩欧美三级在线观看| 亚洲视频日本| 欧美精品激情视频| 欧美成人免费看| 亚洲国产日韩欧美在线| 精品国产一区二区三区久久久狼 | 激情综合色丁香一区二区| 日本一区二区在线免费播放| 少妇一级淫片免费放中国| 亚洲成人原创| 国内精品久久久久久影视8| 亚洲精品在线观看av| 狠狠色狠狠色综合日日tαg| 久久99久久99精品中文字幕 | 午夜精品影院| 久久69精品久久久久久久电影好| 永久免费看片直接| 欧美精品综合| 国内自拍欧美激情| 久久国产视频播放| 久久国产一二区| 国产精品99导航| 少妇又紧又色又爽又刺激视频 | 天堂av.com| 久久久久久久久成人| 日韩一区二区麻豆国产| 精品国产乱码久久久久夜深人妻| aaa国产精品| 精品少妇一区二区三区免费观看| 永久免费未满蜜桃| 偷拍亚洲精品| 中文字幕亚洲图片| 日韩视频中文字幕在线观看| 影音先锋在线一区| 日本欧美中文字幕| 在线观看黄色网| 国产专区欧美精品| 精品一区二区三区日本| 高清福利在线观看| 亚洲美腿欧美偷拍| 欧美一区二区三区爽大粗免费| 欧美电影免费观看| 欧美二区乱c少妇| xxxwww国产| 精品免费在线| 久久99久久亚洲国产| 国产午夜性春猛交ⅹxxx| 日本色综合中文字幕| 91成人伦理在线电影| 天天射天天色天天干| 国产精品天美传媒沈樵| 亚洲高潮无码久久| 91av亚洲| 日韩欧美国产一区二区三区| 丝袜美腿中文字幕| 欧美成人高清| 国产精品久久久久久av| 黄色片一区二区三区| 国产日韩欧美精品一区| 免费网站永久免费观看| 欧美日韩激情电影| 精品国产一区二区精华| 成人一级片免费看| 日韩一区二区久久| 91在线精品播放| 国产系列电影在线播放网址| 亚洲国产一二三| 天天爽夜夜爽一区二区三区| 国产精品香蕉| 久久久国产一区二区三区| av黄色在线播放| 国产高清不卡一区二区| 五月天丁香综合久久国产 | 偷偷www综合久久久久久久| 91精品国产91久久久久久最新| 国产免费无遮挡| 国产日韩精品视频一区| 日韩中字在线观看| 久久丁香四色| 日韩视频永久免费观看| 91视频久久久| 91在线看国产| 欧美日韩不卡在线视频| 日韩最新av| 久久视频免费在线播放| 最近中文字幕在线视频| 91美女视频网站| 国产精品专区在线| 国产在线播放精品| 久久久欧美精品| 亚洲爱爱综合网| 亚洲美女屁股眼交| 在线观看av免费观看| 欧美mv日韩| 国产精品永久在线| www 日韩| 欧美亚日韩国产aⅴ精品中极品| www.色多多| 99视频一区| 国内外成人免费视频| 国产偷倩在线播放| 精品国产免费人成在线观看| 免费中文字幕视频| 国产a区久久久| 久草视频这里只有精品| 涩涩屋成人免费视频软件| 久久综合久久八八| 99在线精品视频免费观看20| 亚洲人成在线播放网站岛国| 亚洲欧美手机在线| 91成人观看| 51精品国产人成在线观看| 69xxx在线| 精品日产卡一卡二卡麻豆| 国产av 一区二区三区| 国产剧情一区二区| 国产精品www在线观看| 精品成人自拍视频| 日本成人黄色片| 成年人在线视频免费观看| 欧美日韩一区小说| 99久久婷婷国产综合| 国产成人av电影| 少妇无码av无码专区在线观看 | 亚洲精品福利视频| 天堂中文字幕在线观看| 中文天堂在线一区| 日本少妇激三级做爰在线| 国产精品激情电影| 欧美精品二区三区四区免费看视频 | 蜜桃一区av| 国产成人精品免费视频| 麻豆网站视频在线观看| 欧美mv日韩mv亚洲| 黄瓜视频在线免费观看| 中文字幕一区二| 秘密基地免费观看完整版中文 | 波多野结衣在线观看一区二区| 国产精品色悠悠| 手机av免费在线| 国产视频亚洲视频| 91精品中文字幕| 亚洲一级不卡视频| 国产在线综合视频| 粉嫩aⅴ一区二区三区四区| 国内外成人免费激情视频| 日韩精品诱惑一区?区三区| 91丨九色丨国产| 免费福利视频一区二区三区| 久久亚洲精品小早川怜子66| 欧美特黄一级视频| 欧美日韩亚洲综合| 日本少妇激情视频| 国产精品不卡一区| 国产夫妻性爱视频| 国产精品夜夜嗨| 国产日韩成人内射视频| 伊人久久大香线蕉综合热线 | 亚洲av无码一区二区三区网址| 日韩电影在线观看网站| 久久人人爽人人爽人人av| 精品国产一区探花在线观看| 福利视频久久| 日韩一区二区三区四区五区| 97超级碰碰碰| 在线h片观看| 国产一区二区三区视频在线观看| 亚洲风情第一页| 欧美另类videos死尸| 久久中文字幕免费| 亚洲一区二区三区国产| 黑人狂躁日本娇小| 国产丝袜美腿一区二区三区| 亚洲av永久无码精品| 国产麻豆精品久久一二三| 一区二区三区视频在线观看免费| 一本久久综合| 久久久久久av无码免费网站下载| 久久裸体网站| 五月婷婷一区| 色综合综合色| 久久久久九九九| 在线观看视频一区二区三区| 91精品久久久久久久| 欧美精品资源| 日本久久91av| 色是在线视频| 97在线免费视频| 国产91足控脚交在线观看| 久久亚洲国产精品成人av秋霞| caoporn国产精品免费视频| 亚洲精品影视在线观看| 天堂v视频永久在线播放| 精品成人a区在线观看| 不卡的日韩av| 日韩视频国产视频| 成人激情四射网| 日韩精品专区在线| 狠狠躁夜夜躁av无码中文幕| 日韩女优毛片在线| 亚洲不卡免费视频| 欧美大片一区二区| 丰满人妻一区二区三区四区53| 欧美一区二区精品久久911| 国产精品国产一区二区三区四区| 欧美艳星brazzers| 伊人网视频在线| 欧美丰满美乳xxx高潮www| 国产女人18毛片水真多| 91精品视频网| 开心激情综合网| 日韩精品999| 丁香婷婷在线| 久久激情视频久久| 91cn在线观看| 97欧美精品一区二区三区| 性爽视频在线| 国产精品av在线播放| 高清欧美日韩| 91九色对白| 国产精品成人自拍| 老牛影视免费一区二区| 欧美老女人另类| 国产精品12p| 韩国久久久久| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 久久综合九色| 九九热精品在线播放| 国产高清在线观看免费不卡| 中文字幕影片免费在线观看| 久久精品免费在线观看| 午夜激情视频在线播放| 一区二区三区在线看| www.av麻豆| 欧美性受xxxx黑人xyx| 国产草草影院ccyycom| 亚洲国产精品高清久久久| 久草视频视频在线播放| 久久躁日日躁aaaaxxxx| 123区在线| 国产精品一区二区三区免费视频| 精品视频一二| 免费一区二区三区在在线视频| 日韩精品欧美| 青青青青草视频| 美女一区二区三区在线观看| 色悠悠在线视频| 国产午夜精品福利| 久久久www成人免费毛片| 日本乱人伦一区| www.日韩在线观看| 国产亚洲视频在线| 丰满大乳少妇在线观看网站| 国产va免费精品高清在线观看| 日本亚州欧洲精品不卡| 欧美激情视频一区二区三区| 欧美国产三区| 黄色三级视频片| 成人av在线一区二区三区| 五月天婷婷丁香网| 欧美日韩加勒比精品一区| 国产精品一品二区三区的使用体验| 亚洲国产精品小视频| 麻豆网站视频在线观看| 国产精欧美一区二区三区| 成人午夜三级| 黄色一级片网址| 日韩在线一二三区| 久久精品女同亚洲女同13| 亚洲人成影院在线观看| 国产精华7777777| 亚洲免费视频观看| 蜜乳av一区| 亚洲最大福利视频| 久久要要av| 欧美日韩怡红院| 99re热这里只有精品视频| 精品99在线观看| 777色狠狠一区二区三区| 国产一区二区三区不卡在线| 91黑丝在线观看| 国产成人福利av| 国产美女永久无遮挡| 激情五月婷婷综合| 成人无码精品1区2区3区免费看 | 久久精品视频91| 91免费在线视频观看| 精品无码人妻一区二区三| 欧美一区日韩一区| 麻豆tv入口在线看| 国产日韩欧美91| 色综合久久一区二区三区| 99久久激情视频| 久久看人人爽人人| 天堂在线免费观看视频| 日韩美女av在线| 国产拍在线视频| 精品国产乱码一区二区三区四区 | 国产精品自产拍| 日韩中文在线中文网三级| 日韩中文视频| 色噜噜一区二区| 久久av中文字幕片| 69夜色精品国产69乱| 91精品国产手机| 大片免费在线观看| 91久久极品少妇xxxxⅹ软件| 欧美三级视频| av2014天堂网| 色综合色综合色综合色综合色综合| 色鬼7777久久| 国产精品第1页| 日韩中文在线电影| 6080国产精品| 亚洲一级不卡视频| 美女的奶胸大爽爽大片| 成人免费av网站| 久久精品一区二区三| 欧美tickling网站挠脚心| 调教一区二区| 国产九色精品| 亚洲一区网站| 久久视频精品在线观看| 在线不卡a资源高清| 一色桃子av在线| 韩日午夜在线资源一区二区| 午夜亚洲视频| 女女互磨互喷水高潮les呻吟| 欧美在线观看视频一区二区| 麻豆传媒视频在线观看免费| 国产chinese精品一区二区| 亚洲作爱视频| 熟女少妇内射日韩亚洲| 3d成人h动漫网站入口| 国产丝袜在线观看视频| 欧美日韩精品一区| 激情图片小说一区| 久久午夜免费视频| 日韩亚洲欧美成人| 另类尿喷潮videofree| 三级a在线观看| 亚洲一区在线观看网站| 欧美日韩伦理片| 91免费版网站入口| 国产精品美女| 99久久99久久精品国产| 日韩av一区二区在线观看| 97人人做人人爽香蕉精品| 777久久精品一区二区三区无码| 91视频精品在这里| a级片免费视频| 国产成人精品日本亚洲| 综合一区在线| 最近中文字幕免费视频| 欧美成人乱码一区二区三区|