问题是:
描述一种算法,该算法在O(n)时间内找到n个数组中的数字,这个数字出现的次数超过n / 8次。
现在我有了答案:
我们将选择地点中的数字:n / 9,2 * n / 9,3 * n / 9,...,8 * n / 9,然后检查这8个候选中的一个是否出现至少n / 8次。
但我不明白为什么这个算法会起作用。
例如,请考虑以下数组: [3,3,1,3,2,3,4,3,5,3,6,3,7,3,8,3,9,3]。
所以这里n = 18,如果对于这个算法,候选者将是1,2,4,5,6,7,8,9,当我们检查这些数字是否至少出现n / 8倍时答案是否定的,但实际上答案是肯定的。
所以我不明白为什么这个算法正确...
答案 0 :(得分:0)
这里的关键见解是Select,特别是大写时,具有特殊含义:它引用了在未排序数组中查找第k个最大条目的问题。也许有点令人惊讶的先验,这可以在线性时间内完成,例如使用5的中间旋转策略结合QuickSelect算法。因此,如果您选择带有大写字母S的n / 9,2n / 9,...条目(成本:9 *线性 - 这是线性的),您肯定会发现任何出现n / 8次的条目。然后再次遍历您的数组以计算每个候选项的出现次数,并在此之前完成。