數組、矩陣(習題課)

模式串T= 'abcaabbcabcaabdab' , T的next數組值及nextval數組值爲(01112231123456712和01102131011021701)

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

char s[6]=」Hello!」是不合法的。

忽略了字符串的大小要比字符串中的字符數多1這一點,會形成數組的越界

KMP算法的特色是在模式匹配時指示主串的指針不會變小。 

KMP匹配時,主串的指針當匹配時會遞增,不匹配時會停住不動,也正是由於主串指針沒有回滾,KMP的匹配效率才得以提高

設模式串的長度爲m,目標串的長度爲n,當n≈m且處理只匹配一次的模式時,樸素的匹配(即子串定位函數)算法所花的時間代價可能會更爲節省

樸素的匹配只匹配一次,不用計算next數組,因此速度更快

有一個100*90的稀疏矩陣,非0元素有10個,設每一個整型數佔2字節,則用三元組表示該矩陣時,所需的字節數是(66)

每一個非零元素佔3*2=6個字節,共10個非零元素,需6*10 = 60 個字節;

此外,還通常要用三個整數來存儲矩陣的行數、列數和總元素個數,又須要3*2 = 6個字節;

總共:60 + 6 = 66 個字節。

假設以行序爲主序存儲二維數組A[1..100,1..100],設每一個數據元素佔兩個存儲單元,基地址爲10,則LOC(A[5,5])=( 818  )。

注意基地址是第一個元素的地址,因此要-1

數組A[0..5,0..6]的每一個元素佔五個字節,將其按列優先次序存儲在起始地址爲1000的內存單元中,則元素A[5,5]的地址是(  1175    )。

與上一個題目的區別:數組從0開始算,因此這其實是一個6行7列的數組;是列優先而不是習慣的行優先
綜上,計算數組中某個元素地址時,要注意數組從0仍是1開始,行優先仍是列優先,基地址是第一個元素的地址要減一

理解下數據的結構

首先明確數據具備邏輯結構和存儲結構。邏輯結構指數據元素之間的邏輯關係,有四種關係:集合結構、一對一的線性結構、一對多的樹型結構、多對多的圖狀結構。存儲結構指數據實際存放在計算機中的物理結構,只有兩種形式:順序存儲、非順序存儲。任何一種邏輯結構均可以使用順序存儲或者非順序存儲。

相關文章
相關標籤/搜索