簡單地說,數據結構是以某種特定的佈局方式存儲數據的容器。這種「佈局方式」決定了數據結構對於某些操做是高效的,而對於其餘操做則是低效的。首先咱們須要理解各類數據結構,才能在處理實際問題時選取最合適的數據結構。程序員
數組是最簡單、也是使用最普遍的數據結構。棧、隊列等其餘數據結構均由數組演變而來。每一個數據元素都關聯一個正數值,咱們稱之爲索引,它代表數組中每一個元素所在的位置。大部分語言將初始索引定義爲零。面試
相似羽毛球筒算法
著名的撤銷操做幾乎遍及任意一個應用。但你有沒有思考過它是如何工做的呢?這個問題的解決思路是按照將最後的狀態排列在先的順序,在內存中存儲歷史工做狀態(固然,它會受限於必定的數量)。這沒辦法用數組實現。但有了棧,這就變得很是方便了。
能夠把棧想象成一列垂直堆放的書。爲了拿到中間的書,你須要移除放置在這上面的全部書。這就是LIFO(後進先出)的工做原理。
下圖是包含三個數據元素(1,2和3)的棧,其中頂部的3將被最早移除:
編程
相似水管數組
與棧類似,隊列是另外一種順序存儲元素的線性數據結構。棧與隊列的最大差異在於棧是LIFO(後進先出),而隊列是FIFO,即先進先出。
一個完美的隊列現實例子:售票亭排隊隊伍。若是有新人加入,他須要到隊尾去排隊,而非隊首——排在前面的人會先拿到票,而後離開隊伍。
網絡
鏈表是另外一個重要的線性數據結構,乍一看可能有點像數組,但在內存分配、內部結構以及數據插入和刪除的基本操做方面均有所不一樣。鏈表就像一個節點鏈,其中每一個節點包含着數據和指向後續節點的指針。 鏈表還包含一個頭指針,它指向鏈表的第一個元素,但當列表爲空時,它指向null或無具體內容。鏈表通常用於實現文件系統、哈希表和鄰接表。
這是鏈表內部結構的展現:
數據結構
isEmpty - 若是鏈表爲空,則返回true函數
刪除鏈表中的重複項佈局
樹形結構是一種層級式的數據結構,由頂點(節點)和鏈接它們的邊組成。 樹相似於圖,但區分樹和圖的重要特徵是樹中不存在環路。樹形結構被普遍應用於人工智能和複雜算法,它能夠提供解決問題的有效存儲機制。
這是一個簡單樹的示意圖,以及樹數據結構中使用的基本術語:
性能
Root - 根節點
Parent - 父節點
Child - 子節點
Leaf - 葉子節點
Sibling - 兄弟節點
2-3樹
其中,二叉樹和二叉搜索樹是最經常使用的樹。
圖是一組以網絡形式相互鏈接的節點。節點也稱爲頂點。 一對節點(x,y)稱爲邊(edge),表示頂點x鏈接到頂點y。邊能夠包含權重/成本,顯示從頂點x到y所需的成本。
這是一種高效的樹形結構,但值得單獨說明
字典樹,也稱爲「前綴樹」,是一種特殊的樹狀數據結構,對於解決字符串相關問題很是有效。它可以提供快速檢索,主要用於搜索字典中的單詞,在搜索引擎中自動提供建議,甚至被用於IP的路由。
如下是在字典樹中存儲三個單詞「top」,「so」和「their」的例子:
這些單詞以頂部到底部的方式存儲,其中綠色節點「p」,「s」和「r」分別表示「top」,「thus」和「theirs」的底部。
哈希法(Hashing)是一個用於惟一標識對象並將每一個對象存儲在一些預先計算的惟一索引(稱爲「鍵(key)」)中的過程。所以,對象以鍵值對的形式存儲,這些鍵值對的集合被稱爲「字典」。可使用鍵搜索每一個對象。基於哈希法有不少不一樣的數據結構,但最經常使用的數據結構是哈希表。
哈希表一般使用數組實現,散列數據結構的性能取決於如下三個因素
下圖爲如何在數組中映射哈希鍵值對的說明。該數組的索引是經過哈希函數計算的。
以上內容也只是大概說明了一下數據結構是什麼,有什麼,對於面試中問的問題,經過上面的介紹依然可能給不出答案。因此咱們須要站在巨人的肩膀上去摸索,而不是本身所有重頭來過。要想回答的以上面試的問題,還須要進行更多的擴展介紹,未完待續。
參考文章:大數據文摘出品《應對程序員面試,你必須知道的八大數據結構》