串、串的模式匹配算法(子串查找)BF算法、KMP算法


串的定長順序存儲
#define MAXSTRLEN 255,//超出這個長度則超出部分被舍去,稱為截斷

串的模式匹配:


串的定義:0個或多個字符組成的有限序列
S = 'a1a2a3…….an '
n = 0時為空串
串的順序存儲結構:字符數組,串的長度就是數組末尾‘\0'前面的字符個數
數組需在定義時確定長度,有局限性
數組的最大長度
二:串的堆分配存儲表示
typedef struct {
char *ch;
//若是非空串,則按串長分配存儲區
//否則ch為空
int length; //串長度
}HString;
系統利用函數mallloc和free進行串值空間的動態分配,由此產生的新串
其實是系統先為新生成的串分配一個存儲空間,然后進行串的復制(這是C語言的串類型
的存儲方式)

三、串的塊鏈存儲方式

 1 #define CHUNKSIZE 80
 2 typedef struct Chunk{    //結點結構
 3 char ch[CHUNKSIZE];
 4 struct Chunk* next;
 5 }Chunk;
 6 
 7 typedef struct {    //串的鏈表結構
 8 Chunk*head, *tail;    //串的頭和尾指針
 9 int curlen;    //串的當前長度
10 }LString;

data | 指針
1byte 4byte
1/5存儲密度

4.3串的模式匹配算法(子串查找)
BF算法:朴素算法

 1 int Index(SString S, SString T, int pos)
 2 {
 3 i = pos; j = 1;
 4 while(i <= s[0] && j <= T[0])
 5 {
 6 if(s[i] == T[j])
 7 {
 8 ++i;
 9 ++j;
10 }
11 else    
12 {
13 i = i - j + 2;    //i指針回溯
14 j = 1;    //指針后退重新開始匹配
15 }
16 if(j > T[0])
17 return i - T[0];
18 else
19 return 0;
20 }
21 }

 

 1 int Index(SString S, SString T, int pos)
 2 {
 3 for(i = pos; i <= S[0] - T[0]; i++)
 4 {
 5 int k = i;
 6 for(j = 1; j <= T[0]; j++)
 7 {
 8 if(S[i] == T[j])
 9 {
10 i++;
11 j++;
12 }
13 else
14 {
15 i = k;
16 break;
17 }
18 }
19 if(j > T[0])
20 return i - T[0];
21 else
22 return 0;
23 }
24 }

 

二、首尾匹配算法
先比較模式串的第一個字符
再比較模式串的最后一個字符
最后比較比較模式串中第二個得到倒數第二個之間的字符
算法復雜度和第一種一樣O((n-m+1)m)

三、KMP算法
時間復雜度可達到O(m+n)

 1 int Index(SString S, SString T, int pos)
 2 {
 3 i = pos; j = 1;
 4 while(i <= s[0] && j <= T[0])
 5 {    
 6 //j == 0說明上次比較時第一個字符就不等next[1] = 0
 7 if(j == 0 || s[i] == T[j])
 8 {
 9 ++i;
10 ++j;
11 }
12 else    
13 {
14 j = next[j];    //i不用指針回溯
15 //j指針后退到next[j]重新開始匹配
16 }
17 }
18 if(j > T[0])
19 return i - T[0];
20 else
21 return 0;
22 
23 }

 

求next函數值
已知:next[1] = 0;
假設:next[j] = k; 又因為T[k] = T[j]
則next[j+ 1] = k + 1;
ruo T[j] != T[k]
則需要回朔,檢查T[j] = T[?]
這是幾上也是一個匹配過程,不同在於:主串和模式串是同一個串

 1 void get_next(SString &T, int &next[])//求模式串T的next函數值並存入數組next
 2 {
 3 i = 1; next[1] = 0;
 4 j = 0;
 5 while(i < T[0])
 6 {
 7 if(j == 0 || T[i] = T[j])
 8 {
 9 ++i;
10 ++j;
11 next[i] = j;
12 }
13 
14 else
15 j = next[j];
16 if(
17 }
18 
19 }

 


特殊情況
S = ‘aaabaaabaaabaaabaaab'
T = 'aaaab'
next[j] = 01234修正后00004

 1 void get_next(SString &T, int &next[])//求模式串T的next函數值並存入數組next
 2 {
 3 i = 1; next[1] = 0;
 4 j = 0;
 5 while(i < T[0])
 6 {
 7 if(j == 0 || T[i] = T[j])
 8 {
 9 ++i;
10 ++j;
11 if(T[i] != T[j])
12 nextval [i] = j;
13 else
14 nextval[i] = next[j];
15 }
16 
17 else
18 j = nextval[j];
19 if(
20 }
21 
22 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM