關於KMP演算法的一些個人理解

2021-09-12 17:35:31 字數 898 閱讀 9497

kmp演算法其實理解起來也不難,只不過很多過於公式化的講解以及太過晦澀的說法會讓人一頭霧水;

kmp演算法主要是判斷乙個字串是否是另乙個字串的字串;對於這兩個字串,在演算法描述中有固定的稱謂:我們把最長的字串稱為text,需要判定的子串稱為模式pattern;

對於這個問題,其實最容易想到的就是暴力列舉:即text字串逐個字元判定,若當前第i字元和pattern首字元一樣,進行pattern第二位的判定,如果中間有乙個字元不同,則結束本輪判斷,重新判斷第i+1個字元;

該方法會達到o(m*n)級別;

而kmp演算法就是處理該問題的更優演算法,複雜度只有o(m+n);

其實我們可以大致推斷出暴力列舉的缺陷點,其根本的問題就是回溯。由於pattern字串有可能會有某些規律,使得我們判斷第i個字元失敗的時候,不用從i+1個開始重新判斷,只需要判斷i+k個,而kmp演算法就是描述如何進行更優判斷;

首先接觸kmp演算法,我們要理解next陣列,next陣列針對的是pattern字串,描述的是當前字串的最長的相同字首和字尾的長度;

例如:ababa,其最長的相同字首字尾就是aba,這個自己看一看就很清楚;

而next陣列儲存的就是這些值。next陣列索引是當前0~i子字串的長度,其相應的陣列值就是該長度下的相同前字尾的長度k;

這裡其實可以注意一下,由於給出的字串座標索引是從0開始,所以k也可以認為是最長字首的最後一位的下標;

對於這個陣列,我們其實可以依次算出來,但是如果用程式化的語言描述,則應該使用遞推來進行;

具體**如下:

void getnext(char s,int len)

if(text[i]==pattern[j+1])

if(j==m-1)

}return ans;

}

關於KMP演算法的一些個人理解

kmp演算法其實理解起來也不難,只不過很多過於公式化的講解以及太過晦澀的說法會讓人一頭霧水 kmp演算法主要是判斷乙個字串是否是另乙個字串的字串 對於這兩個字串,在演算法描述中有固定的稱謂 我們把最長的字串稱為text,需要判定的子串稱為模式pattern 對於這個問題,其實最容易想到的就是暴力列舉...

關於SpringIOC的一些個人理解

根據上面這個思路接著說的話,那就順理成章了,首先spring容器將所有的bean都放在一起進行管理,然後當某個應喲經程式需要用到某個bean物件的時候,說一下,然後spring自動給這個程式分配他所需要的物件。這就是所謂的控制反轉了吧?本來這個宣告建立bean物件的過程應該由程式自己進行,建立呼叫然...

遞迴演算法 一些個人理解

遞迴演算法,從定義上來說,是一種直接或者間接地呼叫自身的一種演算法,這裡的自己可以是函式或者方法。遞迴演算法的思想或者說實質就是把實際的問題分解成規模較小的乙個個的子問題,然後不斷使用遞迴呼叫方法來求得問題的解。要學習和使用遞迴演算法,就要從最基本的定義上來先解讀。遞迴演算法是把問題轉化為規模縮小了...