Boyer-Moore多数投票算法的第二次通过要求
Requirement of second pass for the Boyer-Moore Majority Vote Algorithm
我正在研究Boyer-Moore算法(从这里开始),我有一个快速的问题-第二遍需要什么(本质上只是通过找到元素的频率来"确认")。第一个pass本身难道不能保证找到的元素是多数元素吗?我考虑了几个例子,觉得一次传球就足够了。你能提供一些例子来反驳我的感受吗?
代码(如果需要)如下:
int majorityElement(vector<int>& nums) {
int candidate=0, count=0;
for(auto value: nums) {
//update the candidate if the count == 0
if(count==0)
candidate=value;
//if the value == candidate then increment count
if(value==candidate)
count++;
else
//decrement count
count--;
}
//return candidate
return candidate;
}
编辑:如果我理解正确,该算法仅适用于多数元素的频率确实大于(vector size())/2
的情况。那么,真的需要第二次传球吗?每当我们编码时,我们都会进行一些琐碎的健全性检查(比如检查输入向量是否为空),那么在这种情况下,为什么我们要将"健全性检查"作为算法的一部分呢?或者还有其他的东西吗?
我认为以下对Boyer-Moore算法的直觉可能会揭示为什么需要两次通过。
该算法基于以下思想。想象一下,你的阵列中的每个元素都是一个人在房间里拿着一张上面有数字的卡片。房间里的每个人都在四处游荡,直到遇到其他人。如果两个人持有不同的号码,他们各自坐下来。否则,他们会一直四处走动,直到遇到其他人。最终,会有一些人站着。
如果有一个真正的多数元素,最后站着的那一组人肯定会有多数元素,因为无论人们如何配对,大多数人中的人太多了,他们都不可能被淘汰。但如果没有多数票,可能还会有人站在最后,持有非多数票。例如,也许他们只是碰巧在其他人坐下来的时候没有遇到任何有不同价值观的人。
第二次通过是为了区分这两种情况。如果真的有多数票,它就必须最终成为最终的候选人。如果没有,某个东西可能仍然是最终的候选人,你需要排除这种情况。
我想你对什么是多数元素感到困惑。只有当候选元素的频率超过总列表的一半时,即,它才符合条件
if frequency(majority_element) > total_size_of_list / 2: return True
第一次通过只会让可能的候选人获得多数票。第二次通过确认它是否真的是多数元素。
例如:-在以下列表中
[1, 2, 2, 3, 3, 4, 4, 5, 5, 5]
多数元素的可能候选者是5。但列表中5的频率仅为3,不到列表大小的一半,因此它不是多数元素,因此测试失败,但如果你不进行第二次测试,你甚至不会知道。
我希望它能有所帮助!
如果你只想找到比第一遍重复n/2以上的元素来完成的工作,那么当你必须将元素与上限进行比较时,我认为需要第二遍
- 如何从给定字符串中删除第二次和第三次出现的$
- getopt_long_only第二次调用时返回 -1
- 读取文件在第二次调用时返回INVALID_HANDLE
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 解释为什么第二次分配会改变性能
- 当再次触发信号时,从Qt插槽执行的功能被第二次调用时会发生什么?
- 如何防止GUI挂起,同时允许第二次操作与Qt中的第一次操作一起执行
- 如何找到数组中值倒数第二次出现的索引
- arm_data在第二次运行我的程序时中止失败,然后
- Java 套接字读取在第二次读取时返回奇怪字符
- 提升 Asio SSL 无法第二次接收数据(第一次确定)
- CUDA 内核在第二次运行时运行得更快 - 为什么?
- 第二次调用 PyObject_CallObject() 失败
- 第二次运行C++时无法编译
- 第二次创建命令缓冲器时,在VKCMDDrawIndex中进行了segfault
- 我的C 程序第二次运行时首先编写文件内容
- SQLite3 第二次无法正常工作
- 第二次呼叫SDL_BlitSurface时出现故障
- Boyer-Moore多数投票算法的第二次通过要求
- 实施第二次机会需求页面替换算法