蛮力法-顺序查找和字符串匹配

时间总让我有后知后觉的挫感,而我,总是习惯于四处张望。

3.2.1 顺序查找

将数组中的元素和给定的查找键进行比较,直到成功匹配,或者遍历完整个数组,查找失败。可将查找键添加到数组末尾,这样就不必每次循环时都检查是否到达了表的末尾(然并卵,数组不方便在添加元素吧)。

代码实现:

/**
     * 顺序查找
     * @param array 对象数组
     * @param key 查找键
     * @return 查找成功返回元素下标,失败返回-1
     * */
    public static int sequentialSearch(int[] array,int key){
        int i=0;
        while(i<array.length&&array[i]!=key){
            i++;
        }
        if(i<array.length)
            return i;
        return -1;
    }

算法分析:

顺序查找有着蛮力法典型的优点(简单)和缺点(效率低),在最差情况和平均情况下,该算法都是一个线性算法。

3.2.2 字符串匹配

问题:给定一个n个字符组成的串,称为文本,一个m(m<=n)个字符的串,成为模式,从文本中寻找匹配模式的子串,求出文本中第一个匹配子串最左元素的下标。蛮力法实现该问题,将模式对准文本的前m个字符,然后从左到右匹配每一对字符,直到m对字符全部匹配,或匹配失败,则将模式右移一位,继续尝试匹配,直到匹配成功或与文本的最后m个字符匹配失败。

代码实现:

/**
     * 蛮力法字符串匹配
     * @param text 文本
     * @param pattern 模式
     * @return 返回文本中第一个匹配子串最左元素下标,匹配失败失败返回-1
     * */
    public static int bruteForceStringMatch(char[] text,char[] pattern){
        for(int i=0;i<(text.length-pattern.length+1);i++){
            int j=0;
            while(j<pattern.length&&text[i+j]==pattern[j]){
                j++;
            }
            if(j==pattern.length)
                return i;
        }
        return -1;
    }

算法分析:

最坏的情况,算法可能每次都要做m次比较,做n-m+1次移动,共m(n-m+1)次比较。所以此时算法属于θ(nm)。而对于自然语言文本中查找词的典型问题,我们可以认为大多数移动都发生在很少几次比较之后。所以算法的平均效率应该比最差效率好得多。事实上,在查找随机文本的时候,它能够显示出线性的效率θ(n+m),即θ(n)。

宁可孤独,也不违心。宁可抱憾,也不将就。
原文地址:https://www.cnblogs.com/fei-er-blog/p/4812116.html