其實目前國內幾乎只要是技術崗,面試中都100%會問算法和數據結構。面試
這二者能快速體現候選人真實的水平,好比代碼量,代碼的質量,性能,思惟是否有邏輯,是否靈活。算法
算法結果概述數組
1、前言數據結構
1.應用範圍:機器學習、數據挖掘、天然語言處理、圖形學等。機器學習
2.求職方面的考點:貪心、分治、動態規劃、樹、圖等。並且考官很是喜歡用算法來驗證你的代碼水平!函數
2、概述工具
1.定義:簡單的說,算法就是解決問題的方式。性能
2.特色:有窮性、肯定性、可行性、有輸入&輸出。學習
3、基礎算法:測試
1.窮舉法:求N個數的所有排列、8皇后問題。
2.分而治之:二分查找——減而治之、歸併排序——分而治之。
3.貪心:最小生成樹——Prim、Kruskal、單元最短路——Dijkstra。
4.動態規劃:揹包問題、士兵路徑。
算法複雜度問題
1、概述
談算法不談複雜度=耍流氓!
硬件發展是常數級的,可是算法規模擴大是指數級別的。
在實現以前,要預估算法所須要的資源:時間、空間。
2、時空複雜度:
1.含義:使用大O記號(最壞狀況,忽略係數)。
2.包括:時間複雜度(基本操做次數)、空間複雜度(佔用內存字節數)、二者的區別是空間能夠再利用、聯繫是時空互換(Hash表)。
3.舉例:
O(1) :基本運算,+,-,*,/,%,尋址。
O(logn) :二分查找。
O(n1/2) :枚舉約數。
O(n) :線性查找。
O(n2):樸素最近點對。
O(n3) :Floyd最短路、普通矩陣乘法。
O(nlogn):歸併排序。
O(2n) :枚舉所有的子集。
O(n!): 枚舉全排列。
上述例子的總結:
優秀:O(1) < O(logn) < O(n1/2) < O(n) < O(nlogn) 。
可能能夠優化:O(n2) < O(n3) < O(2n) < O(n!) 。
4.方法:輸入輸出、數循環次數、均攤分析。
棧和隊列問題
1、二者的共性和區別
1.共性:存放數據的線性表、空間複雜度O(n)、單次操做時間複雜度O(1) 。
2.區別:隊列——先進先出(FIFO),棧——先進後出(FILO)。
2、操做
入棧/隊列、出棧/隊列、判斷滿/空。
3、實現
1.須要的工具:數組和鏈表皆可(線性表)、指針(輔助變量):棧頂/底指針、隊頭/尾指針。
2.關鍵:出入元素的同時移動指針。
4、應用
括號匹配測試及模擬系統棧,由於篇幅比較長,能夠在公衆號後臺回覆「應用」獲取。
哈希表問題
1、哈希表概述
1.定義:存放數據的集合。
2.操做:根據(Key, Value)進行,插入、查找、刪除(能夠沒有)。
3.空間複雜度:O(m)。
4.單次操做時間複雜度:O(1) 。
5.本質:Key的索引。
2、哈希表例題
1.題目:給出n個[0, m)範圍內的整數,去重。
2.解題思路:
①快速排序:指望時間複雜度O(nlogn) ,附加空間複雜度O(1)。
②計數(基數)排序:時間複雜度O(n + m) 、附加空間複雜度O(m)。
3.在思考一下:
若n << m,計數排序的大量空間被浪費。
只需判斷是否出現過,優化?
將Key區間[0, m) 映射到[0, p) 。
H(key) = key mod p、若m > p, 多對一的映射方式。
3、哈希表的實現
1.處理衝突(Key, Value):開放地址法(數組)、拉鍊法(數組+鏈表)。
2.負載率:負債率=已有元素大小/ 存儲散列大小。
3.哈希函數設計:負載率越低,效率越高,通常負載率小於50%。
4、哈希表應用
1.題目:設字符串A=‘12314123’,求‘123’在A中出現的次數。若是不會寫KMP又想要O(n),應該怎麼處理那?
2.思路:Key(‘123’) = ‘1’* 10^2 +‘2’* 10 + ‘3’* 1 = 123。
3.問題:Key相等時Value有可能不一樣、每次比較Value也是不小的開銷,特別是Value可能很大、不考慮Value將產生錯誤率(錯誤率換時間)、多重哈希(下降錯誤率)。
布隆過濾器問題
1、布隆過濾器概述
1.定義:判斷一個字符串是否出現過的數據結構
2.和哈希表的區別:哈希表是空間換時間,而布隆過濾器是錯誤率換空間。
2、布隆過濾器的實現
1.由01的數字序列構成
2.插入:多個不一樣hash函數計算Key,置1
3.查找:有一個爲0不可能存在,全爲1可能存在
4.空間?
3、布隆過濾器的評價
1.優勢:時間和空間、多個hash函數可並行、交差並(位運算)。
2.缺點:錯誤率隨着負載率上升而上升、沒法刪除。