精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

成人福利片在线| 香蕉久久一区二区三区| 亚洲a在线视频| 欧美成人三级电影在线| 97成人在线免费视频| 国产小视频在线| 国产制服丝袜一区| 欧美在线不卡区| 免费国产羞羞网站美图| 日本欧美高清| 欧美疯狂做受xxxx富婆| 激情伊人五月天| 亚洲成人影院麻豆| 91亚洲资源网| 亚洲999一在线观看www| 国产性生活视频| 国产精品v日韩精品v欧美精品网站| 亚洲成a人v欧美综合天堂下载| 国产日韩欧美影视| 日韩欧美国产亚洲| 888久久久| 亚洲视频在线观看网站| 国产麻豆剧传媒精品国产| 日韩不卡视频在线观看| 午夜精品久久久久久久久| 综合一区中文字幕| av在线免费观看网站| 成人一区在线看| 91综合免费在线| 中国精品一区二区| 国产精品一卡| 国产最新精品视频| 国产成人久久久久| 日韩理论电影| 在线中文字幕日韩| 97香蕉碰碰人妻国产欧美| 久久伦理中文字幕| 欧美日韩成人高清| 校园春色 亚洲色图| 最新中文字幕在线播放| 香蕉成人伊视频在线观看| 91免费版看片| av在线网址观看| 亚洲人成网站影音先锋播放| 亚洲一一在线| 欧美尤物美女在线| 中文字幕不卡三区| 亚洲在线视频一区二区| 不卡在线视频| 国产精品看片你懂得| 三区精品视频| 国产在线黄色| 中文字幕欧美区| 日韩精品不卡| h网站在线免费观看| 国产日产精品一区| 先锋影音一区二区三区| a天堂中文在线88| 国产亚洲精品7777| 日产国产精品精品a∨| 国产高清一区在线观看| 欧美激情综合在线| 亚洲精品一区二区三区四区五区| 国产理论视频在线观看| 精品在线播放午夜| 成人羞羞国产免费| 国产高清不卡视频| aaa欧美色吧激情视频| 精品一卡二卡三卡四卡日本乱码 | 亚洲免费网址| 57pao成人永久免费视频| 无码任你躁久久久久久久| 日本aⅴ精品一区二区三区| 国产免费一区二区三区香蕉精| 久久综合综合久久| 亚洲国产高清一区二区三区| 91av视频在线免费观看| 欧美特级黄色片| 久久er99热精品一区二区| 91精品啪aⅴ在线观看国产| 亚洲av无码国产综合专区| 成人福利在线看| 日本不卡一区二区三区视频| 日本三级在线视频| 亚洲午夜久久久久| 国产裸体舞一区二区三区| 国产成人福利夜色影视| 日韩精品一区国产麻豆| 搡老熟女老女人一区二区| 成人国产精品一级毛片视频| 欧美成年人视频网站| 亚洲高清毛片一区二区| 日本va欧美va欧美va精品| 亚洲一区久久久| 四虎精品成人免费网站| 中文字幕日韩一区| 欧美 日韩 激情| 伊人亚洲精品| 日韩精品在线免费播放| www欧美com| 免费亚洲一区| 91国产丝袜在线放| 国产三区四区在线观看| 亚洲一区视频在线观看视频| 欧美日韩第二页| 香蕉成人app| 国产亚洲精品美女| 国产无遮挡裸体免费视频| 日本成人超碰在线观看| 国产日韩二区| 视频免费一区| 在线免费观看日本一区| 丰满少妇xbxb毛片日本| 99久久99久久精品国产片桃花| 亚洲女人天堂网| 欧美精品xxxxx| 蜜臀a∨国产成人精品| 国产一区二区三区奇米久涩| 老司机精品视频在线观看6| 欧美性猛交xxxx富婆弯腰| 视频区 图片区 小说区| 欧美熟乱15p| 欧美中文字幕在线视频| 国产综合在线播放| 亚洲精品乱码久久久久久| 少妇黄色一级片| 欧美禁忌电影网| 欧美一级大片在线观看| 黄色av中文字幕| 亚洲男同性恋视频| 亚洲免费在线播放视频| 日韩精品不卡一区二区| 欧美亚洲国产成人精品| 国内毛片毛片毛片毛片| 成人欧美一区二区三区视频网页| 狠狠精品干练久久久无码中文字幕| 任你弄在线视频免费观看| 欧美日韩国产成人在线91| 中文字幕网站在线观看| 亚洲影视在线| 蜜桃视频在线观看成人| 毛片电影在线| 亚洲成人久久一区| 欧美高清视频一区二区三区| 国产精品亚洲第一区在线暖暖韩国| 精品蜜桃传媒| av手机在线观看| 亚洲成人精品在线| 精品视频在线观看免费| 成人在线视频一区| 亚洲精品蜜桃久久久久久| 一区二区三区国产好| 色综合久久88色综合天天看泰| 日本中文字幕在线免费观看| 成人激情免费电影网址| 福利视频一二区| 欧美日韩一本| 日韩免费黄色av| 你懂的免费在线观看视频网站| 国产精品久久久久久久蜜臀| 日本老熟妇毛茸茸| 成人在线视频免费观看| 国产欧美精品日韩| 亚洲区欧洲区| 亚洲精品av在线播放| 99精品视频99| 欧美国产精品中文字幕| 国产乱码一区二区三区四区| 中国精品18videos性欧美| 国产91亚洲精品一区二区三区| 日韩电影网址| 欧美综合色免费| 国产成人无码aa精品一区| 成人黄色大片在线观看 | 欧美片网站yy| 亚洲成人生活片| 不卡的av网站| 久久久久久久激情| 欧美丰满日韩| 国产精品日韩一区二区三区| 欧美黑人粗大| 久久影院模特热| 五月色婷婷综合| 欧美情侣在线播放| 在线观看 中文字幕| 欧美国产一区在线| 挪威xxxx性hd极品| 免费的国产精品| 国产成人永久免费视频| 国产传媒欧美日韩成人精品大片| 久久久久久国产精品三级玉女聊斋 | 成人网18免费网站| 91在线观看网站| 成人开心激情| 欧美夫妻性生活xx| 黄色片在线免费观看| 欧美一区二区视频在线观看2022| 午夜激情福利电影| 成人av电影免费观看| 在线免费观看av的网站| 亚洲激情偷拍| 少妇熟女一区二区| 欧美天堂社区| 亚洲影视九九影院在线观看| 日本高清不卡一区二区三区视频 | 国产在线高清视频| 日韩大片免费观看视频播放| 特级西西444www高清大视频| 亚洲va欧美va人人爽| 国产第一页浮力| 国产欧美精品一区二区色综合 | av亚洲一区二区三区| 欧美成aaa人片免费看| 国外av在线| 亚洲精品美女在线| 精品黑人一区二区三区国语馆| 一区二区三区波多野结衣在线观看 | 国产自产v一区二区三区c| 日韩欧美xxxx| 日韩一级精品| bt天堂新版中文在线地址| 爽成人777777婷婷| 日韩区国产区| 欧美精美视频| 日本午夜精品电影| 青青操综合网| 狠狠色狠狠色综合人人| 亚洲不卡在线| 91视频九色网站| 久久天天久久| 国产精品第七十二页| 欧美电影免费观看高清完整| 98精品国产自产在线观看| 在线不卡日本v二区707| 欧美成人精品xxx| 免费在线观看av| 中文字幕久精品免费视频| 国产综合视频一区二区三区免费| 欧美日韩一区高清| 一级一级黄色片| 91国产成人在线| www.毛片.com| 欧美午夜视频一区二区| 51国产偷自视频区视频| 欧美性xxxxxx| 亚洲av无码精品一区二区| 色先锋aa成人| 在线观看国产区| 欧美精品精品一区| 99久久久国产精品无码网爆| 欧美一区二区三区免费在线看| 精品国产乱码一区二区| 婷婷夜色潮精品综合在线| 91浏览器在线观看| 日韩欧美中文免费| 国产一级淫片a视频免费观看| 最新久久zyz资源站| 黄色av片三级三级三级免费看| 成人美女在线观看| 在线免费观看污视频| 91麻豆精品一区二区三区| 欧美亚一区二区三区| 国产蜜臀97一区二区三区| 欧美另类69xxxx| 亚洲精品免费在线观看| 国产精品老熟女一区二区| 亚洲成人久久影院| 国产精品久久久久久久久久久久久久久久久 | 亚洲欧美综合网| 黄色一级视频在线观看| 亚洲午夜精品17c| 亚洲成熟少妇视频在线观看| 欧美人与性动xxxx| 黄频网站在线观看| 亚洲欧美视频在线| 午夜在线小视频| 色综合久久久久久中文网| 免费毛片b在线观看| 国产精品久久网| 亚洲2区在线| 日韩久久久久久久| 欧美淫片网站| 人妻丰满熟妇av无码区app| 国产一区二区0| 最近中文字幕无免费| 国产精品久久久久9999吃药| 国产一级在线播放| 欧美亚洲综合在线| 亚洲精品一区二区三区蜜桃| 亚洲男人天堂视频| 在线免费观看污| 日韩免费精品视频| 在线观看视频一区二区三区| 日韩精品一区二区三区四区五区| 精品影片在线观看的网站| 亚洲在线视频一区二区| 国产亚洲在线| 青娱乐精品在线| 久久久久久一二三区| 青青草精品在线视频| 91极品美女在线| 日日躁夜夜躁白天躁晚上躁91| 欧美一级片在线观看| 国产精品自产拍| 亚洲午夜色婷婷在线| 毛片在线网址| 91青草视频久久| av在线不卡免费观看| 欧美日韩性生活片| 国产精品99久久久久久有的能看| 国产成人av免费观看| 国产欧美一区二区精品婷婷| 日韩免费不卡视频| 日韩视频中午一区| 国产传媒在线播放| 国产精品旅馆在线| 欧美女优在线视频| 看av免费毛片手机播放 | 男人午夜视频在线观看| 久久欧美一区二区| www.av视频在线观看| 69精品人人人人| aaa在线免费观看| 日本欧美中文字幕| 日本久久成人网| 蜜桃传媒一区二区三区| 高清在线观看日韩| 美国黄色小视频| 欧美一区二区三区在线观看 | 日韩欧美一区二| 国产成人免费在线| 欧美 日韩 国产 一区二区三区| 亚洲日穴在线视频| 中文字幕在线日亚洲9| 亚洲人精选亚洲人成在线| 一级毛片久久久| 久久久久久草| 久久久久国产精品午夜一区| 国产ts丝袜人妖系列视频| 精品国产电影一区| 日韩毛片在线一区二区毛片| 97成人在线视频| 免费毛片在线不卡| 国产免费人做人爱午夜视频| 91色porny在线视频| 潘金莲一级淫片aaaaaa播放| 亚洲色图18p| 丁香久久综合| 在线无限看免费粉色视频| 国产在线视频一区二区| 男人与禽猛交狂配| 欧美成人一区二区三区在线观看 | 伊人精品在线观看| 色8久久影院午夜场| 亚洲国内在线| 久久91精品久久久久久秒播| 成人在线观看免费完整| 欧美一区二区不卡视频| 国产福利在线免费观看| 精品免费国产| 日韩国产在线一| 亚洲女人久久久| 亚洲精品在线免费播放| 深夜成人在线| 亚洲高清视频在线观看| 国产伦精品一区二区三区免费| 影音先锋黄色资源| 一本高清dvd不卡在线观看| www.91在线| 亚洲一区二区三区777| 在线视频观看日韩| 亚洲av成人无码久久精品 | 日日狠狠久久偷偷四色综合免费| 亚洲综合图区| 国产一区二区高清视频| 午夜一级在线看亚洲| 任你操精品视频| 精品国产伦一区二区三区免费| 国产视频网站在线| 亚洲xxxxx电影| 久久xxxx| 草视频在线观看| 日韩精品一区二区视频| 亚洲一区二区小说| 国产99久久九九精品无码| 国产精品传媒入口麻豆| 亚洲av永久无码国产精品久久| 国产视频欧美视频| 99riav视频一区二区| 国产激情片在线观看| 久久久久久9999| 国产黄色片免费| 国产精品高清在线| 韩国精品一区二区三区| 久久久久亚洲av成人无码电影| 天天色天天操综合| h视频网站在线观看| 国产日韩欧美一区二区三区四区 | 成年人免费在线播放| 日韩一区欧美一区|