据我所知,摩尔的投票算法找到了多数元素有2个部分 -
因此时间复杂度为: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)迭代保存在数组上。
如果我错过了什么,请告诉我?
答案 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 ;;这就是为什么需要第二次传球。
如果某人拥有绝对多数,那么它最终会显示为当前候选人(简单含义)。
你最终总会得到一名候选人,但如果没有获胜者,那么它可能只有一票。