參考課程:算法
https://mooc.study.163.com/course/1000002012?_trace_c_p_k2_=71acf89eff5548528d3ffa68b0912f8f#/info設計模式
https://mooc.study.163.com/course/1000005000?_trace_c_p_k2_=60f72128fe6348b7ae19623592d44785#/info數組
複雜性假設每一個機器指令的執行時間是常量,而後考慮因爲N變大而致使的增加速度。數據結構
時間複雜性分佈式
空間複雜性函數
最壞複雜性優化
最小複雜性編碼
平均複雜性設計
計算遞歸函數的複雜度有遞歸方程和定理。排序
暴力搜索
分治法
圖搜索和枚舉
分支界限、回溯
隨機化方法
遞歸與迭代
順序、並行、分佈式
肯定性與非肯定性
近似求解與精確求解
量子算法
線性規劃
動態規劃
貪心法
啓發式方法
步驟: 原始問題->劃分子問題->求解子問題->合併結果。
思想:
0、入參:數據總量爲T,求第N大的數
一、把數據分紅k等份,每份T/k(此值要較小,便於排序)
二、對每份進行排序
三、每份取第N/k個數,做爲一個集合,對這個集合取第N/k個數,此數記爲M
四、把本來的T中,按照各組的第N/k個數,取出比M大的數和比M小的數,分別記爲T1,T2
五、若是T1的元素數量大於N,則說明T1裏的數據太多了,那麼須要對T1中找第K個數;
若是T1的元素數量小於N,則說明T1裏的數據太少了,那麼須要在T2中找第N-K個數
遞歸執行。
快速排序實際也是個分治算法,每次分紅兩部分。若是當作一棵二叉樹,每次選一個根節點,小於的在左節點,大於的在右節點,而後對左右進行遞歸。
快速排序的最壞狀況發生在逆序時,也就是二叉樹退化成了鏈表的時候。時間複雜度爲O(n*n)
避免最壞狀況的方法: 每次選數的時候用隨機數,這樣能夠防止輸入原始數組時惡意傳遞逆序數組。
中序:遇到節點壓棧,遍歷左樹,左樹遍歷結束,彈出棧頂元素並打印,遍歷右樹;
先序:
後序:
徹底二叉樹,用數組存放,訪問用下標,父節點位置爲1/2子節點位置。左兒子位置=當前位置*2,右兒子位置=當前位置*2+1
最大堆只保證父節點比子節點大,左右節點無關。
增長:加入最尾部,而後調整
刪除:堆的刪除用途都是刪除最大/小值,也就是堆頂元素。刪除後,用最後的補充,而後調整
最大堆的創建:順序創建,從最後一個有子節點的節點開始調整,依次向上所有調整爲最大堆。複雜度O(N)
哈夫曼樹 就是一個斷定樹(決策樹),但他要保證判斷路徑最優。又叫最優二叉樹
https://mooc.study.163.com/learn/1000033001?tid=2402970002#/learn/content?type=detail&id=2403307452
建樹過程,從全部樹中挑兩個權值最小的樹,組成一個新樹,用新樹的權值代替以前的兩個權值,再建下一個新樹。
哈夫曼編碼:不等長編碼。把頻率高的數據用短的編碼,頻率低的字符串用長的編碼。
但要解決的問題是:二義性問題。解決二義性問題的方案是任意一個編碼不能是其餘編碼的前綴。
保證這個的辦法就是構造一個二叉樹,每一個節點表明0/1,而後只有葉子節點能夠存放真正的編碼。
而保證最優的辦法,就是這個二叉樹不平衡,最頻繁出現的編碼的深度爲最小。
而這個不平衡的二叉樹,就是哈夫曼樹。
他的建立過程:編碼的出現頻率就是其權重,而後按這個權重組成哈夫曼樹。
函數調用及遞歸實現
深度優先搜索
回溯算法
計算機最容易計算後綴表達式,平常見到的是中綴表達式,因此第一步須要把中綴改爲後綴
鄰接矩陣
鄰接表 -- 必定要夠稀疏才合適使用
其餘方法,好比非量子的座標系。
深度優先 DFS Depth First Search :
一直走,走到頭,返回,返回的過程當中,發現沒走過的路,繼續一直走。。。 原路返回的數據結構就是堆棧。
廣度優先 BFS Breadth First Search :
取初始點,壓棧,棧中取節點,獲取與該節點連着的全部節點,壓棧。。。
複雜地取決於數據結構,對於鄰接矩陣,須要O(N*N);對於鄰接表,須要O(N+E)