字元串模糊匹配是一種可以在文本或者字元串集合中搜索與指定模式相似的子串或者單詞的方法。由於實際應用中經常會遭遇到數據剛性問題,在簡單的文本匹配任務中正則表達式已經無法滿足需要,所以需要進行字元串模糊匹配。字元串模糊匹配有多種方法,例如:KMP演算法、Boyer-Moore演算法、Rabin-Karp演算法等。這篇文章通過分析幾種比較常見的演算法,詳細闡述字元串模糊匹配技術。
一、KMP演算法
KMP(Knuth-Morris-Pratt)演算法是一種常用的字元串匹配演算法。該演算法的核心思想是通過預處理模式串,以達到避免重複匹配的目的。KMP演算法的實現方式是在匹配字元串的過程中,遇到不匹配的字元就利用已經預處理好的next數組去匹配。
下面是KMP演算法的核心代碼:
int kmp(string s, string p) { // 求next數組 int m = p.size(); int* next = new int[m + 1]; memset(next, 0, sizeof(int) * (m + 1)); int j = 0; for (int i = 1; i 0 && p[i] != p[j]) { j = next[j]; } if (p[i] == p[j]) { ++j; } next[i+1] = j; } // 正式匹配操作 int n = s.size(); j = 0; for (int i = 0; i 0 && s[i] != p[j]) { j = next[j]; } if (s[i] == p[j]) { ++j; } if (j == m) { delete[] next; return i - m + 1; } } delete[] next; return -1; }
二、Boyer-Moore演算法
Boyce-Moore演算法是一種效率較高的字元串匹配演算法,其核心思想是從右到左進行匹配。從而讓不匹配時跳過儘可能多的字元,進而減少匹配次數。它會預處理模式串中每個字元最後出現的位置,如果在匹配中找到了一個不匹配的字元,它會基於這個位置來決定下一步應該向右移動多少位。
下面是Boyer-Moore演算法的核心代碼:
int boyer_moore(string s, string p) { int n = s.size(); int m = p.size(); int* bc = new int[256]; int* gs = new int[m]; for (int i = 0; i < 256; ++i) { bc[i] = -1; } for (int i = 0; i < m; ++i) { bc[p[i]] = i; } for (int i = 0, j = 0; i < m; ++i, j = 0) { while (i + j < m && p[m-1-j] == p[m-1-i+j]) { ++j; gs[j] = m-1-i+j; } } while (j < m) { gs[++j] = m; } int i = 0; while (i = 0 && p[j] == s[i+j]; --j) { } if (j < 0) { delete[] bc; delete[] gs; return i; } else { i += max(j-bc[s[i+j]], gs[j+1]); } } delete[] bc; delete[] gs; return -1; }
三、Rabin-Karp演算法
Rabin-Karp演算法是一種基於哈希的字元串匹配演算法。它會先計算出模式串的哈希值,在匹配過程中將匹配區域窗口內的子串的哈希值與模式串哈希值比較,當其相等時再進行逐個字元比較。
下面是Rabin-Karp演算法的核心代碼:
int rabin_karp(string s, string p) { int n = s.size(); int m = p.size(); int p_hash = hash(p); int s_hash = hash(s.substr(0, m)); for (int i = 0; i <= n - m; ++i) { if (p_hash == s_hash) { if (s.substr(i, m) == p) { return i; } } if (i < n - m) { s_hash = rabin_fingerprint(s_hash, s[i], s[i+m], p_hash, m); } } return -1; }
四、小結
本文論述了幾種常見的字元串模糊匹配演算法,分別是KMP演算法、Boyer-Moore演算法、Rabin-Karp演算法。這些演算法各有優點和缺點,在不同的情況下適用不同的演算法能夠提高匹配的效率。
實際應用中,字元串模糊匹配是非常重要的。在搜索引擎、推薦系統、推廣營銷、網路安全等領域,都有著廣泛的應用。掌握字元串模糊匹配的演算法,可以讓我們更加高效地進行數據處理和信息檢索。
原創文章,作者:KWZU,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/136653.html