標籤:圖書館 二進位 大迴圈 線性表 選修課
今天找兼職繼續碰壁中,吃過中飯接著蹲圖書館看資料結構,呵呵,被KMP演算法虐了一下午,恨啊,當初上資料結構選修課的時候怎麼沒好好聽呢。下面是今天的學習筆記。
串(string)
1.定義:是由0個或多個字元組成的有限序列,即字串。
2.串的比較通過字元的編碼大小來實現,有ASCII碼(7位和8位二進位)、Unicode碼(16位);字串的相等。
3.串不是線性表,因為串針對的是字元集,注重子串的尋找替換等,線性錶針對單個元素的操作。
4.串也分順序儲存結構和鏈式儲存結構
5.樸素的模式比對演算法:對主串作大迴圈,主串的每個字元開頭對子串作子串長T的小迴圈,直到匹配成功或全部遍曆。時間複雜度O((n-m+1)*m)
6.KMP模式比對演算法
原理:利用已經完成的匹配結果,省去後續重複的匹配操作。時間複雜度O(n+m)
重痛點:next[j]的求解、利用next[]數組實現Index操作
next[j]:前j-1個匹配,主串第i個與模式第j個不匹配時,模式串需將第next[j]個字元與主串第i個相比較(i不動)。
Void get_next(String T, int *next)
{
Int i, j;
i=1 , j=0;
next[1]=0;
while (i < T[0])
{
if(j==0 || T[i] == T[j])
{
i++;
j++;
next[i] = j;
}
else j = next [j];
}
}
7. 改進的KMP演算法
對next[]的改進:在計算出next[]的同時,若a位字元與它next所指向的b字元相等,則該a位的nextval就指向b位的nextval,否則a位的nextval就等於a位的next值。
樹(tree)
1.定義:是n個結點的有限集;有且僅有一個根節點;子樹互不相交。
2.結點分類:度(結點擁有子樹的個數)為0的為葉結點(終端結點);樹的度是各結點度的最大值
3.森林:m>=0棵互不相交的樹的集合。
4.樹的儲存結構:雙親標記法;孩子標記法;孩子兄弟標記法。都可以根據演算法的需要增加特定的指標域來實現上述3種標記法中的功能。
5.二叉樹:所以結點的度<=2 ;左右子樹是有順序的
6.特殊的二叉樹
斜樹:所有結點均只有左(右)子樹——線性表就是一種斜樹,是樹的特例。
滿二叉樹:所有分支結點都有左右子樹,且所有葉子都在最後一層上。
完全二叉樹:按層序編號不會出現空擋的二叉樹。
7.二叉樹的性質
第i層最多有2^(i-1)個結點;
深度為k的二叉樹最多有 (2^k)-1 個結點;
任意二叉樹滿足: 葉結點樹 = 度為2的結點數 + 1 ;
完全二叉樹的結點為n, 則其深度為 (log2 n)向上取整 + 1;
完全二叉樹結點i的雙親是 i/2 向上取整;左孩子是2i。
8.二叉樹的儲存結構
完全二叉樹可以用簡單的順序結構來表示;一般的二叉樹需用而二叉鏈表來表示:lchild+data+rchild,若有需要可再添加指向雙親的指標,即三叉鏈表。
9.二叉樹的遍曆:每個結點都被訪問且僅訪問一次
前序走訪:根,左子樹,右子樹
中序遍曆:左子樹,根,右子樹
後序遍曆:先葉子後結點(依次從左子樹到右子樹),再根結點