文章目錄
期末考試到了QAQ,所以整理了一下相關內容。文章中的內容是相關資料的整理,參考的博客都在文末有列舉,如有侵權,還麻煩您聯繫我一下,保證立馬刪除。
排序
插入排序
歸併排序
歸併排序的合併步驟
堆排序
漸進符號、函數和運行時間
我們使用漸進記號來刻畫算法的運行時間,有時我們對最壞情況運行時間感興趣,但是,我們常常希望刻畫任何輸入的運行時間。換言之,就是希望做出一種綜合性地覆蓋所有輸入而不僅僅是最壞情況的陳述。
主方法進行遞歸式求解
堆
最大堆&最小堆
維護最大堆
樹
AVL
AVL(Adelson-Velskii and Landis)樹是帶有平衡條件(balance condition)的二叉查找樹,樹中的任意節點的左右子樹的高度之差不超過1。
這個平衡條件必須容易保持,而且必須保證樹的深度是O(logN)。
LL右旋
LL的意思是向左子樹(L)的左孩子(L)中插入新節點後導致不平衡,這種情況下需要右旋操作
RR左旋
LR
下圖第三個模塊,X和Z需要換一下位置。
RL
下圖中,第二模塊y的左孩子爲T1,第三個模塊x和z反了,孩子從左至右依次是T1,T2,T3,T4
輔助理解示例:
初始的AVL樹有兩個節點,a和b,此時樹平衡。
插入節點c,若節點c小於b,則成爲b的左子節點,此時a左子樹深度爲2,右子樹深度爲0,處於不平衡狀態,此時執行右旋操作。
右旋就是使a、b進行右旋1/4圓,使得b節點作爲父節點,a節點變爲b節點的右節點,b的左子樹在經過右旋操作後仍是b的左子樹。
如果b有右子樹。那麼右旋後b的右子樹將成爲a的左子樹。
這就是右旋操作的具體實現,左旋是右旋對稱的過程。當二叉樹插入或者刪除一個節點時,如果破壞了樹的平衡性,就會根據樹的失衡情況進行旋轉操作,如果左子樹高於右子樹,則右旋,如果右子樹高於左子樹,則左旋。
上面將樹從失衡狀態恢復到平衡狀態只進行了一次旋轉操作,事實上還有一種稍微複雜的情況,需要進行兩次旋轉才能將樹重新恢復平衡。
如果節點插入到a的左子樹的右節點,則需要先左旋再右旋來重新平衡樹。同理,如果節點插入到a的右子樹的左子節點,則需要先右旋再左旋來重新平衡樹。如果直接進行右旋,生成的樹將仍然是失衡的。
(二叉)堆是一個數組,它可以被看成一個近似的完全二叉樹,樹上的每一個結點對應數組中的一個元素。除了最底層外,該樹是完全充滿的,而且是從左至右填充。
圖
找路徑
BFS
示例:
從頂點1開始進行廣度優先搜索:
初始狀態,從頂點1開始,隊列={1}
訪問1的鄰接頂點,1出隊變黑,2,3入隊,隊列={2,3,}
訪問2的鄰接結點,2出隊,4入隊,隊列={3,4}
訪問3的鄰接結點,3出隊,隊列={4}
訪問4的鄰接結點,4出隊,隊列={ 空}
結點5對於1來說不可達。
DFS
示例
從頂點1開始做深度搜索:
初始狀態,從頂點1開始
依次訪問過頂點1,2,3後,終止於頂點3
從頂點3回溯到頂點2,繼續訪問頂點5,並且終止於頂點5
從頂點5回溯到頂點2,並且終止於頂點2
從頂點2回溯到頂點1,並終止於頂點1
從頂點4開始訪問,並終止於頂點4
BFS和DFS的時間複雜度
因爲算法導論這本書中對於圖來說,存儲結構都是用的鄰接鏈表,所以BFS和DFS的時間複雜度是O(N+E)
但是對於圖來說,還有另一種存儲形式,也就是鄰接矩陣,此時的時間複雜度爲O(n2)
DFS
BFS
求最短路徑
Dijkstra
貪心思想實現的,首先把起點到所有點的距離存下來找個最短的,然後遍歷一遍看通過剛剛找到的距離最短的點作爲中轉站會不會更近,如果更近了就更新距離,這樣把所有的點找遍之後就存下了起點到其他所有點的最短距離。
指定一個點(源點)到其餘各個頂點的最短路徑,也叫做“單源最短路徑”。例如求下圖中的1號頂點到2、3、4、5、6號頂點的最短路徑。
用矩陣存儲圖的信息
用一個一維數組存儲1號結點到其餘各個頂點的初始路程
算法的過程
時間複雜度O(n2)
堆優化Dijkstra算法,即運用堆排序來加快找邊的速度,使算法總體時間複雜度達到O((n+m)logm)
缺點是不能處理負權邊
Bellman-Ford
可求解邊上帶有負值的單源最短路徑問題
但是要求圖中不能包含權值總和爲負值迴路(負權值迴路)
如果存在從源點可達的負權值迴路,則最短路徑不存在,因爲可以重複走這個迴路,使得路徑無窮小。
是否存在負權值迴路的判斷
算法複雜度