【发布时间】:2012-08-20 10:53:47
【问题描述】:
假设,给定一个 n 元素多重集 A(未排序),我们 需要一个 O(n) 时间算法来确定 A 是否包含多数元素,即 在 A 中出现超过 n/2 次的元素。很容易在 O(n) 时间内通过以下方式解决此问题 使用线性时间选择算法找到中位数(称为 x),然后计数 x 在 A 中出现多少次,如果计数超过 n/2,则将其作为多数返回 (否则答案是“没有多数”)。现在考虑以下概括 问题的根源:给定 A 和一个整数 k
现在我想出了两个解决方案,但都不能完全满足 O(n log k) 要求。我立即看到我可以使用 O(n log n) 算法对数组进行排序,然后查看是否有任何元素线性重复超过 n/k 次,但这是 O(n log n) 而不是 O(n log k)
我还发现并在一定程度上理解了一种 O(nk) 方法,方法是创建一个与输入数据类型相同的数组和一个 k 长的 int。然后将每个元素放入一个空元素中,增加它的计数器,或者如果它匹配其中的一个元素,增加它的计数器,直到我们到达第 k+1 个唯一元素,此时你将所有计数器减 1,直到一个达到 0,此时它是被认为是空的,可以将新元素放入其中。依此类推,直到输入数组的末尾。然后检查我们完成后剩下的所有元素,看看它们是否出现超过 n/k 次。但由于这涉及检查 n 个原始元素与所有 k 个新数组元素,它是 O(nk)。关于如何在 O(n log k) 中解决这个问题的任何提示?我认为 O(nk) 算法符合他希望我们思考的方式,但我不确定从这里去哪里。
【问题讨论】:
-
感谢 avi cohen,您的想法帮助我走上了正确的道路,但在将其划分为小节而不进行 nk 比较后,在弄清楚如何进行操作时遇到了一些问题,但最终还是解决了
标签: algorithm