java - 优先级队列如何与堆一起使用来解决最小距离
问题描述
请耐心等待我对数据结构很陌生。
我很困惑如何使用优先级队列来解决最小距离。例如,如果我有一个矩阵并且想要找到从源到目标的最小距离,我知道我会执行 Dijkstra 算法,在该算法中,我可以很容易地找到源和矩阵中所有元素之间的距离。
但是,我很困惑如何在这里使用堆 + 优先级队列。例如,假设我从(1,1)
网格开始并想找到到(3,3)
我知道如何在查找邻居并检查距离和标记为已访问的意义上实现算法的最小距离。但是我已经阅读了优先级队列和最小堆并希望实现它。
现在,我唯一的理解是优先级队列有一个定位元素的键。我的问题是当我插入第一个邻居(1,0),(0,0),(2,1),(1,2)
时,它们基于一个键(在这种情况下是距离)插入到 pq 中。因此,下一个搜索将是矩阵中距离最短的元素。但是对于 pq,如何在这里使用超过 2 个邻居的堆?例如,孩子(1,1)
是上述 4 个邻居。这将违背2*i
and2*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|
解决方案
您需要使用优先级队列来获得每次移动的最小权重,因此 MinPQ 将适合此。
MinPQ 使用堆内部技术将元素放在正确的位置操作,例如sink()
swim()
所以 MinPQ 是内部使用堆技术的数据结构
推荐阅读
- android - 操作类型未注册“NonMaxSuppressionV3”张量流
- angularjs - 无法使用 Angularjs 使用 okta 登录页面
- database - 哈希索引永远不是聚集索引吗?
- reactjs - 使用 React 缺少 MapBox CSS
- javascript - 在以角度 4 渲染函数后从服务共享数据到组件
- matplotlib - 绘制非常大的 2D 彩色地图/瀑布图/频谱图
- c# - C# 在 MongoDB 上运行命令而不连接到特定数据库
- amazon-web-services - 安装从外部提供商处购买的 SSL 证书
- java - 用 spring 管理 Kafka 主题
- excel - 调用函数中是否需要重复名称?