常見的8中數據結構

 

本文采用意譯,版權歸原做者全部node

1976 年,一個瑞士計算機科學家寫一本書《Algorithms + Data Structures = Programs》。即:算法 + 數據結構 = 程序。40 多年過去了,這個等式依然成立。程序員

不少代碼面試題都要求候選者深刻理解數據結構,無論你來自大學計算機專業仍是編程培訓機構,也無論你有多少年編程經驗。有時面試題會直接提到數據結構,好比「給我實現一個二叉樹」,然而有時則不那麼明顯,好比「統計一下每一個做者寫的書的數量」。面試

什麼是數據結構?

數據結構是計算機存儲、組織數據的方式。對於特定的數據結構(好比數組),有些操做效率很高(讀某個數組元素),有些操做的效率很低(刪除某個數組元素)。程序員的目標是爲當前的問題選擇最優的數據結構。算法

爲何咱們須要數據結構?

數據是程序的核心要素,所以數據結構的價值不言而喻。不管你在寫什麼程序,你都須要與數據打交道,好比員工工資、股票價格、雜貨清單或者電話本。在不一樣場景下,數據須要以特定的方式存儲,咱們有不一樣的數據結構能夠知足咱們的需求。express

8 種經常使用數據結構

  1. 數組
  2. 隊列
  3. 鏈表
  4. 前綴樹
  5. 哈希表

1. 數組

數組(Array)大概是最簡單,也是最經常使用的數據結構了。其餘數據結構,好比棧和隊列都是由數組衍生出來的。編程

下圖展現了 1 個數組,它有 4 個元素:數組

每個數組元素的位置由數字編號,稱爲下標或者索引(index)。大多數編程語言的數組第一個元素的下標是 0。網絡

根據維度區分,有 2 種不一樣的數組:數據結構

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

數組的基本操做

  • Insert - 在某個索引處插入元素
  • Get - 讀取某個索引處的元素
  • Delete - 刪除某個索引處的元素
  • Size - 獲取數組的長度

常見數組代碼面試題

2. 棧

撤回,即 Ctrl+Z,是咱們最多見的操做之一,大多數應用都會支持這個功能。你知道它是怎麼實現的嗎?答案是這樣的:把以前的應用狀態(限制個數)保存到內存中,最近的狀態放到第一個。這時,咱們須要棧(stack)來實現這個功能。編程語言

棧中的元素採用 LIFO (Last In First Out),即後進先出。

下圖的棧有 3 個元素,3 在最上面,所以它會被第一個移除:

棧的基本操做

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

常見的棧代碼面試題

3. 隊列

隊列(Queue)與棧相似,都是採用線性結構存儲數據。它們的區別在於,棧採用 LIFO 方式,而隊列採用先進先出,即FIFO(First in First Out)。

下圖展現了一個隊列,1 是最上面的元素,它會被第一個移除:

隊列的基本操做

  • Enqueue —  在隊列末尾插入元素
  • Dequeue —  將隊列第一個元素刪除
  • isEmpty —  查詢隊列是否爲空
  • Top —  返回隊列的第一個元素

常見的隊列代碼面試題

4. 鏈表

鏈表(Linked List)也是線性結構,它與數組看起來很是像,可是它們的內存分配方式、內部結構和插入刪除操做方式都不同。

鏈表是一系列節點組成的鏈,每個節點保存了數據以及指向下一個節點的指針。鏈表頭指針指向第一個節點,若是鏈表爲空,則頭指針爲空或者爲 null。

鏈表能夠用來實現文件系統、哈希表和鄰接表。

下圖展現了一個鏈表,它有 3 個節點:

鏈表分爲 2 種:

  • 單向鏈表
  • 雙向鏈表

鏈表的基本操做

  • InsertAtEnd —  在鏈表結尾插入元素
  • InsertAtHead —  在鏈表開頭插入元素
  • Delete —  刪除鏈表的指定元素
  • DeleteAtHead —  刪除鏈表第一個元素
  • Search —  在鏈表中查詢指定元素
  • isEmpty —  查詢鏈表是否爲空

常見的隊列代碼面試題

5. 圖

圖(graph)由多個節點(vertex)構成,節點之間闊以互相鏈接組成一個網絡。(x, y)表示一條邊(edge),它表示節點 x 與 y 相連。邊可能會有權值(weight/cost)。

圖分爲兩種:

  • 無向圖
  • 有向圖

在編程語言中,圖有可能有如下兩種形式表示:

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

遍歷圖有兩週算法

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

常見的圖代碼面試題

6. 樹

樹(Tree)是一個分層的數據結構,由節點和鏈接節點的邊組成。樹是一種特殊的圖,它與圖最大的區別是沒有循環。

樹被普遍應用在人工智能和一些複雜算法中,用來提供高效的存儲結構。

下圖是一個簡單的樹以及與樹相關的術語:

樹有不少分類:

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

其中,二叉樹和二叉查找樹是最經常使用的樹。

常見的樹代碼面試題

7. 前綴樹

前綴樹(Prefix Trees 或者 Trie)與樹相似,用於處理字符串相關的問題時很是高效。它能夠實現快速檢索,經常使用於字典中的單詞查詢,搜索引擎的自動補全甚至 IP 路由。

下圖展現了「top」, 「thus」和「their」三個單詞在前綴樹中如何存儲的:

單詞是按照字母從上往下存儲,「p」, 「s」和「r」節點分別表示「top」, 「thus」和「their」的單詞結尾。

常見的樹代碼面試題

8. 哈希表

哈希(Hash)將某個對象變換爲惟一標識符,該標識符一般用一個短的隨機字母和數字組成的字符串來表明。哈希能夠用來實現各類數據結構,其中最經常使用的就是哈希表(hash table)。

哈希表一般由數組實現。

哈希表的性能取決於 3 個指標:

  • 哈希函數
  • 哈希表的大小
  • 哈希衝突處理方式

下圖展現了有數組實現的哈希表,數組的下標即爲哈希值,由哈希函數計算,做爲哈希表的鍵(key),而數組中保存的數據即爲值(value):

常見的哈希表代碼面試題

相關文章
相關標籤/搜索