zoukankan      html  css  js  c++  java
  • 蛮力法-顺序查找和字符串匹配

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

    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)。

    宁可孤独,也不违心。宁可抱憾,也不将就。
  • 相关阅读:
    (MonoGame从入门到放弃2) 初识MonoGame
    C# 13行代码带你模拟登录QQ空间
    (MonoGame从入门到放弃1) MonoGame环境搭建
    Format 、FormatDateTime 与 FormatFloat
    HTML中的em为何物?
    ASP.NET日期格式函数
    解决windows2003不能上传大于200K的问题
    信用卡知识知多少?
    解决:Win7打开控制面板主页就重启
    ASP.NET生成随机密码
  • 原文地址:https://www.cnblogs.com/fei-er-blog/p/4812116.html
Copyright © 2011-2022 走看看