算法設計
迭代法:用於求方程的近似根。
1、若方程無解,則算法求出的近似根序列就不會收斂,迭代過程會變成死循環,因此在使用迭代算法前應先考查方程是否有解,並在程序中對迭代的次數給予限制。
2、方程雖有解,但迭代公式選擇不當,或迭代的初始近似根選擇不合理,也會導致迭代失敗。
窮舉搜索法:對可能是解的眾多候選解按某種順序進行逐一枚舉和檢查,並從中找出符合要求的候選解作為問題的解
遞推法:利用問題本身所具有的一種遞推關系求問題解的一種方法
遞歸法:執行過程分遞推和回歸兩個階段:在遞推階段,把較復雜的問題的求解分解成比原問題簡單一些的問題的求解。在回歸階段,從獲得的最簡單情況的解,逐級返回,依次獲得稍復雜問題的解。(遞歸法就是把問題轉化為規模縮小了的同類問題的子問題)
分治法:把大問題分解成一些較小的問題,然后由小問題的解方便地構造出大問題的解,每個小問題都是相互獨立的。例如二分查找法、漢諾塔問題、斐波那契、歸並排序
動態規划法:基本思想也是將大問題分解為多個小問題,但是與分治法不同的是,動態規划法的子問題往往不是獨立的。因此,動態規划法可以避免大量重復的計算。以自底向上的方式計算出最優值。例如最大子段問題
貪心法:不追求最優解,只希望得到較為滿意解的方法。可以快速得到滿意的解,不考慮整體情況,所以貪心法不要回溯。例如哈夫曼編碼
回溯法:該方法首先暫時放棄關於問題規模大小的限制,並將問題的候選解按某種順序逐一枚舉和檢驗。當發現當前候選解不可能是解時,就選擇下一個候選解;倘若當前候選鍵除了不滿足問題規模要求外,滿足所有其他要求,繼續擴大當前候選解的規模,並繼續試探。如果當前候選解滿足包括問題規模在內的所有要求,該候選鍵就是問題的一個解。在回溯法中,放棄當前候選解,尋找下一個候選解的過程被稱為回溯;擴大當前候選解的規模,以繼續試探的過程稱為向前試探,回溯法以深度優先的方式搜索解空間樹。
分支限界法:類似於回溯法,也是在問題的解空間樹上搜索問題解的方法。但在一般情況下,二者的求解目標不同。回溯法是找出解空間樹中滿足空間樹中滿足約束條件的解中找出使某一目標函數值達到極大或極小的解,即在某種意義下的最優解。分支限界法以廣度優先或以最小耗費優先的方式搜索空間樹。例如單源最短路徑問題
算法復雜度

一般地,當遞歸方程為 T(n) = aT(n/c) + O(n),T(n)的解為:
概率算法
數值概率算法:適用於數值問題的求解,這類算法得到的往往是近似解,且近似解的精度隨時間的增加不斷提高。在多數情況下,要計算出問題的精確解是不可能的或是沒有必要的,因此數值概率算法可得到相當令人滿意的解。
蒙特卡羅算法:適用於求問題的精確解,該算法能求得一個解,但該解未必是正確的,正確的概率依賴算法所用的時間,時間越久,正確率越高。因此,該算法的缺點就是無法有效地判斷所得到的解是否正確。
拉斯維加斯算法:如果該算法找到一個解,那一定是正確的解,得到正確解的概率依賴算法所用的時間。
舍伍德算法:一定能找到一個正確的解,該算法設法消除最壞情形與特定實例之間的關聯性。
鄰接矩陣
無向圖:其鄰接矩陣第i行的元素的和即為頂點i的度
例如:頂點4的度就是第四行的和,即2。

有向圖:其鄰接矩陣第i行元素之和為頂點i的出度,而鄰接矩陣的第j列元素之和為頂點j的入度
例如:頂點3的出度和入度分別為5和16
廣義表
廣義表的長度是將最外面那層的括號刪了以后所剩下的元素(組)個數,深度是括號的層數

存儲結構

順序存儲結構:用一組地址連續的存儲單元依次存儲線性表的各個數據元素,適用於頻繁查詢時使用

