当我读到这个(查找数组中最常见的条目)的时候,Boyer和Moore线性时间投票算法被建议了。
如果您按照链接到该站点,将逐步解释该算法是如何工作的。对于给定的序列,AAACCBBCCCBCC给出了正确的解决方案。
当我们将指针向前移动到元素e上时:
当我们完成时,目前的候选人是多数,如果有多数。
如果我把这个算法用在一张纸上,用AAACCBB作为输入,那么推荐的候选人就会变成B,这显然是错误的。
在我看来,有两种可能性
AAACCBBCCCBCC,作者从来没有尝试过他们的算法,它们完全没有能力,应该被当场发射(怀疑是完全错误的)。注意:这是一个来自Niek Sanders的算法的C++实现。我相信他正确地实现了这个想法,因此它也有同样的问题(或者不是吗?)
发布于 2009-04-23 09:28:40
该算法只有在集合占多数时才能工作--超过一半的元素是相同的。在您的示例中,AAACCBB没有这样的多数。最常见的字母发生3次,字符串长度为7。
发布于 2013-07-03 13:16:09
这是对其他解释的一个小但重要的补充。摩尔投票算法分为两部分-
第一次迭代是查找候选项,第二次迭代是检查该元素在给定数组中是否发生了大部分时间。
所以时间复杂度是:O(n) + O(n) ≈ O(n)
发布于 2009-04-23 09:31:05
从第一个相互关联的问题:
具有数组中半数以上的条目等于N的属性
来自Boyer和Moore的页面:
序列中的哪一个元素占大多数,只要有这样的元素。
这两种算法都明确地假设一个元素发生至少N/2次。(请特别注意,“多数”与“最常见”并不相同。)
https://stackoverflow.com/questions/780937
复制相似问题