從今天開始,邁過「資料結構和演算法」這道坎!
1.面試、程式設計角度
1.1 通關大廠面試
1.2 日常業務中不再crud,提高**質量(有助於閱讀框架原始碼、背後設計思想。更好處理日常業務需求)
1.3 更高的要求、追求,高手之間比內功、細節
2.個人角度
2.1 不被行業淘汰,不再原地踏步
2.2 對程式設計要有追求、不要滿足現狀
2.3 訓練大腦思維,對生活、事業都有裨益
1. 什麼是資料結構和演算法?
1.1 概念
資料結構:對資料的組織方式
演算法:對資料結構的操作
1.2 兩者關係:相輔相成
演算法是建立在資料結構之上的操作,資料結構是演算法的操作物件
2.學習的重點在什麼地方?
心法:複雜度分析(佔據半壁江山)
口訣:10個資料結構:資料、佇列、堆、鍊錶、二叉樹、trie樹圖、跳表、雜湊表、棧
10個演算法:遞迴、排序、二分查詢、搜尋、雜湊演算法、貪心演算法、分治演算法、回溯演算法、動態規劃、字串匹配演算法
建議:不要為學習而學習,要學它的「來歷」 「自身」的特點 「適合解決的問題」 以及 「實際應用場景」。也就是說,
要將知識與實際問題聯絡起來。先知己知彼(能解決什麼問題),再應用到戰場(應用地方)。
3.一些技巧:
1).邊學邊練,適度刷題
千里之行始於足下,要多敲**
2).多問、多思考、多互動
不要被動記憶,多辯證思考。
掌握一門知識,要說出來,通過交流、表達促進學習
3).打怪公升級法
學習途中,設立切實可行的object
4).知識需要沉澱,不要想檢視一下子掌握所有
量變引起質變、學習知識的過程是反覆迭代、不斷沉澱的過程
3.1 如何分析、統計演算法的執行效率和資源消耗
3.1.1 為什麼需要複雜度分析
事後統計法的侷限:
1.測試結果非常依賴環境
2.測試結果受資料規模影響很大
3.1.2 時間複雜度(漸進時間複雜度)
1.大0複雜度表示法:所有**的執行時間t(n)與每行**的執行此時n成正比,可表示為:t(n) = o(f(n))
意義:表**執行時間隨資料規模增長的變化趨勢
3.2.分析方法:
1).只關注迴圈執行次數最多的一段**
2).加法法則:總複雜度等於量級最大的那段**的複雜度
3).乘法法則:巢狀**的複雜度等於巢狀內外**複雜度的乘積
3.3.幾種常見時間複雜度例項分析
複雜度量級:o(1) o(logn) o(n) o(nlogn) o(n2..n^k) 2^n n!
可粗分:多項式量級和非多項式量級
3.4.多項式時間複雜度解釋
1.o(1):常量級時間複雜度
一般情況下,只要演算法中不存在迴圈語句、遞迴語句,即使有成千 上萬行的**,其時間複雜度也是ο(1)。
2.o(logn)、o(nlogn)
3.o(m+n) o(m*n)
3.5 空間複雜度(漸進空間複雜度)
表示演算法的儲存空間與資料規模之間的增長關係.
3.6 **最好、最壞、平均、均攤時間複雜度
// n 表示陣列 array 的長度
intfind
(int
array,
int n,
int x)
}return pos;
}
3.6.1 最好、最壞時間複雜度
最好時間複雜度:在最理想情況下,執行這段**的時間複雜度
最壞時間複雜度:在最糟糕情況下,執行這段**的時間複雜度
3.6.2 平均情況時間複雜度
要考慮每種情況發生的概率:加權平均值,也叫期望值。故平均時間複雜度的全稱是「加權平均時間複雜度」 或 「期望時間複雜度」
大多數情況下,不需分析最好、最壞、平均時間複雜度。
只有同一塊**在不同情況下,時間複雜度有量級差別時,才會使用
3.6.3 均攤時間複雜度
攤還分析法:把耗時多的操作分攤到耗時少的操作,這樣,一組連續操作的平均耗時就降低。此時的時間複雜度為均攤時間複雜度
應用在特殊場景: 對乙個資料結構進行一組連續操作,大部分情況下時間複雜度都很低,只有個別情況下時間複雜度比較高,
而且這些操作之間存在前後連貫的時序關係
在能夠應用均攤時間複雜度分析的場合,一般均攤時間復 雜度就等於最好情況時間複雜度。
複雜度分析是我們學習資料結構與演算法的的有效導向/衡量標準,在後面學習10種演算法時再分析對應的複雜度。
一點題外話:
以為理解就完事了。但最後時間還是無情帶走了之前一切的努力,只留下殘留在腦海中的一些零散碎片。這裡與大家共勉,
以印證那句誓言———「從今天起,邁過「資料結構與演算法」這道坎」!
參考:
極客時間的《資料結構與演算法之美》
01 複雜度分析(上)
執行次數!大 o 時間複雜度實際上並不具體表示 真正的執行時間,而是表示 執行時間隨資料規模增長的變化趨勢,所以,也叫作漸進時間複雜度 asymptotic time complexity 簡稱時間複雜度。當 n 很大時,你可以把它想象成 10000 100000。而公式中的低階 常量 係數三部分並...
01 複雜度分析(上) 時間 空間複雜度講解
我們都知道,資料結構和演算法本身解決的是 快 和 省 的問題,即如何讓 執行得更快,如何讓 更省儲存空間。所以,執行效率是演算法乙個非常重要的考量指標。那如何來衡量你編寫的演算法 的執行效率呢?這裡就要用到時間 空間複雜度分析。1 什麼是複雜度分析?複雜度也叫漸進複雜度,包括時間複雜度和空間複雜度,...
複雜度分析 時間複雜度分析和空間複雜度分析
其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...