【问题标题】:Shortest distance/path between household addresses家庭地址之间的最短距离/路径
【发布时间】:2014-04-26 15:56:11
【问题描述】:
如果您想知道两个家庭住址之间的最短距离/路径,您会使用哪种数据结构来有效地返回答案?
假设您正在考虑美国所有家庭(约 1 亿)的集合。
考虑到输入大小如此之大,我正在努力想出一个实用的数据结构。 Dijkstra 似乎效率太低,但我猜有一种方法可以预处理路径以使这样的查询成为可能。我只是不知道从哪里开始。
【问题讨论】:
标签:
performance
algorithm
data-structures
shortest-path
【解决方案1】:
Dijkstra 的算法或非常相似的东西可能是基础,尽管您可以期望它是高度优化的。如果您在住宅街道上设置较高的权重并随着道路容量的增加而减少权重,您会很快缩小搜索空间。
您还可以期望在主要城市之间存在预先计算好的路线。因此,如果您在迈阿密并且想前往洛杉矶,则大部分路线都是预先计算好的。你只需要弄清楚如何从迈阿密的房子到最近的高速公路交汇处,以及从洛杉矶的高速公路到目的地。
考虑到邮政编码的数量少于 100,000,因此拥有一张表,其中包含从每个邮政编码到每个其他邮政编码的预先计算的路线并不是不可想象的。我们只是在谈论 100 亿条路线。天真地存储,这将是相当数量的数据,但它是高度可压缩的。例如,假设您的邮政编码数据库只包含到最近的主要高速公路的路线。一旦您在主要高速公路上,数据量就不会那么大。
虽然所有的道路都是相连的,但你不会把它当成一张巨大的图表。相反,你有一堆更小的图表——集群——然后你计算集群之间的路径。在数据达到可管理的大小之前,您还可以在集群中拥有集群。
至少,我会这样解决问题。
【解决方案2】:
The A* algorithm 可以在这里使用。
它本质上是 Dijkstra 算法的扩展,您可以在每个节点的值上添加一个“启发式”,即到目的地的估计距离。
在这种特定情况下,假设您可以访问每个房屋的坐标,您可以确定到目的地的直线距离作为启发式。
可视化:
除此之外,Jim 的建议也不错。