了解堆中的渗透上下功能(优先级队列)

时间:2015-04-18 18:41:50

标签: c++ algorithm data-structures heap

我在min-heap(顶部最小的键)上进行上下渗透的代码有一些问题。我最大的抱怨是这两个代码片段的for循环,这导致我不理解代码的其余部分......

int hole = ++currentSize;
Comparable copy = x;

array[ 0 ] = std::move( copy ); //in the books implementation the zero 
//index is kept empty, is this to create a temporary place for the added element?
for( ; x < array[ hole / 2 ]; hole /= 2 ) //my biggest problem is understanding this for loop!!!
    array[ hole ] = std::move( array[ hole / 2 ] ); //what does this do?
array[ hole ] = std::move( array[ 0 ] );

我不明白这里的for循环。它可能与i'th索引的父级在i / 2中的关系有关,依此类推,但我对此毫无头绪。这是将一个元素插入堆中。任何有关规定代码含义的帮助都表示赞赏。

然后是findMin方法的percolate,我再也不懂代码了。

/**
    * Internal method to percolate down in the heap.
    * hole is the index at which the percolate begins.
    */
void percolateDown( int hole )
{
    int child;
    Comparable tmp = std::move( array[ hole ] );

    for( ; hole * 2 <= currentSize; hole = child ) //not clear with this for loop!!!
{
    child = hole * 2;
    if( child != currentSize && array[ child + 1 ] < array[ child ] )
    ++child;
    if( array[ child ] < tmp )
    array[ hole ] = std::move( array[ child ] );
    else
        break;
    }
    array[ hole ] = std::move( tmp );
    } //somewhat understood, except the for loop...

主要是for循环,但代码的哪一部分做了什么?如果问题中有任何业余性,请道歉。

1 个答案:

答案 0 :(得分:1)

正如您所说:元素i的父级位于i/2。代码的作用是插入一个&#34; hole&#34;,它将放置新元素。 for循环中的行:

array[ hole ] = std::move( array[ hole / 2 ] );

将父母移动到孩子的位置(这是&#34;洞&#34;)。所以我们基本上做的是以下

while (element being moved up < parent)
    move parent to current index
    current index = index of parent
place element at current index

另一段代码恰恰相反。它有点复杂,因为虽然每个元素只有一个父元素,但它可能有两个孩子。第一个位于i * 2,第二个位于i * 2 + 1。首先,我们检查元素是否有子元素(child != currentSize)。如果孩子较小,我们只想将父母与孩子交换。所以我们看看哪个孩子最小(array[ child + 1 ] < array[ child ])。我们将该孩子与其父母进行比较:如果它是较小的,我们交换它们并继续,否则我们就完成了。最后,我们将我们搬回的元素放回&#34;洞&#34;。