theSize / 2在以下代码中的含义是什么, 这与插入O(LogN)有什么关系吗?
template <class Comparable>
void BinaryHeap<Comparable>::buildHeap( )
{
for( int i = theSize / 2; i > 0; i-- )
percolateDown( i );
}
对于此percolateDown函数
template <class Comparable>
void BinaryHeap<Comparable>::percolateDown( int hole )
{
int child;
Comparable tmp = array[ hole ];
for( ; hole * 2 <= theSize; hole = child )
{
child = hole * 2;
if( child != theSize && array[child + 1] < array[child])
child++;
if( array[ child ] < tmp )
array[ hole ] = array[ child ];
else
break;
}
array[ hole ] = tmp;
}
答案 0 :(得分:2)
堆的一个非常常见的表示是将其映射到数组。在此表示中,对于存储在a[n]
的任何节点,其子节点位于a[n*2]
和a[n*2+1]
。根节点位于a[1]
。
鉴于此,将索引除以2(并丢弃任何余数)只是从节点索引到其父节点索引的方式。
在percolateDown
的情况下,想法是从堆的叶子上方一级开始。
尝试在数组中搜索&#34;堆&#34;了解更多详情。
答案 1 :(得分:0)
确定。事实证明,theSize / 2引导我们到未分类的Binary Heap的最后一个子树,我们开始percolateDown(i)(排序函数)。
然后我们转到第(i-1)个子树和percolateDown()那一个。依此类推,直到二进制堆树按Max或Min分类。
此视频从时间2:42(https://www.youtube.com/watch?v=WsNQuCa_-PU)
中得到澄清