曼哈顿距离算法求职面试题
Posted
技术标签:
【中文标题】曼哈顿距离算法求职面试题【英文标题】:Manhattan distance algorithm job interview question 【发布时间】:2011-04-27 20:58:56 【问题描述】:给定 X-Y 平面上的一组 n 个点,我如何确定每个点是否至少与其他点相隔 5 个单位的曼哈顿距离在小于 O(n ^2)?
实现这一点的最佳算法是什么?
谢谢。
【问题讨论】:
这不是一个问题,而是一个作业。 你怎么知道这是作业?这很容易成为一个面试问题。 @arasmussen,“作业”并不一定意味着作业。我的意思是 OP 没有提出问题。 好点。 Zaya,到目前为止,你在这个问题上做了什么工作?你怎么认为?小于O(n^2)对算法意味着什么? @arasmussen 我完全同意巴特的观点。我想你没有明白他的意思。他的意思是zaya给出的句子是一个赋值(order)。它以祈使形式写成。这不是问什么问题。 【参考方案1】:按x
对点进行排序。这需要时间'O(n log(n))'。
将范围划分为宽度为 10 的条带。(对于一个点的 x 坐标为 1,下一个点的 x 坐标为 1020 .) O(n)
对于每个条带:
-
取该条带内的点集,或在任意一侧的 x 为 5 内,并按 y 对它们进行排序。这是
O(n log(n))
在所有条带中。
对于条带中的每个点,找出与略宽条带中所有其他点的曼哈顿距离,这些点的 y 坐标在它们自己的 5 以内。如果在距离 5 内发现任何东西,请退出并报告错误。这是O(n)
,在所有条带中。
报告为真。
这个算法是O(n log(n))
。我强烈建议您自己证明 1.2 中的逐点曼哈顿比较采用 O(n)
操作,即使答案是否定的。
对于 true,这很简单 - 这是因为在 20x10 的盒子中可以压缩的其他点的最大数量,而 2 在 5 以内。对于 false,它更棘手,你可以有很多其他的该框中的点,但是当您将固定数量的点与其他点进行比较时,您必须在距离 5 内找到两个点。无论哪种方式,在您获得您的回答。
【讨论】:
所有条带 O(n) 如何按 y 排序?使用基数排序? 我在这里可能是错的,但是由于您最多有 n 个条带,因此按 y 对每个条带进行排序会导致 n * (n log(n)) 操作,这意味着 n^2 log(n )。我错了吗?我认识到在实践中它将是一个大大减少的集合(即,如果有很多条,那么每个条中的值都是有限的,所以内部排序更小;如果条很少,那么排序也很少)所以它应该是很快,但在我看来,从技术上讲,它仍然是 n^2 log(n)... @DRobinson 如果有n
条带,那么每个排序都是O(1)
。一般来说,如果您有k
列表和n
事物之间的事物,那么对所有k
列表进行排序不会比将n
事物与最多k
标签的事物按标签然后按事物排序更差,所以无论如何有很多列表,将它们全部排序并不比O(n log(n))
差。
是的,但是以有 n/2 个条带的情况为例,其中两个条带大约有 n/4 个元素(剩余的 n/2 个元素分布在剩余的(n/2 - 2)条)。从技术上讲,这不是遍历 O(n) 个条带(因为它们有 n/2 个),并且在每个排序中都是 O(n) [因为最坏的情况有 n/4 -> O(n)] 值?那将是 O(n/2 * O(n/4 log(n/4)) = O(n * nlog(n))。显然它会快得多,但在纯大 O 中仍然看起来像 n^2log (n) 给我。
除非我遗漏了什么,这也是完全可能的。以上是关于曼哈顿距离算法求职面试题的主要内容,如果未能解决你的问题,请参考以下文章