【问题标题】:BubbleDown operation on binary min-heap does not work二进制最小堆上的 BubbleDown 操作不起作用
【发布时间】:2010-04-21 16:15:25
【问题描述】:

我正在尝试从二进制堆中提取最小值,但它不起作用。这是我的 BubbleDown 代码:

void heapBubbleDown(Heap * const heap, int idx) {
    int min;

    while(RIGHT(idx) < heap->count) {
        min = LEFT(idx);

        if(RIGHT(idx) < heap->count) {
            if(heap->items[LEFT(idx)] > heap->items[RIGHT(idx)]) {
                min = RIGHT(idx);
            }
        }

        heapSwapValue(&(heap->items[idx]), &(heap->items[min]));

        idx = min;
    }
}

看起来它只交换了几个数字,但不是全部,我不明白为什么。我已经多次尝试以不同的方式重新编码它......

我做错了什么?

【问题讨论】:

    标签: c algorithm binary-heap min-heap


    【解决方案1】:

    我认为问题不在于它交换了几个元素。当最小的孩子 >= 当前项目时,您必须停止。

    我会将最后两行重写为:

        if (heap->items[idx] > heap->items[min]) {
           heapSwapValue(&(heap->items[idx]), &(heap->items[min]));
           idx = min;
        } 
        else
           break;
    }
    

    【讨论】:

    • 谢谢...不过我不喜欢使用中断,我正在考虑在 while 条件中添加一个变量,但还有其他方法吗?不过我想不出来...
    • @Nazgul,不容易。您必须先完成所有左/右的事情,然后才能知道。你可以保留一个布尔标志“noptInOrderYet”,但我会使用一个中断。
    【解决方案2】:

    while 的条件不充分。可能没有右孩子,但您需要与左孩子进行交换。此外,正如 Henk 所建议的,您需要检查计算出的最小值实际上是否小于您当前的值。

    【讨论】:

    • tafa,是的,我错过了。应该是while (LEFT(idx) &lt; heap-&gt;count)
    猜你喜欢
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 2014-10-07
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多