在C中更改堆元素的值

时间:2014-12-07 08:12:52

标签: c data-structures heap shortest-path

我在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);

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

还有其他方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

修改节点的值后,您需要冒泡冒泡

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

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

这是一个日志时间操作。

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

有关此主题的信息,请参阅the fount of all knowledge