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

    宁可孤独,也不违心。宁可抱憾,也不将就。
  • 相关阅读:
    Spring Cloud
    Java/Android 网络请求框架/库
    Spring Roo 想知道源码,怎么实现自动生成枯燥的有规律的文件
    win10操作系统系统,小米路由器,小米3 的问题
    IntelliJ IDEA
    Spring Boot
    echart 插件实现全国地图
    安装AndroidJDK的坑
    小程序进阶之路
    关于echart柱形图的使用问题
  • 原文地址:https://www.cnblogs.com/fei-er-blog/p/4812116.html
Copyright © 2011-2022 走看看