什麼是數據結構?
簡單說,數據結構就是一個容器,以某種特定的布局存儲數據。這個「布局」使得數據結構在某些操作上非常高效,在另一些操作上則不那麼高效。你的目標就是理解數據結構,這樣就能為手頭的問題選擇最優的數據結構。
為什麼我們需要數據結構?
由於數據結構用來以有組織的形式存儲數據,而且數據是計算機科學中最重要的實體,因此數據結構的真正價值顯而易見。
無論你解決什麼問題,你都必須以這種或那種方式處理數據——員工的工資,股票價格,購物清單,甚至簡單的電話簿等等。
根據不同的場景,數據需要以特定格式存儲。目前有一些數據結構可以滿足我們以不同格式存儲數據的需求。
常用的數據結構
我們首先列出最常用的數據結構,然後再按個講解:
數組
數組是一種最簡單和最廣泛使用的數據結構,其它數據結構比如堆棧和隊列都源自數組。
下圖是一個大小為 4 的簡單數組,包含幾個元素(1,2,3 和 4)。
每個數據元素會被分配一個正的數值,叫作「索引」,它對應該元素在數組中的位置。大部分程式語言都將初始索引定義為 0.
以下是兩種數組:
數組的基本操作:
常問的數組面試問題:
堆棧
我們都熟悉很有名的撤銷(Undo)選項,它幾乎存在每個應用程式中。有沒有想過它是如何工作的?其思路就是,按照最後的狀態排列在先的順序將工作的先前狀態(限於特定數字)存儲在內存中。這只用數組是無法實現的,因此堆棧就有了用武之地。
可以把堆棧看作一堆垂直排列的書籍。為了獲得位於中間位置的書,你需要拿掉放在它上面的所有書籍。這就是 LIFO(後進先出)方法的工作原理。
這是一個包含三個數據元素(1,2 和 3)的堆棧圖像,其中3位於頂部,首先把它刪除:
堆棧的基本操作:
常見的堆棧面試問題:
隊列
與堆棧類似,隊列是另一種線性數據結構,以順序方式存儲元素。堆棧和隊列之間唯一的顯著區別是,隊列不是使用 LIFO 方法,而是應用 FIFO 方法,這是 First in First Out(先入先出)的縮寫。
隊列的完美現實例子:一列人在售票亭等候。如果有新人來,他們是從末尾加入隊列,而不是在開頭——站在前面的人將先買到票然後離開隊列。
下圖是一個包含四個數據元素(1,2,3 和 4)的隊列,其中 1 位於頂部,首先把它刪除:
隊列的基本操作:
常問的隊列面試問題:
鍊表
鍊表是另一個重要的線性數據結構,剛一看可能看起來像數組,但在內存分配,內部結構以及如何執行插入和刪除的基本操作方面有所不同。
鍊表就像一個節點鏈,其中每個節點包含數據和指向鏈中後續節點的指針等信息。有一個頭指針,指向鍊表的第一個元素,如果列表是空的,那麼它只指向 null 或不指向任何內容。
鍊表用於實現文件系統,哈希表和鄰接表。
下圖是鍊表內部結構的直觀展示:
下面是幾種類型的鍊表:
鍊表的基本操作:
常問的鍊表面試問題:
圖
圖就是一組節點,以網絡的形式互相連接。節點也被稱為頂點(vertices)。一對(x,y)就叫做一個邊,表示頂點 x 和頂點 y 相連。一個邊可能包含權重/成本,顯示從頂點 x 到 y 所需的成本。
圖的類型:
在程式語言中,圖可以表示為兩種形式:
常見的圖遍歷算法:
常問的圖面試問題:
樹
樹是一種層級數據結構,包含了連接它們的頂點(節點)和邊。樹和圖很相似,但二者有個很大的不同點,即樹中沒有循環。
樹廣泛應用在人工智慧和複雜的算法中,為解決各種問題提供高效的存儲機制。
下圖是一個簡單的樹,以及在樹型數據結構中所用的基本術語:
下面是幾種類型的樹:
其中,二叉樹和二叉搜索樹是最常用的樹。
常問的樹面試問題:
字典樹
字典樹,也叫「前綴樹」,是一種樹形結構,在解決字符串相關問題中非常高效。其提供非常快速的檢索功能,常用於搜索字典中的單詞,為搜尋引擎提供自動搜索建議,甚至能用於IP路由選擇。
下面展示了「top」「thus」和「their」這三個詞是如何存儲在字典樹中的:
這些單詞以從上到下的方式存儲,其中綠色節點「p」,「s」和「r」分別表示「top」,「thus」和「their」的末尾。
常見的字典樹面試問題:
哈希表
散列是一個用於唯一標識對象並在一些預先計算的唯一索引(稱為「密鑰」)存儲每個對象的過程。因此,對象以「鍵值」對的形式存儲,這些項的集合被稱為「字典」。可以使用該鍵值搜索每個對象。有多種不同的基於哈希的數據結構,但最常用的數據結構是哈希表。
哈希表通常使用數組實現。
哈希數據結構的性能取決於以下三個因素:
下圖展示了如何在數組中映射哈希。該數組的索引是通過哈希函數計算的。
常問的哈希面試問題:
我整理好了一份面試題PDF文檔,將所有的面試題和答案匯總在一起了~
面試文件獲取方式:
轉發+關注+私信我「面試」獲取完整的文檔資料和PDF資料哦~
再說一篇:轉發+關注+私信我「面試」獲取完整的文檔資料和PDF資料哦~