a b c a a b b c a b c a a b d a b
maxl
0 0 0 1 1 2 0 0 1 2 3 4 5 6 0 1 2
next
0 1 1 1 2 2 3 1 1 2 3 4 5 6 7 1 2
nextval
0 1 1 0 2 1 3 1 0 1 1 0 2 1 7 0 1算法
例子:
模式串 a b a a b c a c數組
next值 0 1 1 2 2 3 1 2函數
nextval值 0 1 0 2 1 3 0 2指針
1.第一位的nextval值一定爲0,第二位若是於第一位相同則爲0,若是不一樣則爲1。內存
2.第三位的next值爲1,那麼將第三位和第一位進行比較,均爲a,相同,則,第三位的nextval值爲0。字符串
3.第四位的next值爲2,那麼將第四位和第二位進行比較,不一樣,則第四位的nextval值爲其next值,爲2。效率
4.第五位的next值爲2,那麼將第五位和第二位進行比較,相同,第二位的next值爲1,則繼續將第二位與第一位進行比較,不一樣,則第五位的nextval值爲第二位的next值,爲1。next
5.第六位的next值爲3,那麼將第六位和第三位進行比較,不一樣,則第六位的nextval值爲其next值,爲3。數據
6.第七位的next值爲1,那麼將第七位和第一位進行比較,相同,則第七位的nextval值爲0。二維數組
7.第八位的next值爲2,那麼將第八位和第二位進行比較,不一樣,則第八位的nextval值爲其next值,爲2。
總而言之,next和nextval數組的前兩位必定是01;
next數組從第三位開始,取此位前一位next數組中的值,找字符串中此值做爲序號的字符,與前一位字符進行比較。若相同,爲前一位next值+1;若不一樣,重複上述步驟(這裏是再往前取一位),直到序號1都不一樣的話,取next值爲1.
nextva數組從第三位開始,取這一位next數組中的值,找字符串中此值做爲序號的字符x,與這一位進行比較。不一樣,則這一位的next值就是其nextval值;若相同,重複上述步驟(這裏是將x,與x的next值對應的序號字符比較),直到序號1都相同的話,nextval值爲0.
二者特徵能夠簡單記爲:next求同最小爲1;nextval求異最小爲0
忽略了字符串的大小要比字符串中的字符數多1這一點,會形成數組的越界
KMP匹配時,主串的指針當匹配時會遞增,不匹配時會停住不動,也正是由於主串指針沒有回滾,KMP的匹配效率才得以提高
樸素的匹配只匹配一次,不用計算next數組,因此速度更快
每一個非零元素佔3*2=6個字節,共10個非零元素,需6*10 = 60 個字節;
此外,還通常要用三個整數來存儲矩陣的行數、列數和總元素個數,又須要3*2 = 6個字節;
總共:60 + 6 = 66 個字節。
注意基地址是第一個元素的地址,因此要-1
與上一個題目的區別:數組從0開始算,因此這其實是一個6行7列的數組;是列優先而不是習慣的行優先
綜上,計算數組中某個元素地址時,要注意數組從0仍是1開始,行優先仍是列優先,基地址是第一個元素的地址要減一
首先明確數據具備邏輯結構和存儲結構。邏輯結構指數據元素之間的邏輯關係,有四種關係:集合結構、一對一的線性結構、一對多的樹型結構、多對多的圖狀結構。存儲結構指數據實際存放在計算機中的物理結構,只有兩種形式:順序存儲、非順序存儲。任何一種邏輯結構均可以使用順序存儲或者非順序存儲。