少高潮爽了在观看奂费_奶水无码专区_欧美亚洲三级日韩_91精品国产综合香蕉_秋霞伦理电影在线_GOGO亚洲肉体艺术欣赏图片_一本一道a√无码中文字幕_免费看一级毛片无码区_内射视频网站在线观看_国产激情视频精品中文

編程代碼
新聞詳情

常見(jiàn)的8種數(shù)據(jù)結(jié)構(gòu)

發(fā)布時(shí)間:2020-01-06 08:40:09 最后更新:2020-11-23 14:46:28 瀏覽次數(shù):3350


1976 年,一個(gè)瑞士計(jì)算機(jī)科學(xué)家寫一本書(shū) 《Algorithms + Data Structures = Programs》。即:算法 + 數(shù)據(jù)結(jié)構(gòu) = 程序。40 多年過(guò)去了,這個(gè)等式依然成立。

很多代碼面試題都要求候選者深入理解數(shù)據(jù)結(jié)構(gòu),不管你來(lái)自大學(xué)計(jì)算機(jī)專業(yè)還是編程培訓(xùn)機(jī)構(gòu),也不管你有多少年編程經(jīng)驗(yàn)。有時(shí)面試題會(huì)直接提到數(shù)據(jù)結(jié)構(gòu),比如“給我實(shí)現(xiàn)一個(gè)二叉樹(shù)”,然而有時(shí)則不那么明顯,比如“統(tǒng)計(jì)一下每個(gè)作者寫的書(shū)的數(shù)量”。

什么是數(shù)據(jù)結(jié)構(gòu)?

數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲(chǔ)、組織數(shù)據(jù)的方式。對(duì)于特定的數(shù)據(jù)結(jié)構(gòu)(比如數(shù)組),有些操作效率很高(讀某個(gè)數(shù)組元素),有些操作的效率很低(刪除某個(gè)數(shù)組元素)。程序員的目標(biāo)是為當(dāng)前的問(wèn)題選擇最優(yōu)的數(shù)據(jù)結(jié)構(gòu)。

為什么我們需要數(shù)據(jù)結(jié)構(gòu)?

數(shù)據(jù)是程序的核心要素,因此數(shù)據(jù)結(jié)構(gòu)的價(jià)值不言而喻。無(wú)論你在寫什么程序,你都需要與數(shù)據(jù)打交道,比如員工工資、股票價(jià)格、雜貨清單或者電話本。在不同場(chǎng)景下,數(shù)據(jù)需要以特定的方式存儲(chǔ),我們有不同的數(shù)據(jù)結(jié)構(gòu)可以滿足我們的需求。

8 種常用數(shù)據(jù)結(jié)構(gòu)

  1. 數(shù)組
  2. 隊(duì)列
  3. 鏈表
  4. 樹(shù)
  5. 前綴樹(shù)
  6. 哈希表

1. 數(shù)組

數(shù)組(Array)大概是最簡(jiǎn)單,也是最常用的數(shù)據(jù)結(jié)構(gòu)了。其他數(shù)據(jù)結(jié)構(gòu),比如棧和隊(duì)列都是由數(shù)組衍生出來(lái)的。

下圖展示了 1 個(gè)數(shù)組,它有 4 個(gè)元素:

每一個(gè)數(shù)組元素的位置由數(shù)字編號(hào),稱為下標(biāo)或者索引(index)。大多數(shù)編程語(yǔ)言的數(shù)組第一個(gè)元素的下標(biāo)是 0。

根據(jù)維度區(qū)分,有 2 種不同的數(shù)組:

  • 一維數(shù)組(如上圖所示)
  • 多維數(shù)組(數(shù)組的元素為數(shù)組)

數(shù)組的基本操作

  • Insert - 在某個(gè)索引處插入元素
  • Get - 讀取某個(gè)索引處的元素
  • Delete - 刪除某個(gè)索引處的元素
  • Size - 獲取數(shù)組的長(zhǎng)度

2. 棧

撤回,即 Ctrl+Z,是我們最常見(jiàn)的操作之一,大多數(shù)應(yīng)用都會(huì)支持這個(gè)功能。你知道它是怎么實(shí)現(xiàn)的嗎?答案是這樣的:把之前的應(yīng)用狀態(tài)(限制個(gè)數(shù))保存到內(nèi)存中,最近的狀態(tài)放到第一個(gè)。這時(shí),我們需要棧(stack)來(lái)實(shí)現(xiàn)這個(gè)功能。

棧中的元素采用 LIFO (Last In First Out),即后進(jìn)先出。

下圖的棧有 3 個(gè)元素,3 在最上面,因此它會(huì)被第一個(gè)移除:

棧的基本操作

  • Push — 在棧的最上方插入元素
  • Pop — 返回棧最上方的元素,并將其刪除
  • isEmpty — 查詢棧是否為空
  • Top — 返回棧最上方的元素,并不刪除

3. 隊(duì)列

隊(duì)列(Queue)與棧類似,都是采用線性結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)。它們的區(qū)別在于,棧采用 LIFO 方式,而隊(duì)列采用先進(jìn)先出,即FIFO(First in First Out)。

下圖展示了一個(gè)隊(duì)列,1 是最上面的元素,它會(huì)被第一個(gè)移除:

