KMP搜尋演算法

2021-10-11 09:29:39 字數 2879 閱讀 4034

**

先建立兩個文字zichuan和zhuchuan才能用,這個**是從文字中讀取字元再在文字中搜尋的;

1.第乙個字元編為-1(便於後邊第乙個字元比較時不會死迴圈)

2.之後編碼 與第乙個字元相同的 編為0之後字元按1 2 3……排,直到再次遇到與第乙個字元相同的字元;然後才從0開始編碼;

例:ababc -1 0 0 1 2

abaabcac -1 0 0 0 1 2 0 1

void

bianhao()

if(zi.str[i]

!=zi.str[0]

)else}}

}

需要注意的是,像ababc 這種的子串,當匹配主串時,若前面兩個字元ab中有不相同的,則後面的ab可能相同所以編碼時需要讓子串指向a,讓後面進行比較。

當i和j相同時,i和j統一都向後移動一位。

當i和j不相同時,將子串移動即j指向的數移動。移動位數等於j-2(即**中的j-zi.shu[j]),j當前為4,所以需要移動兩位。

此時,i和j仍不相同,則繼續移動,j-0即移動2位。

此時i和j仍不相同,但此時j=0,則i++,

此時重複上邊操作

此時成功匹配;

void

bijiao()

if(zi.str[j]

!=stri[i]

)//printf("i的值%d j的值%d\n",i,j);

if(j>=zi.zong)

break;}

if(j==zi.zong-1)

printf

("\n相同的位置%d\n "

,i-zi.zong+2)

;else

printf

("\n沒找到!!\n");

}

#include

#include

typedef

struct zichuan

zichuan;

zichuan zi;

char stri[

10000000];

//主串長度 修改處

int zhushu;

void

shuru()

;void

shuchu()

;void

bianhao()

;void

bijiao()

;int

main()

void

shuru()

h=ftell

(fp)

;fseek

(fp,0,

2); e=

ftell

(fp)

;fseek

(fp,0,

0);

zi.zong=e;

while

(e-h>0)

fclose

(fp);if

((fq =

fopen

("zhuchuan.txt"

,"r"))

==null

)//輸入主串字元

h=ftell

(fq)

;fseek

(fq,0,

2); e=

ftell

(fq)

;fseek

(fq,0,

0);//printf(" h=%d\n ",h);

zhushu=e-h;

while

(e-h>0)

fclose

(fq);}

void

shuchu()

}void

bianhao()

if(zi.str[i]

!=zi.str[0]

)else}}

}void

bijiao()

if(zi.str[j]

!=stri[i]

)//printf("i的值%d j的值%d\n",i,j);

if(j>=zi.zong)

break;}

if(j==zi.zong-1)

printf

("\n相同的位置%d\n "

,i-zi.zong+2)

;else

printf

("\n沒找到!!\n");

}// aaba -1 0 1 2 第乙個記為-1是為了好算 只找與第乙個字母相同的就成 記為0 之後的數按1 2 3……排 直到再次遇見第乙個字母

KMP搜尋演算法

如果用暴力匹配的思路,並假設現在str1匹配到 i 位置,子串str2匹配到 j 位置,則有 如果當前字元匹配成功 即str1 i str2 j 則i j 繼續匹配下乙個字元 如果失配 即str1 i str2 j 令i i j 1 j 0。相當於每次匹配失敗時,i 回溯,j 被置為0。用暴力方法解...

A 搜尋演算法

啟發式搜尋演算法 要理解 a 搜尋演算法,還得從啟發式搜尋演算法開始談起。所謂啟發式搜尋,就在於當前搜尋結點往下選擇下一步結點時,可以通過乙個啟發函式 來進行選擇,選擇代價最少的結點作為下一步搜尋結點而跳轉其上 遇到有乙個以上代價最 少的結點,不妨選距離當前搜尋點最近一次展開的搜尋點進行下一步搜尋 ...

A 搜尋演算法

a 演算法是基於bfs的一種入門級啟發式搜尋演算法,就是將bfs的佇列改為基於估價的優先佇列,可以快速地找到答案。優先隊列為小根堆 while 優先佇列不為空 取出隊頭並擴充套件 將擴充套件節點以估價值 當前值為優先順序入隊 endwhile估價函式越接近真實值演算法越優,但一定不能大於真實值,否則...