查找最近的交货中心到给定的区号

时间:2013-12-21 06:05:32

标签: algorithm data-structures graph

在公司的面试过程中询问了这一点。假设有一个界面可以查找到您所在地区最近的送货中心。您需要输入的只是您的邮政编码/密码,它会返回最近的送货中心。这样做的数据结构和算法是什么?就像,你打破了手机,想去服务中心。您可以访问公司网站并输入您的邮政编码,找到最近的维修中心。它是如何做到的?

我建议使用图形+散列图解决方案,我将从给定节点返回相邻节点,并且地址将存储在hashmap wrt zipcodes中,但这不够好,因为访问者一直在使用地理属性来说明你没有给出两个中心之间的距离,那么你怎么知道哪个是最近的,如果被问到最近的3个中心。那时我无法提出任何解决方案。他还一次又一次地问我需要解决这个问题的数据。知道这可能是什么方法真的很有帮助,因为它已经困扰了我好几天。感谢

2 个答案:

答案 0 :(得分:1)

您需要整个道路网络,它是一个包含所有节点之间距离的稀疏矩阵。您还需要包含服务中心的节点列表。有了这个,我认为A *算法应该确定给定位置和每个服务中心之间的距离,然后在距离上拾取至少三个。我确信有更高效的算法,但我相信访问者应该专注于您认为解决问题的方式,而不是要求实施细节,如数据结构。我是否必须在现实生活中解决这样的问题,我会先做文献研究。 面对这样的面试官,我不确定什么策略是最好的,如果他愿意接受这样的回应。在深入了解细节之前保持自信并提供解决方案的概述可能会更好。 不过没有遗憾。从经验中获益并继续前进。你不知道上帝为你准备的赏金。

答案 1 :(得分:1)

大多数算法处理单点 - 只需取一个邮政编码区域的中心点即可。

对于一个最近的邻居,Voronoi diagram似乎就是这样。

它将空间分成区域,以便在给定任何查询点的情况下,我们知道哪个点最接近。

取自Wikipedia

kd-tree也是一个选项:

  

k-d树是二叉树,其中每个节点都是k维点。每个非叶节点都可以被认为是隐式生成分裂超平面,该超平面将空间划分为两个部分,称为半空间。该超平面左侧的点由该节点的左子树表示,超平面右侧的点由右子树表示。超平面方向按以下方式选择:树中的每个节点都与k维度中的一个相关联,超平面垂直于该维度的轴。因此,例如,如果对于特定分割,选择“x”轴,则具有比节点小的“x”值的子树中的所有点将出现在左子树中,并且具有更大“x”值的所有点将是在正确的子树中。在这种情况下,超平面将由点的x值设置,其法线将是单位x轴。

找到k个最近邻居要困难得多。有一个k nearest neighbours algorithm,但这是一个分类算法,所以我不确定它有帮助。

一种选择是创建该地区的网格。然后,给定一个点,我们知道它所在的单元格,我们可以简单地查询该单元格及其邻居,直到我们找到所需数量的邻居。

这里必须要小心,因为下一个最近的点实际上可以在另一个单元格中,例如:

--------------
   |        B|
 A | X       |
   |         |
   |         |
--------------

给定点X,最近的点是A,但如果我们只是查看同一个单元格,则返回B.我们还需要查看所有相邻的单元 之后我们找到了k点。