Horspool 字符串快速查找算法
生活随笔
收集整理的這篇文章主要介紹了
Horspool 字符串快速查找算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Horspool算法是后綴搜索算法,對于每個文本搜索窗口,將窗口內的最后一個字符與模式串(needle)的最后一個字符進行比較。如果相等,則繼續從后向前驗證其他字符,直到完全相等或者某個字符不匹配。當遇到字符不匹配的情況時就需要將搜索窗口往后移動,計算移動的距離可以有不同方法,Wikipedia中給出的C語言實現版本是基于窗口的最后一個字符(haystack上的)。
?
C語言版代碼分析:
1 // 在 haystack 中查找 needle 子字符串 2 const unsigned char *horspool_memmem(const unsigned char *haystack, size_t hlen, 3 const unsigned char *needle, size_t nlen) 4 { 5 size_t scan = 0; 6 7 // 單個字符的位移對照表 8 size_t bad_char_skip[UCHAR_MAX + 1]; 9 10 // 參數檢查 11 if (nlen <= 0 || !haystack || !needle) 12 return NULL; 13 14 // 初始化位移對照表,缺省值是 needle 的長度,即遇到不匹配時將搜索窗口往后移動 needle 長度 15 // 比如:如果遇到 needle 中沒有的字符時,就可以將搜索窗口后移 needle 長度,以跳過該字符 16 for (scan = 0; scan <= UCHAR_MAX; scan = scan + 1) 17 bad_char_skip[scan] = nlen; 18 19 // needle 最后一個字符的下標 20 size_t last = nlen - 1; 21 22 // 遍歷 needle 的字符(排除最后一個字符),計算該字符到最后一個字符的位移。 23 // 此處遍歷需要從頭開始,因為 needle 中可能會出現重復字符,同一個字符必須使用其最后出現位置的位移。 24 // 25 // 排除 needle 最后一個字符的原因是:如果 needle 的最后一個字符在 needle 中是唯一的,那么其位移對照表中的值是 nlen, 26 // 只要當次搜索匹配失敗,并且搜索窗口上 haystack 的最后一個字符就是 needle 的最后一個字符,那么就應該將搜索窗口后移 nlen, 27 // 因為該字符沒有重復出現 needle 的其它位置上,就可以安全的跳過當前窗口。 28 for (scan = 0; scan < last; scan = scan + 1) 29 bad_char_skip[needle[scan]] = last - scan; 30 31 // 開始搜索匹配 32 // 由于搜索窗口不斷往后移動,即 haystack 指針值向后移動,hlen 保存 haystack 的剩余字符串長度。 33 // 當 hlen 的長度小于 nlen 時,查找失敗。 34 while (hlen >= nlen) { 35 // 從搜索窗口的尾部向前匹配 36 for (scan = last; haystack[scan] == needle[scan]; scan = scan - 1) { 37 if (scan == 0) // 頭部字符匹配則查找成功,返回子字符串位置 38 return haystack; 39 } 40 41 // 如果匹配失敗則基于搜索窗口上 haystack 的最后一個字符 haystack[last] 后移搜索窗口 42 hlen -= bad_char_skip[haystack[last]]; 43 haystack += bad_char_skip[haystack[last]]; 44 } 45 46 // 到達此處說明查找失敗 47 return NULL; 48 }?
查找過程示例:
原始串 haystack: efaboxcbcabcdsdxzcxx needle: abcd初始化 last: 3 bad_char_skip['a'] = 3 bad_char_skip['b'] = 2 bad_char_skip['c'] = 1 bad_char_skip['d'] = 1循環1 last: 3 haystack[last]: b bad_char_skip[haystack[last]]: 2 haystack: aboxcbcabcdsdxzcxx needle: abcd循環2 last: 3 haystack[last]: x bad_char_skip[haystack[last]]: 4 haystack: cbcabcdsdxzcxx needle: abcd循環3 last: 3 haystack[last]: a bad_char_skip[haystack[last]]: 3 haystack: abcdsdxzcxx needle: abcd循環4 匹配成功?
參考文檔
??
轉載于:https://www.cnblogs.com/edwardlost/archive/2013/01/25/2875320.html
總結
以上是生活随笔為你收集整理的Horspool 字符串快速查找算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 字典操作
- 下一篇: iOS使用NSURLConnection