- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写dijkstra算法的代码,对于我们应该找到距当前正在使用的节点最小距离的节点的部分,我正在使用一个数组,并将其完全遍历以找出该节点。
这部分可以用二进制堆代替,我们可以在O(1)时间内找出节点,但是我们还会在进一步的迭代中更新节点的距离,我将如何合并该堆?
如果是数组,我要做的就是转到(ith -1)索引并更新该节点的值,但是在Binary堆中无法完成相同的事情,我将必须进行完整的搜索才能得出图确定节点的位置,然后对其进行更新。
解决此问题的方法是什么?
最佳答案
这只是我在类里面与同学分享的一些信息。我以为我可以使人们更容易找到它,所以我把这篇文章留了下来,以便我找到解决方案时可以回答。
注意:在此示例中,我假设您图形的顶点具有一个ID来跟踪哪个是哪个。可以是名称,数字或其他名称,只要确保您在下面的struct
中更改类型即可。
如果没有这种区分方法,则可以使用指向顶点的指针并比较其指向的地址。
您在这里面临的问题是,在Dijkstra的算法中,要求我们将图的顶点及其键存储在此优先级队列中,然后更新队列中剩余的键。
但是...堆数据结构无法到达不是最小或最后一个节点的任何特定节点!
我们能做的最好的事情是在O(n)时间内遍历堆以找到它,然后在O(Logn)处更新其密钥和冒泡。这使得为每个边更新所有顶点O(n),使得我们实现Dijkstra O(mn)的方式比最优O(mLogn)差。
!一定有更好的方法!
因此,我们需要实现的并不是完全基于标准的基于最小堆的优先级队列。我们需要比标准的4 pq操作多一个操作:
struct
(C++)
struct VertLocInHeap
{
int vertex_id;
int index_in_heap;
};
std::map
声明为:
std::map
保证O(Logn)搜索,因此开箱即用的效果很好。然后每当您插入或冒泡时,您只需
m_locations[vertexID] = newLocationInHeap;
快钱。
关于heap - 如何在Dijkstra算法中使用二进制堆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14252582/
我是一名优秀的程序员,十分优秀!