我在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循环,但代码的哪一部分做了什么?如果问题中有任何业余性,请道歉。
答案 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;。