l 串是由零個或多個字元組成的有限序列,又名叫字串;
l 字元數目稱為串的長度;
l 串中任意個數的連續字元組成的子串行稱為該串的子串;
l 子串在主串中的位置就是子串的第乙個字元在主串中的序號;
l 判斷c語言中兩個串是否相等:必須長度和各個位置對應的字元都相等,才算是相等;
clearstring(s);//清空
concat(t, s1, s2);//用t返回s1和s2組成的新串;
l 用一組位址連續的儲存單元來儲存串中的字串行;為每個定義的串變數分配乙個固定長度
的儲存區;一般是用定長陣列來定義;
l 在下標為0或最後的位置儲存串的長度值;
l 或者在串值後面加乙個不計入串長度的結束標記字元,同個遍歷獲得長度;
l 這種儲存結構有缺點;操作時可能超出陣列的長度;
與線性表相似;乙個結點可以存放多個字元;
子串定位操作:串的匹配模式;
對主串s做大迴圈,對每個字元開頭做子串t長度的小迴圈;直到匹配成功或全部遍歷完成;
有很多重複比較操作,低效!
l 經過第一次比較,如果發現主串s和子串t的前n位是相等的,而子串的這前n位又互不相等,那麼可以避免n-1次不必要的比較;
l 對於子串中有與首字元相等的字元,也是可以省略一部分不必要的判斷步驟;
l 在樸素模式匹配演算法中,主串的i值是不斷地回溯來完成的,而在kmp模式匹配演算法中是不需要回溯的;即i值不可以變小;所以變化的是j值;
l j值的多少取決於當前字元之前的串的前字尾的相似度;
l t串各個位置的j值變化定義為乙個陣列:next,next的長度就是t串的長度;
l next[j]取值:
n j=1時,next[j] = 0;
n j由j到j-1串前字尾無相等字元,next[j] = 1;
n 前字尾1個字元相等,next[j]= 2;兩個字元相等,next[j]=3;以此類推。。。
² next陣列的作用是:當出現失配情況s[i] != t[j]時,next[j]就指示使用t中以next[j]為下標的字元與s[i]進行比較;
對next函式進行改良:nextval
for instance: t = 「ababaaaba」;
先推算出next陣列的值;011234223;
j = 1時,nextval[1] = 0;
j = 2 時,next[2]=1;對應t串的第1位的值是a, b!=a,所以nextval[2]= next[2]=1;
j = 4 時,next[4]=2;對應t串的第2位的值是b, b=b, 所以nextval[4]=nextval[2]=1;
j = 7 時,next[7]=2;對應t串的第2位的值是b,a!=b, 所以nextval[7]=next[7]=2;
² 如果a位字元與他next值指向的b位字元相等,則該a位的nextval指向b位的nextval值;如果不等,則該a位的nextval值就是他自己a位的next的值;
《大話資料結構》 學習筆記1
第一章 資料結構緒論 經典 if you give someone a program you will frustrate them for a day if you teach tem how to program,you will frustrate them for a lifetim.如果...
《大話資料結構》 學習筆記2
第二章 演算法 2.2 資料結構 與 演算法的關係 簡單的說 資料結構 與 演算法 的關係 即 梁山伯 與 祝英台 的關係 把其中一方隔離出來唱獨角戲.沒意義!2.3 兩種演算法的比較 現寫乙個求1 2 3 100結果的程式,你應該怎麼寫呢?大多數人馬上寫出下面的c語言 int i,sum 0,n ...
《大話資料結構》 學習筆記5
線性表的順序儲存結構,指的是用一段位址連續的儲存單元依次儲存線性表的資料元素。線性表 a1,a2,a3,an 的順序儲存示意圖如下 a1a2 ai 1 ai.an 線性表的順序儲存結構,說白了,就是 在記憶體中找了塊地兒,通過佔位的形式,把一定的記憶體空間給佔了,然後把相同資料型別的資料元素一次存放...