隊(duì)列的基本操作

  • Enqueue — 在隊(duì)列末尾插入元素
  • Dequeue — 將隊(duì)列第一個(gè)元素刪除
  • isEmpty — 查詢隊(duì)列是否為空
  • Top — 返回隊(duì)列的第一個(gè)元素

4. 鏈表

鏈表(Linked List)也是線性結(jié)構(gòu),它與數(shù)組看起來(lái)非常像,但是它們的內(nèi)存分配方式、內(nèi)部結(jié)構(gòu)和插入刪除操作方式都不一樣。

鏈表是一系列節(jié)點(diǎn)組成的鏈,每一個(gè)節(jié)點(diǎn)保存了數(shù)據(jù)以及指向下一個(gè)節(jié)點(diǎn)的指針。鏈表頭指針指向第一個(gè)節(jié)點(diǎn),如果鏈表為空,則頭指針為空或者為 null。

鏈表可以用來(lái)實(shí)現(xiàn)文件系統(tǒng)、哈希表和鄰接表。

下圖展示了一個(gè)鏈表,它有 3 個(gè)節(jié)點(diǎn):

鏈表分為 2 種:

  • 單向鏈表
  • 雙向鏈表

鏈表的基本操作

  • InsertAtEnd — 在鏈表結(jié)尾插入元素
  • InsertAtHead — 在鏈表開(kāi)頭插入元素
  • Delete — 刪除鏈表的指定元素
  • DeleteAtHead — 刪除鏈表第一個(gè)元素
  • Search — 在鏈表中查詢指定元素
  • isEmpty — 查詢鏈表是否為空

5. 圖

圖(graph)由多個(gè)節(jié)點(diǎn)(vertex)構(gòu)成,節(jié)點(diǎn)之間闊以互相連接組成一個(gè)網(wǎng)絡(luò)。(x, y)表示一條邊(edge),它表示節(jié)點(diǎn) x 與 y 相連。邊可能會(huì)有權(quán)值(weight/cost)。

圖分為兩種:

  • 無(wú)向圖
  • 有向圖

在編程語(yǔ)言中,圖有可能有以下兩種形式表示:

  • 鄰接矩陣(Adjacency Matrix)
  • 鄰接表(Adjacency List)

遍歷圖有兩周算法

  • 廣度優(yōu)先搜索(Breadth First Search)
  • 深度優(yōu)先搜索(Depth First Search)

6. 樹(shù)

樹(shù)(Tree)是一個(gè)分層的數(shù)據(jù)結(jié)構(gòu),由節(jié)點(diǎn)和連接節(jié)點(diǎn)的邊組成。樹(shù)是一種特殊的圖,它與圖最大的區(qū)別是沒(méi)有循環(huán)。

樹(shù)被廣泛應(yīng)用在人工智能和一些復(fù)雜算法中,用來(lái)提供高效的存儲(chǔ)結(jié)構(gòu)。

下圖是一個(gè)簡(jiǎn)單的樹(shù)以及與樹(shù)相關(guān)的術(shù)語(yǔ):

樹(shù)有很多分類:

  • N 叉樹(shù)(N-ary Tree)
  • 平衡樹(shù)(Balanced Tree)
  • 二叉樹(shù)(Binary Tree)
  • 二叉查找樹(shù)(Binary Search Tree)
  • 平衡二叉樹(shù)(AVL Tree)
  • 紅黑樹(shù)(Red Black Tree)
  • 2-3 樹(shù)(2–3 Tree)

其中,二叉樹(shù)和二叉查找樹(shù)是最常用的樹(shù)。

7. 前綴樹(shù)

前綴樹(shù)(Prefix Trees 或者 Trie)與樹(shù)類似,用于處理字符串相關(guān)的問(wèn)題時(shí)非常高效。它可以實(shí)現(xiàn)快速檢索,常用于字典中的單詞查詢,搜索引擎的自動(dòng)補(bǔ)全甚至 IP 路由。

下圖展示了“top”, “thus”和“their”三個(gè)單詞在前綴樹(shù)中如何存儲(chǔ)的:

單詞是按照字母從上往下存儲(chǔ),“p”, “s”和“r”節(jié)點(diǎn)分別表示“top”, “thus”和“their”的單詞結(jié)尾。

8. 哈希表

哈希(Hash)將某個(gè)對(duì)象變換為唯一標(biāo)識(shí)符,該標(biāo)識(shí)符通常用一個(gè)短的隨機(jī)字母和數(shù)字組成的字符串來(lái)代表。哈希可以用來(lái)實(shí)現(xiàn)各種數(shù)據(jù)結(jié)構(gòu),其中最常用的就是哈希表(hash table)。

哈希表通常由數(shù)組實(shí)現(xiàn)。

哈希表的性能取決于 3 個(gè)指標(biāo):

  • 哈希函數(shù)
  • 哈希表的大小
  • 哈希沖突處理方式

下圖展示了有數(shù)組實(shí)現(xiàn)的哈希表,數(shù)組的下標(biāo)即為哈希值,由哈希函數(shù)計(jì)算,作為哈希表的鍵(key),而數(shù)組中保存的數(shù)據(jù)即為值(value):

在線客服 雙翌客服
客服電話
  • 0755-23712116
  • 13822267203