【问题标题】:Implementation of decrease key function for a min heap priority queue最小堆优先级队列的递减键函数的实现
【发布时间】:2016-02-13 04:37:27
【问题描述】:

我正在尝试运行 Dijkstra 的算法,我需要实现 decreaseKey 函数。我很难做到。我阅读了一个解决方案here,但它通过在堆中存储哈希映射来使用大量内存。有没有办法在没有哈希映射的情况下实现 decreaseKey 并且仍然保持 O(log n) 时间?

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

【问题讨论】:

    标签: c++ algorithm heap priority-queue


    【解决方案1】:

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

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

    【讨论】:

    • 对不起,我没有听从你的回答。我的顶点被命名为整数,但我不明白你的意思是它们可以映射到它们的优先级队列位置。他们的职位和他们的名字不会在不同的地方吗?
    • @ghost:如果可以从vertex *v中找到顶点的名字,那么就可以通过名字作为映射表的索引来获取pq中的位置.一种方法是将所有顶点保存在vertex[] 中,在这种情况下,您可以将名称计算为v - vbase。另一种方法是将名称保留在 vertex 结构中。无论哪种方式,pq 都可以在洗牌元素时维护映射,因此唯一增加的成本是 vertex-id 到 pq 位置的映射。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2018-08-10
    • 2014-04-08
    • 1970-01-01
    相关资源
    最近更新 更多