【发布时间】:2020-08-19 12:48:14
【问题描述】:
请多多包涵,我对数据结构很陌生。
我对如何使用优先级队列来解决最小距离感到困惑。例如,如果我有一个矩阵并且想要找到从源到目标的最小距离,我知道我会执行 Dijkstra 算法,在该算法中,我可以很容易地找到源和矩阵中所有元素之间的距离。
但是,我很困惑这里如何使用堆 + 优先级队列。例如,假设我从网格上的(1,1) 开始,想要找到到(3,3) 的最小距离,我知道如何在查找邻居、检查距离和标记为已访问的意义上实现该算法。但我已经阅读了有关优先队列和最小堆的信息,并希望实现它。
目前,我唯一的理解是优先级队列有一个定位元素的键。我的问题是当我插入第一个邻居(1,0),(0,0),(2,1),(1,2) 时,它们基于一个键(在这种情况下是距离)插入到 pq 中。因此,下一个搜索将是矩阵中距离最短的元素。但是对于 pq,如何在这里使用超过 2 个邻居的堆?例如(1,1) 的孩子就是上面提到的 4 个邻居。这将违反 2*i 和 2*i + 1 和 i/2
总之,我不明白最小堆 + 优先级队列是如何找到距离之类的最小值的。
0 1 2 3
_ _ _ _
0 - |2|1|3|2|
1 - |1|3|5|1|
2 - |5|2|1|4|
3 - |2|4|2|1|
【问题讨论】:
-
确认我已经理解您要解决的问题:您有一个网格,并且您想找到从一个位置到另一个位置的最短路径。每个网格单元是否分配了数字来指示移动到那里的成本?还是更简单的“这里有墙”/“这里没有墙?”
-
@templatetypedef 是的,它们已编号,我会更新它。是的,有界限
标签: java algorithm heap priority-queue dijkstra