寻找多数元素的摩尔投票算法

时间:2015-05-08 05:34:27

标签: c++

据我所知,摩尔的投票算法找到了多数元素有2个部分 -

  1. 运行摩尔投票算法的第一部分只给你一个候选人,这个候选人最常出现"在给定数组中的时间。注意"大多数"这里。
  2. 在第二部分中,我们需要再次迭代数组以确定该候选是否出现最大次数(即大于/大小/ 2次)。 第一次迭代是找到候选人和第二次迭代是检查在给定数组中该元素是否多数出现。
  3. 因此时间复杂度为:O(n)+ O(n)。

    但是我只是想过而不是再次遍历数组来查找它是否超过数组大小/ 2次,我们不能做如下的事情?

    我正在使用maxOcc来跟踪当前的最大元素。最后如果maxOcc> size / 2然后我们的候选人是最大元素。这样我们就不需要按照算法的第二部分在整个阵列上再次迭代。 请告诉我这是好还是我遗失了什么?

    void findMajorityElement()
    {
        int arr[] = {10,8,8,8,8,8,8,10};
        int arrSize = 8;
        int mi = 0;
        int occ = 1;
        int maxOcc = 1;
        for(int i=1; i<arrSize-1; ++i)
        {
            if(arr[mi]==arr[i])
            {
                ++occ;
                ++maxOcc;
            }
            else
                --occ;
    
            if(occ == 0)
            {
                mi = i;
                occ = 1;
                maxOcc = 1;
            }
        }
    
        if(maxOcc > arrSize/2)
            cout <<"Majority element is "<<arr[mi]<<endl;
        else
            cout <<"Not Found!"<<endl;
    }
    

    这打印出Majority元素为8,因为它出现了6次。 因此,我们将第二步所需的其他O(n)迭代保存在数组上。

    如果我错过了什么,请告诉我?

2 个答案:

答案 0 :(得分:2)

您对所谓的内容的理解&#34;摩尔的投票算法&#34; (我还没有听说过这个名字,我用发明者的名字来称呼它,我相信它应该被称为Moore-Boyer's voting algorithm)。形式上,该算法具有O(n+n) = O(2n) = O(n)时间复杂度。

但是,您对算法的修改无法在我链接到的网页上找到示例的多数元素,即:A A A C C B B C C C B C C

int arr[] {1,1,1,3,3,2,2,3,3,3,2,3,3}; //A A A C C B B C C C B C C
int arrSize = 13;

这是因为算法要首先在O(n)中找到候选,然后检查它是否确实是多数元素,也在O(n)中。为了能够将当前元素检查为多数元素,您必须增加时间复杂度。

另外,请注意,通过按照定义的方式定义多数元素,即使元素之间存在其他元素,您也可以计算等于多数元素的元素(例如:C C B B C C C

答案 1 :(得分:1)

最初的问题并不是假设候选人的所有选票必须是连续的:如果是这样的话,你可以直接计算它们直到投票改变,你甚至可以在阅读整个数组之前宣布获胜者。

如果对候选人的投票不是连续的,那么你应该注意在

之后说
AAABBBC

现任候选人&#34;有1个好票,是&#34; C&#34 ;;这就是为什么需要第二次传球。

如果某人拥有绝对多数,那么它最终会显示为当前候选人(简单含义)。

你最终总会得到一名候选人,但如果没有获胜者,那么它可能只有一票。