編程面試之前你應該知曉的八大數據結構


https://baijiahao.baidu.com/s?id=1609200503642486098&wfr=spider&for=pc

https://www.cnblogs.com/wanghuaijun/p/7302303.html

 

什么是數據結構?

簡單地說,數據結構是以某種特定的布局方式存儲數據的容器。這種“布局方式”決定了數據結構對於某些操作是高效的,而對於其他操作則是低效的。首先我們需要理解各種數據結構,才能在處理實際問題時選取最合適的數據結構。

數據結構就是研究數據的邏輯結構和物理結構以及它們之間相互關系,並對這種結構定義相應的運算,而且確保經過這些運算后所得到的新結構仍然是原來的結構類型。

 

為什么我們需要數據結構?

數據是計算機科學當中最關鍵的實體,而數據結構則可以將數據以某種組織形式存儲,因此,數據結構的價值不言而喻。

無論你以何種方式解決何種問題,你都需要處理數據——無論是涉及員工薪水、股票價格、購物清單,還是只是簡單的電話簿問題。

數據需要根據不同的場景,按照特定的格式進行存儲。有很多數據結構能夠滿足以不同格式存儲數據的需求。

 

常見的數據結構

首先列出一些最常見的數據結構,我們將逐一說明:

 

 

 

 ============================八大數據結構簡單描述=======================================================================================

1. 數組

最基本的也是使用最廣的數據結構

 

數組的基本操作
Insert——在指定索引位置插入一個元素
Get——返回指定索引位置的元素
Delete——刪除指定索引位置的元素
Size——得到數組所有元素的數量


面試中關於數組的常見問題
尋找數組中第二小的元素
找到數組中第一個不重復出現的整數
合並兩個有序數組
重新排列數組中的正值和負值

 

 

2. 

著名的撤銷操作幾乎遍布任意一個應用。但你有沒有思考過它是如何工作的呢?這個問題的解決思路是按照將最后的狀態排列在先的順序,在內存中存儲歷史工作狀態(當然,它會受限於一定的數量)。這沒辦法用數組實現。但有了棧,這就變得非常方便了。

可以把棧想象成一列垂直堆放的書。為了拿到中間的書,你需要移除放置在這上面的所有書。這就是LIFO(后進先出)的工作原理。

下圖是包含三個數據元素(1,2和3)的棧,其中頂部的3將被最先移除: 

 

棧的基本操作
Push——在頂部插入一個元素
Pop——返回並移除棧頂元素
isEmpty——如果棧為空,則返回true
Top——返回頂部元素,但並不移除它


面試中關於棧的常見問題
使用棧計算后綴表達式
對棧的元素進行排序
判斷表達式是否括號平衡

 
3. 隊列

與棧相似,隊列是另一種順序存儲元素的線性數據結構。棧與隊列的最大差別在於棧是LIFO(后進先出),而隊列是FIFO,即先進先出。

一個完美的隊列現實例子:售票亭排隊隊伍。如果有新人加入,他需要到隊尾去排隊,而非隊首——排在前面的人會先拿到票,然后離開隊伍。

下圖是包含四個元素(1,2,3和4)的隊列,其中在頂部的1將被最先移除:

移除先入隊的元素、插入新元素

隊列的基本操作

Enqueue()——在隊列尾部插入元素

Dequeue()——移除隊列頭部的元素

isEmpty()——如果隊列為空,則返回true

Top()——返回隊列的第一個元素

 

面試中關於隊列的常見問題

使用隊列表示棧對隊列的前k個元素倒序使用隊列生成從1到n的二進制數

 

4.鏈表

鏈表是另一個重要的線性數據結構,乍一看可能有點像數組,但在內存分配、內部結構以及數據插入和刪除的基本操作方面均有所不同。

鏈表就像一個節點鏈,其中每個節點包含着數據和指向后續節點的指針。 鏈表還包含一個頭指針,它指向鏈表的第一個元素,但當列表為空時,它指向null或無具體內容。

