程式碼面試需要知道的8種資料結構(附面試題及答案連結)
譯者按: 搞定面試,不要急著刷題,先弄懂什麼是資料結構!
為了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原作者所有,翻譯僅用於學習。
1976年,一個瑞士電腦科學家寫一本書《Algorithms + Data Structures = Programs》。即:演算法 + 資料結構 = 程式。40多年過去了,這個等式依然成立。
很多程式碼面試題都要求候選者深入理解資料結構,不管你來自大學計算機專業還是程式設計培訓機構,也不管你有多少年程式設計經驗。有時面試題會直接提到資料結構,比如“給我實現一個二叉樹”,然而有時則不那麼明顯,比如“統計一下每個作者寫的書的數量”。
什麼是資料結構?
資料結構是計算機儲存、組織資料的方式。對於特定的資料結構(比如陣列),有些操作效率很高(讀某個陣列元素),有些操作的效率很低(刪除某個陣列元素)。程式設計師的目標是為當前的問題選擇最優的資料結構。
為什麼我們需要資料結構?
資料是程式的核心要素,因此資料結構的價值不言而喻。無論你在寫什麼程式,你都需要與資料打交道,比如員工工資、股票價格、雜貨清單或者電話本。在不同場景下,資料需要以特定的方式儲存,我們有不同的資料結構可以滿足我們的需求。
8種常用資料結構
- 陣列
- 棧
- 佇列
- 連結串列
- 圖
- 樹
- 字首樹
- 雜湊表
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):
常見的雜湊表程式碼面試題
參考
- Fundebug部落格 – Node.js面試題之2017
- Fundebug部落格 – 快速掌握JavaScript面試基礎知識(一)
- Fundebug部落格 – 快速掌握JavaScript面試基礎知識(二)
- Fundebug部落格 – 快速掌握JavaScript面試基礎知識(三)
- GeeksforGeeks
關於Fundebug
Fundebug專注於JavaScript、微信小程式、微信小遊戲、支付寶小程式、React Native、Node.js和Java實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了6億+錯誤事件,得到了Google、360、金山軟體等眾多知名使用者的認可。歡迎免費試用!
版權宣告:
轉載時請註明作者Fundebug以及本文地址:
https://blog.fundebug.com/2018/08/27/code-interview-data-structure/
相關文章
- Web前端經典面試試題及答案(參考連結)Web前端面試
- 24個Jvm面試題總結及答案JVM面試題
- 資料結構和演算法面試題系列—連結串列資料結構演算法面試題
- 經典面試題(一)附答案 演算法+資料結構+程式碼 微軟Microsoft、谷歌Google、百度、騰訊面試題演算法資料結構微軟ROS谷歌Go
- 經典面試題(二)附答案 演算法+資料結構+程式碼 微軟Microsoft、谷歌Google、百度、騰訊面試題演算法資料結構微軟ROS谷歌Go
- 經典面試題(三)附答案 演算法+資料結構+程式碼 微軟Microsoft、谷歌Google、百度、騰訊面試題演算法資料結構微軟ROS谷歌Go
- 經典面試題(四)附答案 演算法+資料結構+程式碼 微軟Microsoft、谷歌Google、百度、騰訊面試題演算法資料結構微軟ROS谷歌Go
- 你不知道的面試題(一)附答案面試題
- Redis面試總結 (附帶答案)Redis面試
- 資料結構面試100題資料結構面試
- 面試題—資料結構之單連結串列詳述(基本篇)面試題資料結構
- 面試分享:專科半年經驗面試阿里前端P6+總結(附面試真題及答案)面試阿里前端
- 資料探勘面試筆試題(附答案)面試筆試
- 大資料某公司面試題-附答案大資料面試題
- 附答案!超全SpringBoot面試題總結Spring Boot面試題
- 碼農面試智力題及答案面試
- 【總結】Python爬蟲面試題及答案(二)Python爬蟲面試題
- 12個iOS技術面試題及答案總結iOS面試題
- 資料結構連結串列各種問題資料結構
- 資料結構面試大全資料結構面試
- iOS常見面試題(block,runtime,runloop,類結構)附參考答案iOS面試題BloCOOP
- 微軟等資料結構+演算法面試100題全部答案集錦微軟資料結構演算法面試
- 【面試】社招中級前端筆試面試題總結-答案及擴充前端筆試面試題
- 準備下次程式設計面試前你應該知道的資料結構程式設計面試資料結構
- 大資料面試常見的面試題總結大資料面試題
- JS面試題及答案JS面試題
- 吐血總結!50道Python面試題集錦(附答案)Python面試題
- 雲端計算面試題及答案,常見的Shell指令碼面試題面試題指令碼
- 前端面試題18----js的資料結構前端面試題JS資料結構
- 資料庫面試題總結資料庫面試題
- 前端面試題(附答案)前端面試題
- Oracle面試題附帶答案Oracle面試題
- 基帶面試題附答案面試題
- 演算法、資料結構 常見面試題演算法資料結構面試題
- Spring面試題總結的很全面,附帶超詳細答案Spring面試題
- 連結串列專題——面試中常見的連結串列問題面試
- struts面試題及答案【重要】面試題
- Oracle面試試題及答案Oracle面試