【发布时间】:2011-05-23 07:26:09
【问题描述】:
确定从 1 到 N 范围内的缺失值的常见面试问题已经完成了一千次。变体包括 2 个缺失值,最多 K 个缺失值。
示例问题:范围 [1,10] (1 2 4 5 7 8 9 10) = {3,6}
以下是各种解决方案的示例:
Easy interview question got harder: given numbers 1..100, find the missing number(s)
我的问题是,将一个缺失值的简单情况视为 O(n) 复杂度,而较大情况的复杂度大致收敛于大于 O(nlogn) 的值:
通过对范围进行排序 (mergesort) 并遍历它观察丢失的元素,难道不是更容易回答问题吗?
此解决方案应花费不超过 O(nlogn) 并且能够解决 1 到 N 以外的范围的问题,例如 10 到 1000 或 -100 到 +100等等……
是否有任何理由相信上述 SO 链接中的给定解决方案会比基于排序的解决方案更好地处理大量缺失值?
注意:这个问题似乎有很多常见的解决方案,假设是唯一的数论方法。如果有人在 S/E 面试中被问到这样的问题,假设该方法与数论解决方案的复杂性相当,那么使用更计算机科学/算法的方法不是明智之举……
更多相关链接:
【问题讨论】:
-
排序或使用 BitSet 是完全有效的解决方案,除非面试官明确指出他正在寻找流式算法或该集合需要太多内存。
-
如果您甚至没有 O(N) 可用内存怎么办?如果您必须在资源非常有限的嵌入式设备上实现这一点,并且输入以流的形式出现,没有随机访问,该怎么办?
-
这个答案的问题是 OP 在特别需要 O(K) 空间的问题中发布了这个;而这个答案需要 O(N) 空间。 OP将其他答案(其中一些非常好)描述为“荒谬的答案”。
-
问题是最有意义的,当输入以流的方式给出时:您实际上无法将所有
n项目存储在内存中,但它们一次显示给您一个。你只有k^O(1)内存可以玩。在这种情况下,幂和技术是有意义的。您还可以通过 stackoverflow.com/a/36851791/205521 中的散列来改进“显示的每个数字使用的时间” -
@javadba,原来的问题确实要求
O(k)空间复杂度,但是堆排序可以解决O(1)空间中的问题。
标签: c++ math computer-science complexity-theory