时间总让我有后知后觉的挫感,而我,总是习惯于四处张望。
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)。
时间: 2024-10-06 21:19:41