C++ 最小堆优先级队列减少键函数的实现

C++ 最小堆优先级队列减少键函数的实现,c++,algorithm,heap,priority-queue,C++,Algorithm,Heap,Priority Queue,我正在尝试运行Dijkstra的算法,我需要实现一个decreaseKey函数。我做这件事有困难。我读过一个解决方案,但它通过在堆中存储哈希映射使用了大量内存。有没有一种方法可以在不使用哈希映射的情况下实现decreaseKey,并且仍然保持O(logn)时间 到目前为止,我的decreaseKey函数接受两个参数:顶点和新距离。当我调用decreaseKey(顶点*v,int newDistance)时,算法必须找到存储顶点“v”的索引,然后更改其距离。我不知道如何“找到”顶点以获取其索引并将

我正在尝试运行Dijkstra的算法,我需要实现一个
decreaseKey
函数。我做这件事有困难。我读过一个解决方案,但它通过在堆中存储哈希映射使用了大量内存。有没有一种方法可以在不使用哈希映射的情况下实现
decreaseKey
,并且仍然保持O(logn)时间


到目前为止,我的
decreaseKey
函数接受两个参数:顶点和新距离。当我调用
decreaseKey(顶点*v,int newDistance)
时,算法必须找到存储顶点“v”的索引,然后更改其距离。我不知道如何“找到”顶点以获取其索引并将其保存在O(logn)时间内。

您不需要哈希映射来存储信息;您只需要从顶点到优先级队列位置的映射。如果顶点由连续整数标识,则映射由| V |整数数组组成(其中| V |是顶点数)


虽然这不是一个微不足道的空间量,但每个图顶点只有一个单词,这比边列表占用的空间要小得多。

对不起,我没有听你的答案。我的顶点被命名为整数,但我不明白你说的它们可以映射到优先级队列位置是什么意思。它们的位置和名称不是在不同的位置吗?@ghost:如果您可以从
顶点*v
中找到顶点的名称,那么您可以使用该名称作为映射表的索引来获取pq中的位置。一种方法是将所有顶点保留在一个
顶点[]
,在这种情况下,可以将名称计算为
v-vbase
。另一种方法是将名称保留在
顶点
结构中。无论哪种方式,pq都可以在洗牌元素时保持映射,因此唯一的增量成本是顶点id到pq位置的映射。