本講內(nèi)容:
為什么學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法?
學(xué)習(xí)重點是什么?
復(fù)雜度分析?
為什么學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法
閱讀框架源碼,理解其背后的設(shè)計思想
不想只會寫CRUD,只寫出能用的代碼,而是想寫出高質(zhì)量,性能較優(yōu)的代碼
以上都是為了能在軟件開發(fā)行業(yè)有長久的發(fā)展,不管是在升職加薪還是以后跳槽面試,都是必不可少的
學(xué)習(xí)重點是什么?
什么是數(shù)據(jù)結(jié)構(gòu)和算法?
數(shù)據(jù)結(jié)構(gòu),就是一組數(shù)據(jù)的存儲結(jié)構(gòu)。
算法,就是操作數(shù)據(jù)的一組方法。
數(shù)據(jù)結(jié)構(gòu)是為算法服務(wù)的,算法要作用在特定的數(shù)據(jù)結(jié)構(gòu)之上。數(shù)據(jù)結(jié)構(gòu)是靜態(tài)的,它只是組織數(shù)據(jù)的一種方式。如果不在它的基礎(chǔ)上操作、構(gòu)建算法,孤立存在的數(shù)據(jù)結(jié)構(gòu)就是沒用的。
為什么需要數(shù)據(jù)結(jié)構(gòu)和算法?
首先來看數(shù)據(jù)結(jié)構(gòu)和算法解決的是什么問題:如何更省、更快(空間和時間)地存儲和處理數(shù)據(jù)的問題
其次為什么要解決這個問題?原因是隨著計算機(jī)技術(shù)的發(fā)展,數(shù)據(jù)規(guī)模在不斷擴(kuò)大,但是計算機(jī)本身的計算和存儲能力的發(fā)展相比于數(shù)據(jù)的擴(kuò)張較為緩慢。而且人類對于高效率的追求是一個不變的目標(biāo)。如何提高計算機(jī)的計算效率,由此產(chǎn)生了數(shù)據(jù)結(jié)構(gòu)和算法。
如何衡量數(shù)據(jù)結(jié)構(gòu)和算法?
為了提升計算效率,大家設(shè)計了很多種數(shù)據(jù)結(jié)構(gòu)和算法。這些數(shù)據(jù)結(jié)構(gòu)和算法之間誰更優(yōu),這時就需要一個衡量的標(biāo)準(zhǔn)和方法。這個衡量方法即為復(fù)雜度分析。
復(fù)雜度分析:時間復(fù)雜度分析和空間復(fù)雜度分析
這也對應(yīng)了數(shù)據(jù)結(jié)構(gòu)和算法解決的問題:更快和更省的存儲和處理數(shù)據(jù)
學(xué)習(xí)內(nèi)容
10個數(shù)據(jù)結(jié)構(gòu): 數(shù)組,鏈表,棧,隊列,散列表,二叉樹,堆,跳表,圖,Trie樹
10個算法: 遞歸,排序,二分查找,搜索,哈希算法,貪心算法,分治算法,回溯算法,動態(tài)規(guī)劃,字符串匹配算法
復(fù)雜度分析
什么是復(fù)雜度分析?
復(fù)雜度分析是從時間和空間緯度衡量數(shù)據(jù)結(jié)構(gòu)和算法的。具體點說,復(fù)雜度描述的是算法執(zhí)行時間(或占用空間)與數(shù)據(jù)規(guī)模的增長關(guān)系。
為什么要進(jìn)行復(fù)雜度分析?
是一種理論分析的工具,能夠幫助我們計算代碼的性能,在進(jìn)行實際測試之前有個宏觀的認(rèn)識,幫助我們寫出高質(zhì)量的代碼。而且這種分析不依賴執(zhí)行環(huán)境、成本低、效率高、易操作、指導(dǎo)性強(qiáng)。
怎么進(jìn)行復(fù)雜度分析?
大 O 復(fù)雜度表示法
示例:

時間復(fù)雜度分析:
第 2、3 行代碼分別需要 1 個 unit_time 的執(zhí)行時間
第 4、5 行都運行了 n 遍,所以需要 2n*unit_time 的執(zhí)行時間
這段代碼總的執(zhí)行時間就是 (2n+2)*unit_time。
所有代碼的執(zhí)行時間 T(n) 與每行代碼的執(zhí)行次數(shù)成正比。
分析方法:
1. 只關(guān)注循環(huán)執(zhí)行次數(shù)最多的一段代碼
2.?加法法則:總復(fù)雜度等于量級最大的那段代碼的復(fù)雜度
3. 乘法法則:嵌套代碼的復(fù)雜度等于嵌套內(nèi)外代碼復(fù)雜度的乘積
幾種常見時間復(fù)雜度實例分析
多項式階:隨著數(shù)據(jù)規(guī)模的增長,算法的執(zhí)行時間和空間占用,按照多項式的比例增長。包括,O(1)(常數(shù)階)、O(logn)(對數(shù)階)、O(n)(線性階)、O(nlogn)(線性對數(shù)階)、O(n^2)(平方階)、O(n^3)(立方階)
非多項式階:隨著數(shù)據(jù)規(guī)模的增長,算法的執(zhí)行時間和空間占用暴增,這類算法性能極差。包括,O(2^n)(指數(shù)階)、O(n!)(階乘階)