计算所有邮政编码都在 x 英里内的最小邮政编码集的函数
Posted
技术标签:
【中文标题】计算所有邮政编码都在 x 英里内的最小邮政编码集的函数【英文标题】:Function to calculate smallest set of zip codes in which all zip codes are within x miles 【发布时间】:2011-09-30 04:23:11 【问题描述】:我需要一个函数(使用任何语言,但最好是脚本),它可以获取具有纬度/经度坐标的对象数组(比如说邮政编码)并返回原始数组的所有元素都在 x 内的最小子集(假设是 20)英里的子集的至少 1 个成员。
【问题讨论】:
所以你从位置 S = xy0, xy1, xy2, ... 开始,你想找到一个子集 a0, a1, ... 这样那 *dist*(a0, a(n)) n?仅当您想要 最大 子集时,此问题才很难解决-如果不允许空集,则最小子集是空集或任何单个成员... 不,我想要最小的子集,其中原始集的每个成员都在子集成员的 20 英里范围内。我会满足于任何小的子集。谢谢。 哦,抱歉,我现在明白了。您想要一个子集 a0, a1, ... 使得对于原始集合中的每个 n = 0, 1, ..., N,存在一个 m 满足 dist(xy(n), a(m)) 【参考方案1】:这里有一个贪心算法可以帮助你入门。
从一个空的结果集 R 开始,让 S 成为所有邮政编码的集合。 对于 S 中的每个邮政编码 Zn,计算 Zn 20 英里范围内的邮政编码集合 Vn >. 找到元素最多的集合Vmax - 将对应的邮编Zmax添加到结果集R中,删除所有元素Vmax 来自 S。 使用 S 中的剩余元素,从第 2 步开始重复,直到 S 为空。那么最后的集合是R。
【讨论】:
你在#3 输给了我。你能解释一下 Vmax 和 Zmax 吗? 因此您有 Z0、Z1、Z2 等邮政编码,并且对于每个邮政编码,您可以找到 20 英里内的所有其他邮政编码。所以 V0 是 Z0 20 英里范围内的邮政编码集; V1 是 Z1 20 英里范围内的集合,依此类推。如果你数一下V0、V1、...中有多少元素,那么你可以找到最大的集合——即Vmax,而你用来制作Vmax的邮政编码是Zmax。您可以将 Zmax 视为“尽可能多的其他邮政编码在 20 英里范围内的邮政编码”。这有帮助吗? 您的解释有助于我理解您的意思,但我不确定这是最好的方法。您从大城市开始,但从偏远地区开始似乎更有意义。 我认为你是对的,我可以发布另一个答案,但似乎你已经知道你在做什么 - 所以现在我将把它留给你,让你找到最好的解决问题的方法。以上是关于计算所有邮政编码都在 x 英里内的最小邮政编码集的函数的主要内容,如果未能解决你的问题,请参考以下文章