O(n)算法找出出现超过n / 2次的元素

时间:2010-12-21 03:25:48

标签: c++

我在一次采访中被要求给出一个O(n)算法来打印一个在数组中出现超过n / 2次的元素,如果有这样的元素的话。 n是数组的大小。 我对如何做到这一点没有任何线索。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:15)

这是Boyer's Voting algorithm

太空中也是O(1)!

修改

对于抱怨网站配色方案的人(像我一样)...... here is the original paper

答案 1 :(得分:0)

在伪代码中:

int n = array.length
Hash<elementType,int> hash
foreach element in array
    hash[element] += 1
foreach entry in hash
    if entry.value > n/2
        print entry.key
        break

答案 2 :(得分:0)

它也是中值,使用median-of-medians algorithm获取O(n)。在C ++中,您可以在一行中执行此操作:

std::nth_element(begin, begin + n/2, begin + n)