我在解决这个常见问题时遇到了一些麻烦:
给定n个盒子,每个盒子里面都有一个隐藏号码,以及一个测试程序,决定两个盒子是否包含相同或不同的数字,确定大多数盒子中是否有一个数字,即是否有超过n / 2个盒子,在O(n log n)时间内具有相同的隐藏号码。
我知道摩尔的投票算法,但这个问题似乎略有不同。
答案 0 :(得分:6)
您可以按原样使用Moore的投票算法(在O(n)时间和O(1)空间中完成)。
我们将从起始位置扫除序列。
当我们扫过时,我们保持一对由当前候选人和一个计数器组成。最初,当前候选人是未知的,计数器为0。
当我们将指针向前移动到元素
e
上时:
- 如果计数器为0,我们将当前候选人设置为
e
,我们将计数器设置为1.- 如果计数器不为0,我们根据
e
是否是当前候选者来递增或递减计数器。当我们完成时,如果有多数,则当前候选人是多数元素。
在某些情况下,您知道或假设有多数元素。
但是如果你必须确认所选元素确实是多数元素,那么你必须再通过数据进行一次线性传递。
由于此算法仅涉及检查当前候选项是否与e
匹配,因此只需进行相等检查即可。
要检查最终候选者是否是多数元素,只需进行另一次传递,将每个元素与候选者进行比较并计算匹配数。如果匹配数大于n / 2,则确实找到了多数元素。