Size/2 是什么意思 percolateDown(i) 函数

what does theSize/2 means percolateDown(i) function?

本文关键字:函数 percolateDown 意思 是什么 Size      更新时间:2023-10-16

theSize/2在下面的代码中是什么意思,这与插入O(LogN)有某种关系吗?

template <class Comparable>
void BinaryHeap<Comparable>::buildHeap( )
{
    for( int i = theSize / 2; i > 0; i-- )
        percolateDown( i );
}

对于此渗透向下功能

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

堆的一个非常常见的表示形式是将其映射到数组。在此表示中,对于存储在 a[n] 的任何节点,其子节点位于 a[n*2]a[n*2+1] 处。根节点位于 a[1]

鉴于此,将索引除以 2(并丢弃任何余数)只是从节点的索引到其父节点的索引的方式。

percolateDown的情况下,这个想法是从堆叶子上方一级的节点开始。

尝试搜索"数组中的堆"以获取更多详细信息。

好的。事实证明,theSize/2 将我们引向未排序的二进制堆的最后一个子树,在那里我们开始渗透 Down(i)(排序函数)。

然后我们移动到第 (i-1) 个子树并渗透 Down() 那个子树。依此类推,直到二叉堆树被排序为 Max 或 Min。

这段视频从时间 2:42 (https://www.youtube.com/watch?v=WsNQuCa_-PU) 中澄清