《算法图解》---笔记
第1章 算法簡介
二分查找,每次都會減少一半,對于n個元素,使用二分查找最多需要log2n即可找到對應的值
二分查找必須是有序的
大O表示法指出了算法有多快。
大O表示法指出了最糟糕情況下的運行時間
從快到慢的常見5種大O運行時間:
O(logn) < O(n) < O(n * logn) < O(n^2) < O(n!)
第2章 選擇排序
兩種最基本的數據結構—數組和鏈表
數組:
存儲連續的數據
數組的查找效率很高,可迅速找到數組的任何元素
鏈表:
元素可以存儲在內存的任何地方。每個元素都存儲了下一個元素的地址,從而使一系列隨機的內存地址串在一起。
鏈表查找效率沒有數組高,查找鏈表,需要從頭開始,一個一個查找。
當需要在中間插入元素時,鏈表是更好的選擇
刪除元素,鏈表也是更好的選擇
第3章 遞歸
如果使用循環,程序的性能可能更高;
如果使用遞歸,程序可能更容易理解。
由于遞歸函數調用自己,因此編寫這樣的函數時很容易出錯,導致無限循環。
編寫遞歸函數時,必須告訴它何時停止遞歸。
第4章 快速排序
分而治之(divide and conquer D&C):一種著名的遞歸式問題解決方法
遞歸 -> 分而治之 -> 快速排序
如何將一塊168 x 64的地均勻地分成正方形,并確保分出的方塊是最大的?
D&C不止可用于解決問題的算法,更是一種解決問題的思路。
第5章 散列表
散列函數總是將同樣的輸入映射到相同的索引
散列函數將不同的輸入映射到不同的索引
散列函數和數組,創建了一種被稱為 散列表(hase table)的數據結構
散列表也被稱為:散列映射、映射、字典、關聯數組
處理沖突的最簡單的方法:如果兩個鍵映射到了同一個位置,就在這個位置存儲一個鏈表
- 最理想的情況:散列函數將鍵均勻地映射到散列表的不同位置
- 如果散列表存儲的鏈表很長,散列表的速度將急劇下降。然而,如果使用的散列函數很好,這些鏈表就不會很長
- 散列函數很重要,好的散列函數很少導致沖突。
第6章 廣度優先搜索
圖由 節點 和 邊 組成
一個節點可能與眾多節點直接相連,這些節點被稱為鄰居。
解決最短路徑問題的算法被稱為:廣度優先搜索
廣度優先搜索可回答兩類問題:
隊列:先進先出(FIFO),只支持兩種操作:入隊和出隊
棧:后進先出(LIFO)
有向圖中的邊為箭頭,箭頭的方向指定了關系的方向
無向圖中的邊不帶箭頭,其中的關系是雙向的。
無向圖意味著兩個節點彼此指向對方,其實就是環
第7章 狄克斯特拉算法
廣度優先搜索找出段數最少的路徑
狄克斯特拉算法(Dijksta)找出最快的路徑
廣度優先搜索查找兩點之間的最短路徑,“最短”指的是 段數最少
狄克斯特拉算法中,給每段都分配了一個數字或權重,因此,找出的是總權重最小的路徑。狄狄克斯特拉算法只適用于:有向、無環圖
狄克斯特拉算法不能用于:包含 負權邊的圖
第8章 貪婪算法
貪婪算法很簡單:每步都采取最優的做法。每步都選擇局部最優解,最終得到全局最優解。
NP完全問題:沒有快速算法的問題
學習識別NP完全問題,以免浪費時間去尋找解決它們的快速算法
第9章 動態規劃
動態規劃:將問題分成小問題,并先著手解決這些小問題
動態規劃處理的是,01問題,要不拿,要不不拿,而不能是拿一部分的(大米、扁豆)
第10章 K最近鄰算法
K最近鄰(KNN)算法,把A與附近相近B分為一類
KNN用于分類和回歸,需要考慮最近的鄰居
推薦系統就是使用的K最近鄰算法
KNN算法也可用于機器學習領域、OCR識別
第11章 接下來如何做
二叉查找樹:對于每個節點,左子節點的值都比它小,而右子節點的值都比它大
二叉查找樹中查找節點時,平均運行時間為O(logn),但在最糟的情況下所需時間是O(n)
而在有序數組中查找,最糟的情況下所需時間也只有O(logn)
那么,有序數組查找比二叉查找樹好?
然而,二叉查找樹的插入與刪除的操作速度要快得多
總結
以上是生活随笔為你收集整理的《算法图解》---笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【APIO2015】完跪记
- 下一篇: 关于android 调用网页隐藏地址栏