c - 堆代码行解释

标签 c data-structures heap

if (index != indexMaxim)
{
    Rezervare aux = heap.vectorRezervari[index];
    heap.vectorRezervari[index] = heap.vectorRezervari[indexMaxim];
    heap.vectorRezervari[indexMaxim] = aux;

    if (indexMaxim < (heap.nrElements - 1) / 2) // I REALLY DONT GET WHAT THAT MEAN...
        filtrareHeap(heap, indexMaxim);
}

我正在处理堆结构,我认为这一行是将 indexMaxim 的值与父节点进行比较,因此如果该值小于 filtrareHeap() 方法,则调用该方法来交换索引。

你能给我一个更具体的解释吗?

最佳答案

在一个从零开始的数组托管堆中,大小为 n,其中 n > 0 成立,给定任何父节点索引 i使得i[0,n-1]中,其中n是堆的节点数,对应的子节点可以是发现于:

2 * i + 1
2 * (i + 1)

在这种情况下,上述每一项同样在 [0,n-1]

鉴于此,可以通过获取堆大小并减去 1 来确定真正没有可能的子节点的第一个节点(因此是堆中从该点开始的叶节点)从零开始的索引模型,然后整数除以二。

给定一个大小为 7 的堆,等式得出 3。这是有道理的,因为给定索引

0 1 2 3 4 5 6

我们知道

  • 0 是 1,2 的父级
  • 1 是 3,4 的父级
  • 2 是 5,6 的父级

因此,树中第一个没有子节点的节点是3。您要查询的条件只是确定该节点是否小于该位置,如果是,则进一步行动;否则停止。

关于c - 堆代码行解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50492213/

相关文章:

c - 对正在写入的文件调用 stat() 的结果是什么?

c - ANSI C 中的无缓冲 I/O

c - 如何在 Visual Studio Project 中定义相对路径?

data-structures - 是否有 `Entry`的 `BTreeMap`机制允许返回不可变的引用?

c - 当输入是复合时,在 C 中定义不起作用

java - 为什么 IdentityHashMap 使用线性探测来解决冲突

python - 有没有办法在 python 中删除列表?

sorting - 为什么我们通过堆排序而不是二叉搜索树?

c++ - 为什么C++中的优先级队列(最大堆)使用less<T>而不是greater<T>?

methods - 给定最小堆 H,对时间复杂度给出严格的 O() 限制