查找具有隐藏元素的数组中的多数元素

时间:2013-10-16 14:02:22

标签: algorithm

我在解决这个常见问题时遇到了一些麻烦:

给定n个盒子,每个盒子里面都有一个隐藏号码,以及一个测试程序,决定两个盒子是否包含相同或不同的数字,确定大多数盒子中是否有一个数字,即是否有超过n / 2个盒子,在O(n log n)时间内具有相同的隐藏号码。

我知道摩尔的投票算法,但这个问题似乎略有不同。

1 个答案:

答案 0 :(得分:6)

您可以按原样使用Moore的投票算法(在O(n)时间和O(1)空间中完成)。

取自Moore's own website

  

我们将从起始位置扫除序列。

     

当我们扫过时,我们保持一对由当前候选人和一个计数器组成。最初,当前候选人是未知的,计数器为0。

     

当我们将指针向前移动到元素e上时:

     
      
  • 如果计数器为0,我们将当前候选人设置为e,我们将计数器设置为1.
  •   
  • 如果计数器不为0,我们根据e是否是当前候选者来递增或递减计数器。
  •   
     

当我们完成时,如果有多数,则当前候选人是多数元素。

Later in that example

  

在某些情况下,您知道或假设有多数元素。

     

但是如果你必须确认所选元素确实是多数元素,那么你必须再通过数据进行一次线性传递。

由于此算法仅涉及检查当前候选项是否与e匹配,因此只需进行相等检查即可。

要检查最终候选者是否是多数元素,只需进行另一次传递,将每个元素与候选者进行比较并计算匹配数。如果匹配数大于n / 2,则确实找到了多数元素。