C 多数投票算法-错误?
多数投票算法决定序列中的哪个元素占多数,前提是存在这样一个元素。这是我试图理解它时发现的最常被引用的链接 此外,我们这里有一个链接讨论这个问题: 问题是标记为正确的答案是错误的。请注意,该问题实际上允许输入具有单个元素的N/2个副本(不必像多数元素检测算法中通常假设的那样超过N/2)C 多数投票算法-错误?,c,algorithm,C,Algorithm,多数投票算法决定序列中的哪个元素占多数,前提是存在这样一个元素。这是我试图理解它时发现的最常被引用的链接 此外,我们这里有一个链接讨论这个问题: 问题是标记为正确的答案是错误的。请注意,该问题实际上允许输入具有单个元素的N/2个副本(不必像多数元素检测算法中通常假设的那样超过N/2) 我复制了代码,并使用[1,2,3,2]和[1,2,3,2,6,2]等输入进行了尝试(生成3和6的结果)。这实际上也适用于上面引用的算法(它返回“No-mousion Element!”)。问题是:只要多数元素和
我复制了代码,并使用[1,2,3,2]和[1,2,3,2,6,2]等输入进行了尝试(生成3和6的结果)。这实际上也适用于上面引用的算法(它返回“No-mousion Element!”)。问题是:只要多数元素和其他元素之间存在交替,就会选择数组中不是多数元素的最后一个元素。如果有错误的想法,请纠正,并告诉我如何在实现中避免错误。算法是正确的:示例中没有多数元素。只有当元素超过值的50%时,该元素才占多数 如果您希望检测最频繁元素的计数为
N/2
,那么我看不到任何方法可以在一次传递和O(1)
空间中进行检测。我最好的尝试是:
- 运行与前面相同的算法,但也要记住前面的候选算法
- 如果您在最后一个元素切换,那么正确的答案是您当前的或以前的候选人
- 运行另一个过程,计算每个过程的数量,并进行比较
- 如果
元素正好是相同的值(称此值为N/2
),则m
必须为偶数N
- 将这些元素分为两部分:第一个
元素和最后一个元素。假设共有N-1
个元素等于N/2
,则:m
- 最后一个元素不是
,在这种情况下,第一个m
元素的N-1
等于N/2
,因此第一个m
元素具有绝对多数N-1
;或m
- 最后一个元素是
,在这种情况下,第一个m
元素的N-1
等于(N/2)-1
,因此第一个m
元素没有严格的多数。N-1
- 在案例1中,
是处理最后一个元素之前的候选者(因为,在这一点上,我们刚刚处理了m
元素,我们知道在这种情况下确实存在严格多数,因此候选者必须是正确的答案)N-1
- 在案例2中,
是最后一个元素本身。(这是让我困惑的部分:在算法的通常实现中,这不一定会成为处理过程中的候选对象。)m
- 对于绝对多数(
元素相同),答案(如果存在)是最终候选>N/2
- 对于非严格多数(
元素相同),答案(如果存在)是以下之一:>=N/2
- 最终候选人;或
- 处理最后一个元素之前的候选元素;或
- 最后一个元素
- 好的,我想我现在明白@sverre的意思了。这里有一个证明它是有效的:
[1,2,3,2]
或[1,2,3,2,6,2]
(例如)的一个示例来说明这一点好吗?在这两种情况下,候选者都不会被设置为正确答案2,所以我不确定记住一个额外的候选者会有什么帮助。(也许我只是被你的措辞弄糊涂了——一个有效的例子会很有帮助。)[@MatthewSlattery]你完全正确,很抱歉没有更详细地解释这一点(实际上我是在纸上做的)。关键是:当计数器达到0时,通过立即确定下一个候选对象来解决这个问题。所以:[1]1,1[2]2,1[3]3,1[2]2,1[6]6,1[2]2,1。计算2和6(或另一个例子中的2和3)的出现次数实际上表明2是正确答案。请告诉我你对此的想法。。。谢谢你的回复:-)。如果给定的输入是[1,1,1,2,2,3,3,4,4],你能解释一下这个逻辑是如何工作的吗?