字符串匹配之暴力匹配

字符串匹配之暴力匹配

字符串匹配就是在一個字符串集裏面找到某個模式串出現的所有位置。
例如,找出模式P=abaa 在文本T=abcabaabcabac 中的位置,用mn 分別表示PT 的長度,S 表示當字符串匹配時的有效偏移。

這裏寫圖片描述

暴力匹配的方法是通過循環,找出所有的有效偏移S ,該循環對每一個可能的S 進行檢測,看是否滿足條件P[1..m]=T[s+1..s+m]

這裏寫圖片描述

這種匹配方式可以看做是P 字符串在一格一格的滑動,每滑到一個新的位置,需要重新從字符串P 頭部開始匹配,檢查與T 文本對應的位置是否相等

代碼;

void NaiveSearch(const char* T,const char* P)
{
    int n = strlen(T);
    int m = strlen(P);
    for (int s = 0; s < n - m+1; ++s)
    {
        int i = s, j = 0;
        for (;j < m-1;)
        {
            if (T[i] == P[j]) ++i, ++j;
            else break;
        }
        if (T[i] == P[j])
            printf("%d\n",s);       
    }
}

上述代碼中,第5行的for循環檢查了每一個可能的偏移值S ,第8~12行檢查了偏移後對應的兩個串是否相等,第14行打印出每個合格的偏移量S

暴力匹配在最壞的情況下運行時間爲O((nm+1)m) ,簡化爲O(n2) ,例如在Taaaaaaab 裏面查找Paaab ,每一次滑動都要完全比較P 裏面的字符 ,做了很多重複的動作,效率很低。

參考資料:《算法導論》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章