最近,經常使用string的indexof()方法,於是很想琢磨一下它的內部實現機制,如果我我來實現的話,會採用什麼辦法?
首先我想到的是使用簡單模式匹配演算法,思路很清楚,但是時間複雜度很高 最壞的情況是o(n*m)(n是主串的長度,m是模式串的長度).
後來想到kmp演算法很強悍,時間複雜度好像是線性的,不過杯具的是我對kmp演算法完全沒有印象。花了點時間看了會書,寫了段**,總算明白kmp演算法了。
話不多說,直接貼**:
package chapterfour;
/***
* @author wanglianqin
** 2010-11-30
*/public class kmp else if (j == 0) else }}
// 簡單模式匹配演算法
public int index_******(char s, char pat, int pos) else
}if (j > pat_length) else
}//kmp模式匹配演算法
public int index_kmp(char s, char pat, int pos) else
}if (j > pat_length) else
}public static void main(string args) ;
kmp.get_next(pat);
for (int i : kmp.next)
system.out.println("--------簡單模式匹配演算法--------");
char s = new char ;
system.out.println(kmp.index_******(s, pat, 3));
system.out.println("--------kmp演算法--------");
system.out.println(kmp.index_kmp(s, pat, 3));}}
後來我測試了一下,發現簡單模式匹配演算法和kmp演算法效率差不多,可能是m和n的值都小的原因。
再看看嚴老師的書,明白了「簡單模式匹配演算法的時間複雜度是o(m*n),但在一般情況下,其實際的執行時間近似於o(m+n),因此至今仍被採用,kmp演算法僅當模式和主串之間存在許多部分匹配的情況下才顯得比它好。」。
串的模式匹配演算法
子串的定位操作通常稱做串的模式匹配,這也是串的乙個很要的操作。一,一般定位子串位置演算法 演算法基本思想 從主串的第1個字元起和模式的第乙個字元進行比較,若相等,則再比較主串和模式串的後續字元。否則將主串的後續字元和模式串的第乙個字元進行比較,在網上找的一張 return i t.length 找到...
串的模式匹配演算法
串的模式匹配演算法 子串的定位操作通常稱作串的模式匹配。通常用函式index s,t,pos 來求解,其中s為主串,t為模式串,pos為主串中的位置,整個函式的作用是返回在字串s中的第pos個字元及以後 包含pos 首次出現與字串t相匹配的子串的第乙個字元的位置。例如 s abciu 5 abcjk...
串的模式匹配演算法
1 求子串位置的定位函式 子串的定位操作通常稱做串的模式匹配,是各種串處理系統中最重要的操作之一。現採用定長順序儲存結構,可以寫出簡單匹配演算法。int index sstring s,sstring t,int pos else if j t 0 return i t 0 else return ...