鏈表一般用於實現文件系統、哈希表和鄰接表。

 

這是鏈表內部結構的展示:

 

鏈表包括以下類型:

單鏈表(單向)

雙向鏈表(雙向)

 

鏈表的基本操作:

InsertAtEnd - 在鏈表的末尾插入指定元素

InsertAtHead - 在鏈接列表的開頭/頭部插入指定元素

Delete - 從鏈接列表中刪除指定元素

DeleteAtHead - 刪除鏈接列表的第一個元素

Search - 從鏈表中返回指定元素

isEmpty - 如果鏈表為空,則返回true

 

面試中關於鏈表的常見問題

反轉鏈表檢測鏈表中的循環返回鏈表倒數第N個節點刪除鏈表中的重復項

 

5. 圖

圖是一組以網絡形式相互連接的節點。節點也稱為頂點。 一對節點(x,y)稱為邊(edge),表示頂點x連接到頂點y。邊可以包含權重/成本,顯示從頂點x到y所需的成本。

 

 

圖的類型

無向圖

有向圖

 

在程序語言中,圖可以用兩種形式表示:

鄰接矩陣鄰接表

 

常見圖遍歷算法

廣度優先搜索深度優先搜索

 

面試中關於圖的常見問題

實現廣度和深度優先搜索檢查圖是否為樹計算圖的邊數找到兩個頂點之間的最短路徑

 

6.樹

樹形結構是一種層級式的數據結構,由頂點(節點)和連接它們的邊組成。 樹類似於圖,但區分樹和圖的重要特征是樹中不存在環路。

樹形結構被廣泛應用於人工智能和復雜算法,它可以提供解決問題的有效存儲機制。

 

這是一個簡單樹的示意圖,以及樹數據結構中使用的基本術語:

Root - 根節點

Parent - 父節點

Child - 子節點

Leaf - 葉子節點

Sibling - 兄弟節點

 

以下是樹形結構的主要類型:

N元樹

平衡樹二叉樹

二叉搜索樹

AVL樹

紅黑樹

2-3樹

 

其中,二叉樹和二叉搜索樹是最常用的樹。

 

面試中關於樹結構的常見問題:

求二叉樹的高度在二叉搜索樹中查找第k個最大值查找與根節點距離k的節點在二叉樹中查找給定節點的祖先節點

 

7. 字典樹(Trie)

字典樹,也稱為“前綴樹”,是一種特殊的樹狀數據結構,對於解決字符串相關問題非常有效。它能夠提供快速檢索,主要用於搜索字典中的單詞,在搜索引擎中自動提供建議,甚至被用於IP的路由。

以下是在字典樹中存儲三個單詞“top”,“so”和“their”的例子:

 

這些單詞以頂部到底部的方式存儲,其中綠色節點“p”,“s”和“r”分別表示“top”,“thus”和“theirs”的底部。

 

面試中關於字典樹的常見問題

計算字典樹中的總單詞數打印存儲在字典樹中的所有單詞使用字典樹對數組的元素進行排序使用字典樹從字典中形成單詞構建T9字典(字典樹+ DFS )

 

8. 哈希表

哈希法(Hashing)是一個用於唯一標識對象並將每個對象存儲在一些預先計算的唯一索引(稱為“鍵(key)”)中的過程。因此,對象以鍵值對的形式存儲,這些鍵值對的集合被稱為“字典”。可以使用鍵搜索每個對象。基於哈希法有很多不同的數據結構,但最常用的數據結構是哈希表。

 

哈希表通常使用數組實現。

 

散列數據結構的性能取決於以下三個因素:

哈希函數哈希表的大小碰撞處理方法

 

下圖為如何在數組中映射哈希鍵值對的說明。該數組的索引是通過哈希函數計算的。

 

 

面試中關於哈希結構的常見問題:

在數組中查找對稱鍵值對追蹤遍歷的完整路徑查找數組是否是另一個數組的子集檢查給定的數組是否不相交

 

以上是在編程面試之前你應該知曉的八大數據結構。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM