如果存在这样的元素,则多数表决算法决定序列中的哪个元素占多数。这是我在试图理解它时发现的最常被引用的链接。
http://www.cs.utexas.edu/~moore/best-ideas/mjrty/index.html
此外,我们在这里有一个讨论问题的链接:
How to find the element of an array that is repeated at least N/2 times?
问题是标记为正确的答案是错误的。请注意,该问题实际上允许输入具有单个元素的完全 N / 2个副本(不一定大于 N / 2,如通常在多数元素检测算法中所假设的那样)
我复制了代码并尝试使用[1,2,3,2]和[1,2,3,2,6,2]等输入(生成3和6的结果)。这实际上也适用于上面引用的算法(返回“无多数元素!”)。问题在于:只要多数元素和其他任何元素之间存在交替,就会选择数组中不是多数元素的最后一个元素。请更正我的错误想法,并告诉我如何在实施中避免它。
答案 0 :(得分:11)
算法正确:您的示例中没有多数元素。只有当元素超过 50%的值时,元素才占多数。
如果您希望检测最常见元素的计数为N/2
的情况,那么我在单行和O(1)
空间中看不到任何方法。我最好的尝试是:
答案 1 :(得分:3)
好的,所以我想我现在明白@sverre正在做什么。这是一个证明它有效的证据:
如果确切的N/2
元素具有相同的值(请调用此值m
),则N
必须为偶数。
将这些元素拆分为两部分:第一个N-1
元素和最后一个元素。鉴于总共N/2
个元素等于m
,则:
m
,在这种情况下,N/2
元素的N-1
等于m
,因此第一个N-1
元素绝对多数m
;或m
,在这种情况下,(N/2)-1
个元素的N-1
等于m
,因此第一个N-1
元素执行没有严格的多数。
在案例1)中,m
是处理最后一个元素之前的候选者(因为在那时,我们刚刚处理了N-1
元素,我们知道严格在这种情况下确实存在多数,因此候选人必须是正确答案。)
在案例2)中,m
是最后一个元素。 (这是令我困惑的部分:在算法的通常实现中,这不一定会成为处理的候选者。)
所以:
对于绝对多数(> N/2
元素相同),答案(如果存在)是最终候选人。
对于非严格多数(>= N/2
元素相同),答案(如果存在)是以下之一: