簡體   English   中英

清除Fibonacci Heap extract-min操作中節點的標記屬性

[英]Clear mark attribute of a node in extract-min operation of Fibonacci Heap

在 Fibonacci Heap 的DECREASE-KEY操作中,每當一個節點從其父節點中切出並添加到根列表中時,其標記屬性將設置為FALSE 但是,在EXTRACT-MIN操作中,min-node 的子節點被添加到根列表中,但它們的標記屬性未設置為FALSE 為什么會有這樣的矛盾?

此外,在使一個節點成為另一個節點的子節點的鏈接操作中,新子節點的 mark 屬性設置為FALSE EXTRACT-MIN操作多次執行此鏈接操作。 但是在CLRS書中描述的EXTRACT-MIN操作的攤銷分析中,作者聲稱標記節點的數量在EXTRACT-MIN操作中沒有改變。 他們使用m(H)來表示EXTRACT-MIN操作前后標記節點的數量。 我引用了書中的確切內容:

提取最小節點前的勢為t(H)+2m(H),之后的勢至多為(D(n)+1)+2m(H)。

這里D(n)是 n 節點斐波納契堆中任意節點的最大度數, t(H)是斐波納契堆中樹的數量, m(H)是斐波納契堆中標記節點的數量。

這個計算是不是錯了?

讓我們退后一步——為什么我們首先需要斐波那契堆中的標記位?

Fibonacci 堆背后的想法是使 DECREASE-KEY 操作盡可能快。 為此,DECREASE-KEY 的基本策略是獲取其鍵被減少的元素,並在違反堆屬性時將其從其父元素中刪除。 不幸的是,如果我們這樣做,那么我們就失去了樹的階數和樹中節點數之間的指數聯系。 這是一個問題,因為 EXTRACT-MIN 操作的 COALESCE 步驟根據樹的順序鏈接樹,並假設每棵樹的順序說明了它包含多少節點。 隨着該連接的中斷,我們希望 go 離開所有不錯的運行時界限。

作為折衷,我們引入了標記位。 如果一個節點丟失了一個孩子,它會被標記為“這里丟失了一些東西”。 一旦一個標記的節點失去了第二個孩子,它就會從它的父節點中被切斷。 隨着時間的推移,如果您對一棵樹進行大量切割,最終切割會傳播到樹的根部,從而降低樹的順序。 這使得樹在 COALESCE 步驟中表現不同。

話雖如此,這里的重要細節是標記位僅與非根節點相關。 如果一個節點是樹的根並且它失去了一個孩子,這會立即以 COALESCE 會注意到的方式改變它的順序。 因此,您基本上可以忽略任何樹根的標記位,因為它永遠不會出現。 在將節點向上移動到根列表之前清除節點的標記位可能是一個明智的想法,這樣您以后就不必清除它了,但這更多的是一個實現細節而不是其他任何東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM