bf算法

BF算法与KMP算法(字符串匹配算法)

折月煮酒 提交于 2020-02-29 11:18:32
BF算法 BF算法,简称暴力破解 Bruce Force ,又称朴素模式的匹配算法。 可以看出BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配, 若相等,则继续比较S的第二个字符和T的第二个字符; 若不相等,则比较S的第二个字符和T的第一个字符,依次比较,直到得出最后的匹配结果。 这种算法的比较很暴力,由于产生了多次的回溯,在效率上存在很大的缺陷。 时间复杂度O(m*n) 代码: 1 package bf; 2 3 public class Test { 4 public static void main(String[] args) { 5 String bf = "IloveChinveChia"; 6 String pattern = "veChi"; 7 int m = bf.length(); // i 8 int n = pattern.length(); // j 9 int i = 0, j = 0; 10 while (i < m) { 11 if (bf.charAt(i) == pattern.charAt(j)) { // 一一匹配时 12 i++; 13 j++; 14 } else { 15 i = i - j + 1; 16 j = 0; 17 } 18 if (i == m) 19 break; 20 if (bf.charAt

BF算法

人盡茶涼 提交于 2020-02-11 06:23:39
子串的定位运算通常称为 串的模式匹配 或串匹配。串的模式匹配设有两个字符串 S和T,设S为主串,也称正文串;设T为子串,也称为模式 。在主串S中查找与模式T相匹配的子串,如果匹配成功,确定相匹配的子串中的 第一个字符在主串S中出现的位置 。 著名的模式匹配算法有BF算法和KMP算法,先介绍BF算法。 BF算法是最简单直观的模式匹配算法,模式匹配不一定从主串的第一个位置开始,可以指定主串中查找的起始位置 pos,如果用顺序存储结构,可以写出不依赖于其他串操作的模式匹配算法。 【算法步骤】 用指针i,j指示主串S和模式T中当前正待比较的字符位置,i初值为pos,j初值为1. 如果两个串均未比较到串尾,即i,j均别小于S和T的长度,循环执行以下操作: S.ch[i]和T.ch[j]比较,若相等,则i和j分别指示串中下个位置,继续比较后续字符; 若不等,指针后退重新开始匹配,从主串的下一个字符( i= i - j + 2)起再重新和模式的第一个字符(j = 1) 比较 如果 j > T.length,说明模式T中的每个字符依次和主串S中的一个连续的字符序列相等,匹配成功,返回和模式T中第一个字符相等的字符在主串S中的序号(i - T.length);否则称匹配不成功,返回0. 【算法描述】 int index_BF ( SString S , SString T , int pos ) {

用Java实现BF算法

佐手、 提交于 2020-01-31 20:30:46
问题:找出字符串t在字符串s中的起始位置 1. BF算法1:从第一个位置开始匹配 package demo03; public class BF2 { public static void main(String[] args) { String s = "我爱学习java"; //定义一个字符串 String t = "t"; //定义被查询的字符串 int result = index_BF(s, t) + 1; //定义一个整型保存调用index_BF后的返回值,“+1”的意思:数组下标从0开始,而我们日常生活中习惯从1开始 if (result == 0) { System.out.println("在 " + s + " 中未查询到:" + t); } else { System.out.println(t + " 在 " + s + " 中的位置为:" + result); } } //index_BF方法,用来查询字符串t在字符串s中的位置 private static int index_BF(String s, String t) { char[] charS = s.toCharArray(); //把字符串s转换成字符型数组 char[] charT = t.toCharArray(); //把字符串t转换为字符型数组 int i = 0, j = 0;

BF算法、KMP算法及思想

回眸只為那壹抹淺笑 提交于 2020-01-31 08:38:34
BF算法 当我们在进行字符串匹配时,我们会把主串和模式串,从某个位置,我们记为【pos】,开始匹配,每匹配成功一个字符,就让 i 加一。可一旦“失配”,我们就会让i回溯,从pos的下一个字符开始,重新执行上面的过程,直到模式串被匹配完。 int Index_BF ( string str1 , string str2 , int pos = 1 ) { int i = pos , j = 1 ; while ( i < str1 . length ( ) && j < str2 . length ( ) ) { if ( str1 [ i ] == str2 [ j ] ) { i ++ ; j ++ ; } else { pos ++ ; i = pos ; j = 1 ; } } if ( j == str2 . length ( ) ) return i - j + 1 ; else return 0 ; } KMP算法 KMP算法的精髓所在,就是当“失配”时,不需要将i重新回溯到pos的下一个。 而是将模式串向右滑行,尽可能远的距离。因为在模式串中,当“失配”时,如果当前“失配”字符的前k个字符,和模式串的最开始的k个字符,如果相等,那么这k个字符,是不需要再进行比较的,直接让主串的第i个字符,和模式串的第k+1个字符开始比较就可以了。 比如当我们比较 i从8到15

KMP算法

℡╲_俬逩灬. 提交于 2019-12-27 00:02:17
KMP算法 在介绍KMP算法之前,先介绍一下BF算法。 一.BF算法 BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。 举例说明: S: ababcababa P: ababa   BF算法匹配的步骤如下 i=0 i=1 i=2 i=3 i=4 第一趟: a babcababa 第二趟:a b abcababa 第三趟:ab a bcababa 第四趟:aba b cababa 第五趟:abab c ababa a ba ba a b aba ab a ba aba b a abab a j=0 j=1 j=2 j=3 j=4(i和j回溯) i=1 i=2 i=3 i=4 i=3 第六趟:a b abcababa 第七趟:ab a bcababa 第八趟:aba b cababa 第九趟:abab c ababa 第十趟:aba b cababa a baba a baba a b aba ab a ba a baba j=0 j=0 j=1 j=2(i和j回溯) j=0 i=4 i=5 i=6 i=7 i=8 第十一趟:abab c ababa 第十二趟:ababc a baba 第十三趟

BF算法与KMP算法

时光总嘲笑我的痴心妄想 提交于 2019-12-26 11:14:43
BF(Brute Force)算法 是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。 BF算法实现: 1 int BF(char S[],char T[],int pos) 2 {//c从第pos位开始搜索匹配 3 int i=pos,j=0; 4 while(S[i+j]!='\0'&&T[j]!='\0') 5 { 6 if(S[i+j]==T[j]) 7 j++; 8 else 9 { 10 i++; 11 j=0; 12 } 13 } 14 if(T[j]=='\0') 15 return i+1; 16 else 17 return -1; 18 } BF算法比较直接,是一种蛮力算法,该算法最坏情况下要进行M*(N-M+1)次比较,时间复杂度为O(M*N),下面来看一个效率非常高的字符串匹配算法,即KMP算法。KMP算法完成的任务是:给定两个字符串S和T,长度分别为n和m,判断f是否在S中出现,如果出现则返回出现的位置。常规方法是遍历a的每一个位置,然后从该位置开始和b进行匹配,但是这种方法的复杂度是O(nm)。kmp算法通过一个O(m)的预处理,使匹配的复杂度降为O(n+m)

BF算法 + KMP算法

我们两清 提交于 2019-12-23 10:25:31
准备: 字符串比大小:比的就是字符串里每个字符的 ASCII码的大小 。(其实这样的比较没有多大的意义,我们关心的是字符串是否相等,即 匹配 等) 字符串的存储结构: 同线性表(顺序存储+链式存储)    顺序存储结构是一组地址连续的存储单元来存储字符串中的字符序列 ;按照预定义的大小,为每个定义的字符串变量分配一个固定长度的存储区,一般用定长数组来定义。——空间分配不灵活,但是字符串一般都是连在一起表述的,”断章取义“的情况并不多,所以习惯上我们还是会 直接定义一个足够长度的存储区来存储 。   链式存储结构   BF算法:   BoyFriend 、Brute Force   朴素的 模式匹配 算法,其核心思想是:   ——有两个字符串S和T,长度分别为N和M。首先S[1]和T[1]比较,若相等,则再比较S[2]和T[2],一直到T[M]为止;若S[1]和T[1]不等,则T向右移动一个字符位置,与S[2]进行比较,而后再依次进行比较。   ——该算法 最坏情况下要进行M*(N-M+1)次比较,时间复杂度为O(M*N) 。____效率低下。 (注:在这里S为主串,T为子串,这种子串的定位操作通常称作串的模式匹配)   存在回溯,需要重头来过,效率低下。 KMP算法:   克努特-莫里斯-普拉特算法,大大的 避免重复遍历 的情况( 避免不必要的回溯 )    问题由模式匹配串(子串

数据结构:BF算法

♀尐吖头ヾ 提交于 2019-12-04 05:33:33
贴上源代码: #include<iostream> using namespace std; int BF(char S[],char T[]) { int i,j; i = j = 0; while(S[i]!='\0'&&T[j]!='\0'){ if(S[i]==T[i]){ i++; j++; } else{ j = 0; i = i-j+1; } } if(T[j]=='\0') return i -j+1; else return 0; } int main() { //BF cout<<BF("abcabcccc","abc"); return 0; } 这是一种低效的模式匹配算法。叫做BF算法。 主要思想十分简单: 给出两个字符串,分别为主串S和子串T,记下标为i,j。分别从第一个字符开始比较(即i=j=0)。当S[i]==T[j]时,继续比较下一个;当S[i]!=T[j]时,j=0(重新从头开始比较子串),i的值赋为i-j+1。(关于为什么,我们接下来说)。如果S[i]=='\0'了,证明主串比较完毕了,但是没有找到匹配的,即S不含有T,那么返回0;如果T[j]=='\0'了,证明子串比较完毕了,也就是主串S中含有子串T。此时返回子串T在主串S中出现的第一个字符的位置,即返回i-j+1 图示如下: 画图的时候两个串的最后都有‘\0’!!!!因为字符串的最后一位不是

串的两种模式匹配方式(BF/KMP算法)

╄→гoц情女王★ 提交于 2019-12-03 09:55:23
前言 串,又称作字符串,它是由0个或者多个字符所组成的有限序列,串同样可以采用顺序存储和链式存储两种方式进行存储,在主串中查找定位子串问题(模式匹配)是串中最重要的操作之一,而不同的算法实现有着不同的效率,我们今天就来对比学习串的两种模式匹配方式: 朴素的模式匹配算法(Brute-Force算法,简称BF算法) KMP模式匹配算法 朴素的模式匹配算法(BF算法) BF算法是模式匹配中的一种常规算法,它的思想就是: 第一轮 :子串中的第一个字符与主串中的第一个字符进行比较 若相等 ,则继续比较主串与子串的第二个字符 若不相等 ,进行第二轮比较 第二轮 :子串中的第一个字符与主串中第二个字符进行比较...... 第N轮 :依次比较下去,直到全部匹配 图示说明: 第一轮: 第二轮: ...... 原理一致,省略中间步骤 第五轮: 第六轮: 代码实现: 看完文字与图例讲解,我们来动手实现一个这样的算法 简单归纳上面的步骤就是: 主串的每一个字符与子串的开头进行匹配,匹配成功则比较子串与主串的下一位是否匹配,匹配失败则比较子串与主串的下一位,很显然,我们可以使用两个指针来分别指向主串和子串的某个字符,来实现这样一种算法 匹配成功,返回子串在主串中第一次出现的位置,匹配失败返回 -1,子串是空串返回 0 int String::bfFind(const String &s, int pos)

串匹配-BF和KMP算法

▼魔方 西西 提交于 2019-12-02 05:06:41
文章目录 串匹配-BF和KMP算法 BF算法 KMP算法 求next的算法 没想到今天是1024程序员节日,先祝大家节日快乐 希望有幸看到这篇文章的大佬们学的多不秃头(-。-) 串匹配-BF和KMP算法 串模式匹配即子串查找。设s和p是给定的两个字符串,在主串s中查找子串p的过程,成为模式匹配。如果在s中找到等于p的字串,则称匹配成功,函数返回p在s中首次出现的位置或序号,否则匹配失败,返回-1,p也称为模式串。 BF算法 解决这个问题,有两种算法,相对简单一种的叫做BF算法也叫简单匹配算法 BF算法的总体思路就是首先将s0与p0比较,若不相同,就将s1与p0比较,依次下去,直到si与p0相同,然后再比较之后的字符,就是将s(i+1)与p1比较,依次下去,若p比较到末尾,则匹配成功,若其中有一个字符不相等,则s回到本趟开始的一个字符位置,即s(i-j+1),继续下一趟的比较。 时间复杂度最好是O(n+m),最差为O(n*m) 代码如下: public static int KM(char[] s, char[] p){ int i = 0; int j = 0; while(i < s.length && j < p.length){ if (s[i] == p[j]){ i++; j++; } else { i = i-j+1; j = 0; } if (j > p.length