鏈式存儲結構:在計算機中用一組任意的存儲單元存儲線性表的數據元素,適用於在較頻繁的插入、刪除、更新元素時使用
(單鏈表)

(循環鏈表)

(雙鏈表)

各鏈表的比較
因為雙鏈表有兩個指針域,因此,雙鏈表的靈活度優於單鏈表,但是雙鏈表的開支要大一些
散列存儲結構:將數據元素的存儲位置與關鍵碼之間建立確定對應關系的查找技術,即鍵值對

索引存儲結構:索引是一個單獨的、物理的數據庫結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。比如數據庫

樹
二叉排序樹
- 若它的左子樹非空,則左子樹所有節點的值均小於它的根節點的值
- 若它的右子樹非空,則右子樹所有節點的值均大於等於它的根節點的值
- 它的左、右子樹也分別為二叉排序樹。查找的時候,中序遍歷二叉樹,得到一個遞增序列
- 關鍵字最大的結點可以有左子樹,但一定沒有右子樹
哈夫曼樹(最優二叉樹)
定義:哈夫曼樹是帶權路徑(WPL)最短的樹,權值越大的葉子節點越靠近根節點
WPL值的計算:樹的路徑長度是從樹根到每一結點的路徑長度之和。樹的帶權路徑長度為樹中所有葉子結點的帶權路徑長度之和,通常記作WPL

例題
已知一個文件中出現的各字符及其對應的頻率如下表所示。若采用定長編碼,則該文件中字符的碼長應為(1)。若采用Huffman編碼,則字符序列“face”的編碼應為(2)。

(1)A.2 B.3 C.4 D.5
(2)A.110001001101 B.001110110011 C.101000010100 D.010111101011
解析:所謂定長編碼是指用多少位二進制足夠表示字符,圖中字符是有6個的,a、b、c、d、e、f,可用000到101表示a到f,這樣編碼字符的碼長可以為3,4位當然也是可以,但我們是找最合適的,自然3位能滿足要求。第二問,哈夫曼樹的左節點未必要比右節點小,但是通常做題時需要寫成左小右大的形式,再左0右1賦值,所謂“face”編碼,是指找到這4個字母,從根節點出發,要經歷的編碼數。如下圖所示,所以答案為B、A

平衡二叉樹
平衡二叉樹又稱為AVL樹,且具有以下性質:
它是一棵空樹或它的左右兩棵子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹
滿二叉樹
除最后一層無任何子節點外,每一層都上的所有節點都有兩個子節點或0個子結點的二叉樹
二分查找法(折半查找法)
適用情況
不經常變動而查找頻繁的有序列表
優點
1、比較次數少
2、查找速度快
3、平均性能好
缺點
1、要求待查表為有序表
2、插入刪除困難
實現算法:首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、后兩個子表,如果中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,否則進一步查找后一子表。重復以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時查找不成功。
分塊查找
適用情況:節點動態變化的情況
優點:比順序查找算法快得多
缺點:速度不如折半查找法
實現算法:把一個線性表分成若干個塊,每塊中的節點可以任意存放,但塊與塊之間必須排序。假設是按關鍵碼值非遞減的,那么這種塊與塊之間必須滿足已排序要求,實際上就是對於任意的i,第i 塊中的所有節點的關鍵碼值都必須小於第i+1塊中的所有節點的關鍵碼值。此外,還要建立一個索引表,把每塊中的最關鍵碼值作為索引表的關鍵碼值,按塊的順序存放到一個輔助數組中,顯然這個輔助數組是按關鍵碼值遞減排序的。查找時,首先在索引表中進行查找,確定要找的節點所在的塊。由於索引表的排序的,因此,對索引表的查找可以采用順序查找或折半查找;然后在相應的塊中采用順序查找,即可找到對應的節點
平均查找長度:
(1)以二分查找確定塊時,平均查找長度 = log2(n / s+1) + s / 2
(2)以順序查找確定塊時,平均查找長度 = (b + 1) / 2 + (s + 1) / 2 = (s^2 + 2s + n) / 2s
注:n 表示元素的總個數
s 表示每個塊所具有的元素個數
b 表示分為幾個塊
排序

歸並排序的歸並路數
歸並路數 = | logkm |,其中m為元素個數,k為多路歸並趟數
