一尘不染

线性时间多数算法?

algorithm

谁能想到线性时间算法来确定元素列表中的多数元素?该算法应使用O(1)空间。

如果n是列表的大小,则 多数元素 是至少出现ceil(n / 2)几次的元素。

[Input] 1, 2, 1, 1, 3, 2

[Output] 1

[编者注] 该问题存在技术错误。我宁愿离开它,以免破坏已接受答案的措辞,从而纠正错误并讨论原因。请检查接受的答案。


阅读 271

收藏
2020-07-28

共1个答案

一尘不染

我猜想,Boyer-
Moore算法(由nunes链接并由cldy在其他答案中描述)是该问题的预期答案。但是问题中“多数元素”的定义太弱,无法保证算法能够正常工作。

如果n是列表的大小。多数元素是至少发生ceil(n / 2)次的元素。

如果 存在这样的元素, Boyer-Moore算法会找到具有 严格
多数的元素。(如果您事先不知道确实有这样一个元素,则必须再次遍历列表以检查结果。) __

对于严格的大多数,您需要“ …严格超过下限(n / 2)次”,而不是“ …至少大于ceil(n / 2)次”。

在您的示例中,“ 1”出现3次,其他值出现3次:

输入示例:1、2、1、1、1、3、2

输出1

但您需要4个元素,且它们的值必须严格相等。

它确实在这种特殊情况下起作用:

输入:1、2、1、1、3、2
读取1:count == 0,因此将候选者设置为1,并将count设置为1
读取2:计数!= 0,元素!=候选值(1),所以递减计数为0
读取1:count == 0,因此将候选者设置为1,并将count设置为1
读取1:计数!= 0,元素==候选(1),所以将计数增加到2
读取3:计数!= 0,元素!=候选(1),因此将计数减为1
读取2:计数!= 0,元素!=候选值(1),所以递减计数为0
结果是当前候选:1

但是,如果将最后的“ 1”和“ 2”交换掉,会发生什么情况:

输入:1、2、1、2、3、1
读取1:count == 0,因此将候选者设置为1,并将count设置为1
读取2:计数!= 0,元素!=候选值(1),所以递减计数为0
读取1:count == 0,因此将候选者设置为1,并将count设置为1
读取2:计数!= 0,元素!=候选值(1),所以递减计数为0
读取3:count == 0,因此将候选者设置为3,并将count设置为1
读取1:计数!= 0,元素!=候选(3),因此将计数递减为0
结果是当前候选人:3
2020-07-28