簡體   English   中英

堆代碼行說明

[英]Heap code line explanation

if (index != indexMaxim)
{
    Rezervare aux = heap.vectorRezervari[index];
    heap.vectorRezervari[index] = heap.vectorRezervari[indexMaxim];
    heap.vectorRezervari[indexMaxim] = aux;

    if (indexMaxim < (heap.nrElements - 1) / 2) // I REALLY DONT GET WHAT THAT MEAN...
        filtrareHeap(heap, indexMaxim);
}

我正在研究堆結構,我認為這行代碼是將indexMaxim的值與Parent節點進行比較,因此如果該值小於filtrareHeap()方法,則會調用該方法來交換索引。

您能給我更具體的解釋嗎?

在大小為n的從零開始的,由數組托管的堆中,其中n > 0成立,給定任何父節點索引i使得i[0,n-1] ,其中n是堆的節點數,則相應的子節點可以在以下位置找到:

2 * i + 1
2 * (i + 1)

在上述每種情況同樣在[0,n-1]

鑒於此,我們可以通過計算堆大小,減去一個來考慮基於零的索引模型,然后確定整數,從而確定真正沒有子節點的第一個節點(因此是堆中從該點開始的葉子節點)。除以二。

給定大小為7的堆,該方程式得出3。這很有意義,因為給定索引

0 1 2 3 4 5 6

我們知道

  • 0是1,2的父級
  • 1是3,4的父級
  • 2是5,6的父母

因此,樹中沒有子節點的第一個節點為3。您要查詢的條件只是確定該節點是否小於該位置,如果是,請采取進一步的措施;否則,請執行以下操作。 否則停止。

您標記的條件似乎正在測試indexMaxim是否對應於堆的內部節點,而不是葉節點。 如果是內部節點,則該值可能需要過濾得更遠,因此對filtrareHeap()進行(遞歸?)調用,但是如果它是葉節點,則該值不能比該節點更遠。

暫無
暫無

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

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