假设,给定一个 n 元素多重集 A(未排序),我们需要一个 O(n) 时间算法来确定 A 是否包含多数元素,即在 A 中出现超过 n/2 次的元素。它是使用线性时间选择算法很容易在 O(n) 时间内解决这个问题(否则答案是“没有多数”)。现在考虑这个问题的以下概括:给定 A 和一个整数 k < n,我们想要一个算法来确定 A 是否包含一个在其中出现超过 n/k 次的值(如果存在许多这样的值,那么这就足够了找到其中之一)。为此设计一个算法,并将其复杂性分析为 n 和 k 的函数。你在这个问题上的成绩将取决于你的算法有多快(当然它也必须是正确的)。对于 O(kn) 时间算法,部分计分 10 分,对于 O(n log k) 时间算法,全部计分。
现在我已经为这个问题提出了 2 个解决方案,但都不能完全满足 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) 算法符合他希望我们思考的方式,但我