堆,贏者樹,敗者樹的區別與聯絡

2021-07-25 04:57:50 字數 790 閱讀 5368

今天做leetcode的23. merge k sorted lists這道題的時候,遇到的這個問題。這道題本質上就是乙個多路歸併的問題,而這道題主要就是考察多路歸併時候的選擇問題。按照之前本科上課學的,最好的辦法就是用競賽樹(敗者樹),可是我嫌麻煩就用堆來做了,也順利能過。所以就想到,堆,贏者樹,敗者樹到底有什麼區別呢?

於是找了一些資料看了一下,在這裡總結一下

首先它們三個的相同點就是在於:空間和時間複雜度都是一樣的。調整一次的時間複雜度都是o(logn)的。

所以這道題用堆來做,跟用敗者樹來做並沒有本質上的演算法複雜度量級上的差別。

其實一開始就是只有堆來完成多路歸併的,但是人們發現堆每次取出最小值之後,把最後乙個數放到堆頂,調整堆的時候,每次都要選出父節點的兩個孩子節點的最小值,然後再用孩子節點的最小值和父節點進行比較,所以每調整一層需要比較兩次。

這時人們想能否簡化比較過程,這時就有了勝者樹

這樣每次比較只用跟自己的兄弟節點進行比較就好,所以用勝者樹可以比堆少一半的比較次數。

而勝者樹在節點上公升的時候首選需要獲得父節點,然後再獲得兄弟節點,然後再比較。這時人們又想能否再次減少比較次數,於是就有了敗者樹

在使用敗者樹的時候,每個新元素上公升時,只需要獲得父節點並比較即可。

所以總的來說,減少了訪存的時間。

現在程式的主要瓶頸在於訪存了,計算倒幾乎可以忽略不計了。

堆和棧的聯絡與區別

在 bbs上,堆與棧的區分問題,似乎是乙個永恆的話題,由此可見,初學者對此往往是混淆不清的,所以我決定拿他第乙個開刀。首先,我們舉乙個例子 void f 這條短短的一句話就包含了堆與棧,看到new,我們首先就應該想到,我們分配了一塊堆記憶體,那麼指標p呢?他分配的是一塊棧記憶體,所以這句話的意思就是...

B樹的度數 階數區別與聯絡

最近在複習資料結構的時候看到了b樹的兩種定義,一種是演算法導論中的度數說 另一種是維基百科的階數說。在此記錄一下 度數 在樹中,每個節點的子節點 子樹 的個數就稱為該節點的度 degree 階數 order 階定義為乙個節點的子節點數目的最大值。自帶最大值屬性 然後再結合b樹來理解具體含義 每個節點...

三種平衡樹的區別與聯絡

雖然他叫 fhq treap 但實際上跟 treap 沒啥關係。fhq treap 就是無旋轉的 treap,問題來了,如何和保持平衡呢。這裡就要介紹兩個函式了,merge和split。split就是將一棵樹按照某關鍵值 成平衡的兩棵樹。某關鍵值就兩種,一種按排名 一種按照關鍵值 這裡主要介紹按照關...