对拼消耗【Boyer-Moore Majority Vote Algorithm】

有幸博得一用,特引之为文

对拼消耗 ~ 摩尔投票法

每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个。

故事阐述 + 算法实例

故事阐述

一个由不同王国组成的世界中,人数是一个定值且不同王国中的人战斗力都一致。某一天,发生了世界大战,王国之间互相都不信任,更不互相联盟。战场上,都冲到了一起,不同王国的人同归于尽,相同王国的人互不伤害。到最终,战争结束的时候,世界上将属于那个当初拥有超过半数人口的国家。

  1. 总人数固定;
  2. 战斗力一致;
  3. 亡异存同。

算法实例

在这里插入图片描述
①从索引为 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

posted @ 2020-01-18 17:38  Roko&Basilisk  阅读(141)  评论(0编辑  收藏  举报