theSize / 2意味着percolateDown(i)的功能是什么?

时间:2016-01-20 20:43:46

标签: c++ heap

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;
}

2 个答案:

答案 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

中得到澄清