**
先建立兩個文字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估價函式越接近真實值演算法越優,但一定不能大於真實值,否則...