算法拾憶

參考課程:算法

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數組

一、算法概論

1.一、複雜性

複雜性假設每一個機器指令的執行時間是常量,而後考慮因爲N變大而致使的增加速度。數據結構

 

時間複雜性分佈式

空間複雜性函數

 

最壞複雜性優化

最小複雜性編碼

平均複雜性設計

 

計算遞歸函數的複雜度有遞歸方程和定理。排序

 

1.二、算法的設計模式

暴力搜索

分治法

圖搜索和枚舉

     分支界限、回溯

隨機化方法

1.三、算法實現方法

遞歸與迭代

順序、並行、分佈式

肯定性與非肯定性

近似求解與精確求解

量子算法

 

1.四、最優化算法設計方法

線性規劃

動態規劃

貪心法

啓發式方法

 

二、分治算法

步驟: 原始問題->劃分子問題->求解子問題->合併結果。

 

2.一、求第m大的數,或者中位數

思想:

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個數

  遞歸執行。

2.二、快速排序進階

快速排序實際也是個分治算法,每次分紅兩部分。若是當作一棵二叉樹,每次選一個根節點,小於的在左節點,大於的在右節點,而後對左右進行遞歸。

快速排序的最壞狀況發生在逆序時,也就是二叉樹退化成了鏈表的時候。時間複雜度爲O(n*n)

避免最壞狀況的方法: 每次選數的時候用隨機數,這樣能夠防止輸入原始數組時惡意傳遞逆序數組。

 

三、樹

3.一、二叉樹遍歷非遞歸算法

中序:遇到節點壓棧,遍歷左樹,左樹遍歷結束,彈出棧頂元素並打印,遍歷右樹;

先序:

後序:

3.二、堆

徹底二叉樹,用數組存放,訪問用下標,父節點位置爲1/2子節點位置。左兒子位置=當前位置*2,右兒子位置=當前位置*2+1

最大堆只保證父節點比子節點大,左右節點無關。

增長:加入最尾部,而後調整

刪除:堆的刪除用途都是刪除最大/小值,也就是堆頂元素。刪除後,用最後的補充,而後調整

最大堆的創建:順序創建,從最後一個有子節點的節點開始調整,依次向上所有調整爲最大堆。複雜度O(N)

3.三、哈夫曼樹與哈夫曼編碼

哈夫曼樹 就是一個斷定樹(決策樹),但他要保證判斷路徑最優。又叫最優二叉樹

https://mooc.study.163.com/learn/1000033001?tid=2402970002#/learn/content?type=detail&id=2403307452

建樹過程,從全部樹中挑兩個權值最小的樹,組成一個新樹,用新樹的權值代替以前的兩個權值,再建下一個新樹。

 

哈夫曼編碼:不等長編碼。把頻率高的數據用短的編碼,頻率低的字符串用長的編碼。

但要解決的問題是:二義性問題。解決二義性問題的方案是任意一個編碼不能是其餘編碼的前綴。

保證這個的辦法就是構造一個二叉樹,每一個節點表明0/1,而後只有葉子節點能夠存放真正的編碼。

而保證最優的辦法,就是這個二叉樹不平衡,最頻繁出現的編碼的深度爲最小。

而這個不平衡的二叉樹,就是哈夫曼樹。

他的建立過程:編碼的出現頻率就是其權重,而後按這個權重組成哈夫曼樹。

 

四、堆棧

4.一、堆棧的應用

函數調用及遞歸實現

深度優先搜索

回溯算法

4.二、算數表達式計算

計算機最容易計算後綴表達式,平常見到的是中綴表達式,因此第一步須要把中綴改爲後綴

https://mooc.study.163.com/learn/1000033001?tid=2402970002#/learn/content?type=detail&id=2403307442&cid=2403323329

 

五、圖

5.一、圖的存放

鄰接矩陣

鄰接表 -- 必定要夠稀疏才合適使用

其餘方法,好比非量子的座標系。

 5.二、圖的遍歷

深度優先 DFS Depth First Search :

   一直走,走到頭,返回,返回的過程當中,發現沒走過的路,繼續一直走。。。  原路返回的數據結構就是堆棧。

廣度優先 BFS Breadth First Search :

  取初始點,壓棧,棧中取節點,獲取與該節點連着的全部節點,壓棧。。。

 

複雜地取決於數據結構,對於鄰接矩陣,須要O(N*N);對於鄰接表,須要O(N+E)

相關文章
相關標籤/搜索