1. 前言
對于一名有追求的程序猿來說,數(shù)據(jù)結(jié)構(gòu)和算法是一門必修課,它是內(nèi)功,內(nèi)功的深厚直接決定了解決問題的能力和學(xué)習(xí)新技術(shù)的能力。
2. 定義
廣義上:
數(shù)據(jù)結(jié)構(gòu)就是數(shù)據(jù)的存放方式,就像圖書館中的書排列的規(guī)則。
算法就是操作數(shù)據(jù)的方式,就像如何從圖書館中找一本書的方法。
狹義上:
數(shù)組、鏈表、隊(duì)列、棧、樹、圖就是數(shù)據(jù)結(jié)構(gòu)
冒泡排序、堆排序、二分查找、Dijkstra就是算法
它們相輔相成,總結(jié)來說:
程序設(shè)計(jì) = 數(shù)據(jù)結(jié)構(gòu) + 算法
3.意義
- 寫出高質(zhì)量的代碼, 程序在性能上有質(zhì)的提升。
- 提升邏輯思維能力,更容易看懂別人寫的代碼。
- 助攻面試,進(jìn)大廠。
- 為轉(zhuǎn)戰(zhàn)AI,打下基礎(chǔ)。
4. 數(shù)據(jù)結(jié)構(gòu)
4.1 數(shù)據(jù)結(jié)構(gòu)的分類
數(shù)據(jù)結(jié)構(gòu)可分為:
- 邏輯結(jié)構(gòu):指數(shù)據(jù)對象中數(shù)據(jù)元素之間的相互關(guān)系,也是我們研究的重點(diǎn)
- 物理結(jié)構(gòu):數(shù)據(jù)的邏輯結(jié)構(gòu)在計(jì)算機(jī)中的存儲形式
4.2 邏輯結(jié)構(gòu)
四大邏輯結(jié)構(gòu)
-
集合結(jié)構(gòu):集合結(jié)構(gòu)中的元素除了同屬于一個(gè)集合外,它們之間沒有其他關(guān)系
集合.png -
線性結(jié)構(gòu): 線性結(jié)構(gòu)中的數(shù)據(jù)之間是一對一的關(guān)系
線性.png -
樹形結(jié)構(gòu):樹形結(jié)構(gòu)中的數(shù)據(jù)元素之間是一對多的層次關(guān)系
樹形.png -
圖形結(jié)構(gòu): 圖形結(jié)構(gòu)的數(shù)據(jù)元素是多對多的關(guān)系
圖形.png
四種邏輯結(jié)構(gòu)的對比如下:
序號 | 名稱 | 元素之間的關(guān)系 |
---|---|---|
1 | 集合結(jié)構(gòu) | 沒有關(guān)系 |
2 | 線性結(jié)構(gòu) | 一對一 |
3 | 樹形結(jié)構(gòu) | 一對多 |
4 | 圖形結(jié)構(gòu) | 多對多 |
4.3 物理結(jié)構(gòu)
物理結(jié)構(gòu)其實(shí)就是研究如何將數(shù)據(jù)元素存儲到計(jì)算機(jī)的存儲器中,這里指的存儲器是針對內(nèi)存而言,像硬盤、軟盤、光盤等外部存儲設(shè)備通常是以文件的形式來描述的。
數(shù)據(jù)元素的存儲結(jié)構(gòu)形式有兩種:順序存儲和鏈?zhǔn)酱鎯?/p>
-
順序存儲結(jié)構(gòu):是把元素存放在地址連續(xù)的存儲單元里,其數(shù)據(jù)間的邏輯關(guān)系和物理關(guān)系是一致的。例如數(shù)組
順序存儲.png 鏈?zhǔn)酱鎯Y(jié)構(gòu): 把數(shù)據(jù)元素存放在任意的存儲單元里,這組存儲單元可以是連續(xù)的,也可以是不連續(xù)的。
兩種物理結(jié)構(gòu)的對比如下所示:
序號 | 名稱 | 元素存儲特點(diǎn) |
---|---|---|
1 | 順序存儲結(jié)構(gòu) | 地址連續(xù)的存儲單元里 |
2 | 鏈?zhǔn)酱鎯Y(jié)構(gòu) | 地址不一定連續(xù)的存儲單元里 |
5. 算法
算法就是特定問題解決方法的步驟描述,在計(jì)算機(jī)中用指令來表達(dá)
5.1 舉例
最經(jīng)典的一個(gè)例子:1 + 2 + 3 ... + 100
如果我們按照順序加下去,需要運(yùn)算的次數(shù)就是99次加法運(yùn)算,代碼表達(dá):
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
但是,我們可以發(fā)現(xiàn)1 + 100 = 101, 2 + 99 = 101 ...... 50 + 55 = 101
所以和為 50 * 101 = 5050,找到規(guī)律以后,只要做1次乘法運(yùn)算,代碼表達(dá):
int sum = 50 * 101;
這就是兩個(gè)不同的算法,可以看出,算法2效率明顯高于算法1
5.2 特性
- 輸入:零個(gè)或多個(gè)輸入
- 輸出:至少一個(gè)或多個(gè)輸出
- 有窮性:指算法在執(zhí)行有限的步驟后,自動結(jié)束而不會出現(xiàn)無限循環(huán),并且每一個(gè)步驟在可接受的范圍之內(nèi)
- 確定性:算法的每一個(gè)步驟都具有確定的含義,不會出現(xiàn)二義性
- 可行性:算法的每一步都必須是可行的,也就是說,每一步都能夠執(zhí)行有限次數(shù)完成。
5.3 要求
設(shè)計(jì)算法主要追求如下兩個(gè)方面
- 時(shí)間效率高(時(shí)間復(fù)雜度)
- 存儲量低(空間復(fù)雜度)
6. 總結(jié)
- 數(shù)據(jù)結(jié)構(gòu)和算法很重要,是內(nèi)功。
- 程序設(shè)計(jì) = 數(shù)據(jù)結(jié)構(gòu) + 算法
- 數(shù)據(jù)結(jié)構(gòu)包括:邏輯結(jié)構(gòu)和物理結(jié)構(gòu)
- 邏輯結(jié)構(gòu)包括:集合結(jié)構(gòu)、線性結(jié)構(gòu)、樹形結(jié)構(gòu)、圖形結(jié)構(gòu)
- 物理結(jié)構(gòu)包括: 順序存儲結(jié)構(gòu)和鏈?zhǔn)酱鎯Y(jié)構(gòu)
- 算法就是特定問題解決方法的步驟描述
- 算法的考量主要使用時(shí)間復(fù)雜度和空間復(fù)雜度
參考資料:小甲魚的數(shù)據(jù)結(jié)構(gòu)..