Boyer-Moore多数投票算法的第二轮要求

时间:2017-10-07 00:02:09

标签: c++ algorithm boyer-moore

我正在研究Boyer-Moore算法(来自here)并且我有一个简单的问题 - 第二遍的需要是什么(基本上只是通过找到频率来确认'该元素)。第一次传递保证是不是找到的元素占多数?我考虑了几个例子,感觉一次通过就足够了。你能不能提供一些例子来反驳我的感受?

代码(如果需要)如下:

int majorityElement(vector<int>& nums) {
    int candidate=0, count=0;

    for(auto value: nums) {
        //update the candidate if the count == 0
        if(count==0)
            candidate=value;

        //if the value == candidate then increment count
        if(value==candidate)
            count++;
        else
        //decrement count
            count--;
    }

    //return candidate
    return candidate;
}

编辑:如果我理解正确,该算法仅适用于多数元素的频率确实大于(vector size())/2的情况。那么,真的需要第二次通过吗?每当我们编码时,我们会进行一些简单的健全性检查(比如检查输入向量是否为空),所以在这种情况下,为什么我们要进行健全检查&#39;作为算法的一部分?或者还有更多的东西吗?

2 个答案:

答案 0 :(得分:1)

我认为Boyer-Moore算法的以下直觉可能会说明为什么需要两次传递。

该算法基于以下思想。想象一下,阵列中的每个元素都是一个房间里的人,上面有一个带有数字的卡片。房间里的每个人都四处闲逛,直到遇到别人。如果两个人拿着不同的号码,他们每个人都会坐下来。否则,他们会一直四处走动,直到遇到别人为止。最终,将有一些人留下来。

如果有一个真正的多数元素,那么最后一个人的群体肯定会拥有多数元素,因为无论人们如何配对,大多数人都被淘汰了。但是,如果没有多数人,那么最后仍然可能有人留下非多数元素。例如,也许他们碰巧没有遇到任何具有不同价值的人,而其他人都坐下来。

第二遍的原因是区分这两种情况。如果有多数,它必须最终成为最终候选人。如果没有,有些东西可能最终成为最终候选人,你需要对此案进行裁决。

答案 1 :(得分:0)

我猜你对多数元素的含义感到困惑。候选人只有在其频率超过总列表的一半时才有资格,即

if frequency(majority_element) > total_size_of_list / 2: return True

第一关只获得多数投票的候选人。第二遍确认它是否真的是多数元素。

例如: - 在以下列表中

[1, 2, 2, 3, 3, 4, 4, 5, 5, 5]

多数元素的可能候选者是5。 但是列表中的频率为5仅为3,小于列表大小的一半,因此它不是多数元素,因此测试失败,但如果不进行第二次传递,您甚至不会知道它。 / p>

我希望它有所帮助!