对拼消耗【Boyer-Moore Majority Vote Algorithm】
有幸博得一用,特引之为文
对拼消耗 ~ 摩尔投票法
每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个。
故事阐述 + 算法实例
故事阐述
一个由不同王国组成的世界中,人数是一个定值且不同王国中的人战斗力都一致。某一天,发生了世界大战,王国之间互相都不信任,更不互相联盟。战场上,都冲到了一起,不同王国的人同归于尽,相同王国的人互不伤害。到最终,战争结束的时候,世界上将属于那个当初拥有超过半数人口的国家。
- 总人数固定;
- 战斗力一致;
- 亡异存同。
算法实例
①从索引为 0 的位置开始依次遍历,并将 result 赋值为 num[0];
②正在检索的值与 result 相同则通过计数器 +1;
③不同则通过计数器 -1;
④当 count 减为 0 的时候更新 result 为当前检索到的值。
class Solution {
public:
int majorityElement(vector<int>& nums) {
register int result(nums[0]), count = 1;
for (int i = 1;i < nums.size(); ++i) {
if (count == 0) {
result = nums[i];
count = 1;
}
else if (nums[i] == result) count++;
else count--;
}
return result;
}
};
到重头戏了
查找搜索
要查找的字符串越长,搜索效率越高
Boyer-Moore {简称BM}算法的重要性,观其应用足以见得,是目前被认为最高效的字符串搜索算法【比 KMP 快3 ~ 5 倍】,常用于文本编辑器中的搜索匹配功能
For Example:GNU grep 命令使用该算法,使得GNU grep 比 BSD grep 快
思想:有模式串中不存在的字符,那么肯定不匹配,往后多移动几位,提高效率
附上一个值得深入研究的 BM 算法介绍【共同学习】:https://blog.csdn.net/qq_21201267/article/details/92799488
让对手感动,让对手恐惧