有哪些常見的數(shù)據(jù)結(jié)構(gòu)?基本操作是什么?常見的排序算法是如何實現(xiàn)的?各有什么優(yōu)缺點?本文簡要分享算法基礎(chǔ)、常見的數(shù)據(jù)結(jié)構(gòu)以及排序算法。
一 前言
1 為什么要學(xué)習(xí)算法和數(shù)據(jù)結(jié)構(gòu)?
- 解決特定問題。
- 深度優(yōu)化程序性能的基礎(chǔ)。
- 學(xué)習(xí)一種思想:如何把現(xiàn)實問題轉(zhuǎn)化為計算機語言表示。
2 業(yè)務(wù)開發(fā)要掌握到程度?
- 了解常見數(shù)據(jù)結(jié)構(gòu)和算法,溝通沒有障礙。
- 活學(xué)活用:遇到問題時知道要用什么數(shù)據(jù)結(jié)構(gòu)和算法去優(yōu)化。
二 數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)
1 什么是數(shù)據(jù)結(jié)構(gòu)?
數(shù)據(jù)結(jié)構(gòu)是數(shù)據(jù)的組織、管理和存儲格式,其使用目的是為了高效的訪問和修改數(shù)據(jù)。
數(shù)據(jù)結(jié)構(gòu)是算法的基石。如果把算法比喻成美麗靈動的舞者,那么數(shù)據(jù)結(jié)構(gòu)就是舞者腳下廣闊而堅實的舞臺。
2 物理結(jié)構(gòu)和邏輯結(jié)構(gòu)的區(qū)別?
物理結(jié)構(gòu)就像人的血肉和骨骼,看得見,摸得著,實實在在,如數(shù)組、鏈表。
邏輯結(jié)構(gòu)就像人的思想和精神,它們看不見、摸不著,如隊列、棧、樹、圖。
3 線性存儲結(jié)構(gòu)和非線性存儲結(jié)構(gòu)的區(qū)別?
- 線性:元素之間的關(guān)系是一對一的,如棧、隊列。
- 非線性:每個元素可能連接0或多個元素,如樹、圖。
三 算法基礎(chǔ)
1 什么是算法?
- 數(shù)學(xué):算法是用于解決某一類問題的公式和思想。
- 計算機:一系列程序指令,用于解決特定的運算和邏輯問題。
2 如何衡量算法好壞?
- 時間復(fù)雜度:運行時間長短。
- 空間復(fù)雜度:占用內(nèi)存大小。
3 怎么計算時間復(fù)雜度?
大O表示法(漸進(jìn)時間復(fù)雜度):把程序的相對執(zhí)行時間函數(shù)T(n)簡化為一個數(shù)量級,這個數(shù)量級可以是n、n^2、logN等。
推導(dǎo)時間復(fù)雜度的幾個原則:
- 如果運行時間是常數(shù)量級,則用常數(shù)1表示。
- 只保留時間函數(shù)中的最高階項。
- 如果最高階項存在,則省去最高項前面的系數(shù)。
時間復(fù)雜度對比:O(1) > O(logn) > O(n) > O(nlogn) > O(n^2)。
不同時間復(fù)雜度算法運行次數(shù)對比:
4 怎么計算空間復(fù)雜度?
常量空間 O(1):存儲空間大小固定,和輸入規(guī)模沒有直接的關(guān)系。
線性空間 O(n):分配的空間是一個線性的集合,并且集合大小和輸入規(guī)模n成正比。
二維空間 O(n^2):分配的空間是一個二維數(shù)組集合,并且集合的長度和寬度都與輸入規(guī)模n成正比。
遞歸空間 O(logn):遞歸是一個比較特殊的場景。雖然遞歸代碼中并沒有顯式的聲明變量或集合,但是計算機在執(zhí)行程序時,會專門分配一塊內(nèi)存空間,用來存儲“方法調(diào)用棧”。執(zhí)行遞歸操作所需要的內(nèi)存空間和遞歸的深度成正比。
5 如何定義算法穩(wěn)定性?
穩(wěn)定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
不穩(wěn)定:如果a原本在b的前面,而a=b,排序之后 a 可能會出現(xiàn)在 b 的后面。
6 有哪些常見算法?
首先要明確:特定算法解決特定問題。
- 字符串:暴力匹配、BM、KMP、Trie等。
- 查找:二分查找、遍歷查找等。
- 排序:冒泡排序、快排、計數(shù)排序、堆排序等。
- 搜索:TFIDF、PageRank等。
- 聚類分析:期望最大化、k-meanings、k-數(shù)位等。
- 深度學(xué)習(xí):深度信念網(wǎng)絡(luò)、深度卷積神經(jīng)網(wǎng)絡(luò)、生成式對抗等。
- 異常檢測:k最近鄰、局部異常因子等。
- ......
其中,字符串、查找、排序算法是最基礎(chǔ)的算法。
四 常見數(shù)據(jù)結(jié)構(gòu)
1 數(shù)組
1)什么是數(shù)組?
數(shù)據(jù)是有限個相同類型的變量所組成的有序集合。數(shù)組中的每一個變量被稱為元素。
2)數(shù)組的基本操作?
讀取O(1)、更新O(1)、插入O(n)、刪除O(n)、擴(kuò)容O(n)。
2 鏈表
1)什么是鏈表?
鏈表是一種在物理上非連續(xù)、非順序的數(shù)據(jù)結(jié)構(gòu),由若干個節(jié)點組成。
單向鏈表的每一個節(jié)點又包含兩部分,一部分是存放數(shù)據(jù)的變量data,另一部分是指向下一個節(jié)點的指針next。
2)鏈表的基本操作?
讀取O(n)、更新O(1)、插入O(1)、刪除O(1)。
3)鏈表 VS 數(shù)組
數(shù)組:適合多讀、插入刪除少的場景。
鏈表:適用于插入刪除多、讀少的場景。
3 棧
1)什么是棧?
棧是一種線性邏輯數(shù)據(jù)結(jié)構(gòu),棧的元素只能后進(jìn)先出。最早進(jìn)入的元素存放的位置叫做棧底,最后進(jìn)入的元素存放的位置叫棧頂。
一個比喻,棧是一個一端封閉一端的開放的中空管子,隊列是兩端開放的中空管子。
2)如何實現(xiàn)棧?
數(shù)組實現(xiàn):
鏈表實現(xiàn):
3)棧的基本操作
入棧O(1)、出棧O(1)。
4)棧的應(yīng)用?
- 回溯歷史,比如方法調(diào)用棧。
- 頁面面包屑導(dǎo)航。
4 隊列
1)什么是隊列?
一種線性邏輯數(shù)據(jù)結(jié)構(gòu),隊列的元素只能后進(jìn)后出。隊列的出口端叫做隊頭,隊列的入口端叫做隊尾。
2)如何實現(xiàn)隊列?
數(shù)組實現(xiàn):
鏈表實現(xiàn):
3)隊列的基本操作?
入隊 O(1)、出隊 O(1)。
4)隊列的應(yīng)用
- 消息隊列
- 多線程的等待隊列
- 網(wǎng)絡(luò)爬蟲的待爬URL隊列
5 哈希表
1)什么是哈希表?
一種邏輯數(shù)據(jù)結(jié)構(gòu),提供了鍵(key)和值(value)的映射關(guān)系。
-
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
573瀏覽量
40232 -
排序算法
+關(guān)注
關(guān)注
0文章
53瀏覽量
10102 -
存儲結(jié)構(gòu)
+關(guān)注
關(guān)注
0文章
21瀏覽量
9727
發(fā)布評論請先 登錄
相關(guān)推薦
評論