【问题标题】:Changing value of a heap element in C在 C 中更改堆元素的值
【发布时间】:2015-02-05 02:22:06
【问题描述】:

我在 C 中实现了一个最小堆。

我的堆是一个结构数组。我根据结构中成员“长度”的值排列了堆中的元素。在我的程序中,我必须动态修改某些成员的“长度”。修改这个值后,我的堆已经重建。我在重建其中的一部分时遇到了困难。

我的代码:

typedef struct edge{

int source;
int dest;
int length;
}edge_st;

typedef struct heap{

 edge_st* edge[100];
 int size;

 }heap;

重新调整的代码如下所示:

void modifyHeap(heap* h, int ref, int newval)
{
    int i;
    for(i=0; i<h->size; i++)
    {
        if(h->edge[i]->source == ref)
        {
            if(h->edge[i]->length==INT_MAX)
            {
                h->edge[i]->length = 0;
            }
            h->edge[i]->length = h->edge[i]->length+newval;
            break;
        }
    }

    heapify(h,0,h->size);

}

我正在做的是使用引用搜索结构并更改其长度值。 更改后,我尝试再次进行 heapify,但它不起作用,因为我更改的元素可能不是 root(0) 的直接子元素。如果我这样做了

    heapify(h,i,h->size);

这也不起作用,因为 i 可能没有任何孩子。

有没有其他办法解决这个问题?

【问题讨论】:

    标签: c data-structures heap shortest-path


    【解决方案1】:

    一旦你修改了一个节点的值,你需要bubble down或者bubble up

    如果你减少了值,你需要冒泡,以保留堆属性。这意味着您迭代地交换节点与其父节点,直到您到达根节点或到达父节点小于您正在考虑的节点的值的点。

    如果你增加它,你需要冒泡。这意味着您迭代地查看节点的哪个子节点更小,如果它小于您正在考虑的节点的值,则交换这两个节点。您继续前进,直到到达叶节点,或者到达两个孩子都大于您正在考虑的节点的值的点。

    这是一个日志时间操作。

    请注意,这些操作与将节点添加到堆和删除 min 所需的操作相同。要添加一个节点,你把它放在底部,然后冒泡直到它到达正确的位置。要删除最小值,您取出根节点并将其替换为最后一个节点,然后向下冒泡直到它到达正确的位置。

    请参阅the fount of all knowledge 了解此主题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      • 2015-06-22
      • 2010-10-07
      • 1970-01-01
      • 2022-11-02
      • 2013-07-10
      • 1970-01-01
      相关资源
      最近更新 更多