Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 多数投票算法-错误?_C_Algorithm - Fatal编程技术网

C 多数投票算法-错误?

C 多数投票算法-错误?,c,algorithm,C,Algorithm,多数投票算法决定序列中的哪个元素占多数,前提是存在这样一个元素。这是我试图理解它时发现的最常被引用的链接 此外,我们这里有一个链接讨论这个问题: 问题是标记为正确的答案是错误的。请注意,该问题实际上允许输入具有单个元素的N/2个副本(不必像多数元素检测算法中通常假设的那样超过N/2) 我复制了代码,并使用[1,2,3,2]和[1,2,3,2,6,2]等输入进行了尝试(生成3和6的结果)。这实际上也适用于上面引用的算法(它返回“No-mousion Element!”)。问题是:只要多数元素和

多数投票算法决定序列中的哪个元素占多数,前提是存在这样一个元素。这是我试图理解它时发现的最常被引用的链接

此外,我们这里有一个链接讨论这个问题:

问题是标记为正确的答案是错误的。请注意,该问题实际上允许输入具有单个元素的N/2个副本(不必像多数元素检测算法中通常假设的那样超过N/2)


我复制了代码,并使用[1,2,3,2]和[1,2,3,2,6,2]等输入进行了尝试(生成3和6的结果)。这实际上也适用于上面引用的算法(它返回“No-mousion Element!”)。问题是:只要多数元素和其他元素之间存在交替,就会选择数组中不是多数元素的最后一个元素。如果有错误的想法,请纠正,并告诉我如何在实现中避免错误。

算法是正确的:示例中没有多数元素。只有当元素超过值的50%时,该元素才占多数

如果您希望检测最频繁元素的计数为
N/2
,那么我看不到任何方法可以在一次传递和
O(1)
空间中进行检测。我最好的尝试是:

  • 运行与前面相同的算法,但也要记住前面的候选算法
  • 如果您在最后一个元素切换,那么正确的答案是您当前的或以前的候选人
  • 运行另一个过程,计算每个过程的数量,并进行比较

    • 好的,我想我现在明白@sverre的意思了。这里有一个证明它是有效的:

      • 如果
        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
        元素相同),答案(如果存在)是以下之一:

      • 最终候选人;或
      • 处理最后一个元素之前的候选元素;或
      • 最后一个元素

      +1用于快速智能解决方案。我已经尝试了所有可能的情况,你的算法运行良好。谢谢……请您用
      [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],你能解释一下这个逻辑是如何工作的吗?