數據結構,你還記得嗎(上)

1976年,瑞士計算機科學家Niklaus Wirth寫了一本書,名爲《算法+數據結構=編程》。40多年後,它仍然是True。因此做爲軟件工程師(碼農),你不知道數據結構,就須要喝下這碗十全大補湯了。

什麼是數據結構?

  簡單地說,數據結構是以某種特定的佈局方式存儲數據的容器。這種「佈局方式」決定了數據結構對於某些操做是高效的,而對於其餘操做則是低效的。首先咱們須要理解各類數據結構,才能在處理實際問題時選取最合適的數據結構。程序員

  • 數據結構是指相互之間存在着一種或多種關係的數據元素的集合和該集合中數據元素之間的關係組成。
    • 記爲:Data_Structure=(D,R),其中D是數據元素的集合,R是該集合中全部元素之間的關係的有限集合。
  • 數據結構是一種處理數據的思想;
  • 數據結構是一種處理數據的模型;

爲何咱們須要數據結構?

  • 數據是計算機科學當中最關鍵的實體,而數據結構則能夠將數據以某種組織形式存儲,所以,數據結構的價值不言而喻。
  • 不管你以何種方式解決何種問題,你都須要處理數據——不管是涉及員工薪水、股票價格、購物清單,仍是隻是簡單的電話簿問題。
  • 數據須要根據不一樣的場景,按照特定的格式進行存儲。有不少數據結構可以知足以不一樣格式存儲數據的需求。

常見的數據結構


數組

  數組是最簡單、也是使用最普遍的數據結構。棧、隊列等其餘數據結構均由數組演變而來。每一個數據元素都關聯一個正數值,咱們稱之爲索引,它代表數組中每一個元素所在的位置。大部分語言將初始索引定義爲零。面試

數組的兩種類型:

  • 一維數組
  • 多維數組(數組的數組)

數組的基本操做

  • Insert——在指定索引位置插入一個元素
  • Get——返回指定索引位置的元素
  • Delete——刪除指定索引位置的元素
  • Size——獲得數組全部元素的數量

面試中關於數組的常見問題

  • 尋找數組中第二小的元素
  • 找到數組中第一個不重複出現的整數
  • 合併兩個有序數組
  • 從新排列數組中的正值和負值

相似羽毛球筒算法

  著名的撤銷操做幾乎遍及任意一個應用。但你有沒有思考過它是如何工做的呢?這個問題的解決思路是按照將最後的狀態排列在先的順序,在內存中存儲歷史工做狀態(固然,它會受限於必定的數量)。這沒辦法用數組實現。但有了棧,這就變得很是方便了。
  能夠把棧想象成一列垂直堆放的書。爲了拿到中間的書,你須要移除放置在這上面的全部書。這就是LIFO(後進先出)的工做原理。
下圖是包含三個數據元素(1,2和3)的棧,其中頂部的3將被最早移除:
編程

棧的基本操做

  • Push——在頂部插入一個元素
  • Pop——返回並移除棧頂元素
  • isEmpty——若是棧爲空,則返回true
  • Top——返回頂部元素,但並不移除它

面試中關於棧的常見問題

  • 使用棧計算後綴表達式
  • 對棧的元素進行排序
  • 判斷表達式是否括號平衡

隊列

相似水管數組

  與棧類似,隊列是另外一種順序存儲元素的線性數據結構。棧與隊列的最大差異在於棧是LIFO(後進先出),而隊列是FIFO,即先進先出。
  一個完美的隊列現實例子:售票亭排隊隊伍。若是有新人加入,他須要到隊尾去排隊,而非隊首——排在前面的人會先拿到票,而後離開隊伍。
網絡

隊列的基本操做

  • Enqueue()——在隊列尾部插入元素
  • Dequeue()——移除隊列頭部的元素
  • isEmpty()——若是隊列爲空,則返回true
  • Top()——返回隊列的第一個元素

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

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

鏈表

  鏈表是另外一個重要的線性數據結構,乍一看可能有點像數組,但在內存分配、內部結構以及數據插入和刪除的基本操做方面均有所不一樣。鏈表就像一個節點鏈,其中每一個節點包含着數據和指向後續節點的指針。 鏈表還包含一個頭指針,它指向鏈表的第一個元素,但當列表爲空時,它指向null或無具體內容。鏈表通常用於實現文件系統、哈希表和鄰接表。
這是鏈表內部結構的展現:
數據結構

鏈表類型

  • 單鏈表(單向)
  • 雙向鏈表(雙向)
  • 鏈表的基本操做:InsertAtEnd - 在鏈表的末尾插入指定元素
  • InsertAtHead - 在連接列表的開頭/頭部插入指定元素
  • Delete - 從連接列表中刪除指定元素
  • DeleteAtHead - 刪除連接列表的第一個元素
  • Search - 從鏈表中返回指定元素
  • isEmpty - 若是鏈表爲空,則返回true函數

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

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


  樹形結構是一種層級式的數據結構,由頂點(節點)和鏈接它們的邊組成。 樹相似於圖,但區分樹和圖的重要特徵是樹中不存在環路。樹形結構被普遍應用於人工智能和複雜算法,它能夠提供解決問題的有效存儲機制。
這是一個簡單樹的示意圖,以及樹數據結構中使用的基本術語:
性能

Root - 根節點
Parent - 父節點
Child - 子節點
Leaf - 葉子節點
Sibling - 兄弟節點

樹形結構的主要類型

  • N元樹
  • 平衡樹
  • 二叉樹
  • 二叉搜索樹
  • AVL樹
  • 紅黑樹
  • 2-3樹

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

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

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

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

圖的類型

  • 無向圖
  • 有向圖
  • 在程序語言中,圖能夠用兩種形式表示:鄰接矩陣
  • 鄰接表
  • 常見圖遍歷算法廣度優先搜索
  • 深度優先搜索

面試中關於圖的常見問題

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

字典樹

這是一種高效的樹形結構,但值得單獨說明

  字典樹,也稱爲「前綴樹」,是一種特殊的樹狀數據結構,對於解決字符串相關問題很是有效。它可以提供快速檢索,主要用於搜索字典中的單詞,在搜索引擎中自動提供建議,甚至被用於IP的路由。
如下是在字典樹中存儲三個單詞「top」,「so」和「their」的例子:

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

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

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

散列表(哈希表)

  哈希法(Hashing)是一個用於惟一標識對象並將每一個對象存儲在一些預先計算的惟一索引(稱爲「鍵(key)」)中的過程。所以,對象以鍵值對的形式存儲,這些鍵值對的集合被稱爲「字典」。可使用鍵搜索每一個對象。基於哈希法有不少不一樣的數據結構,但最經常使用的數據結構是哈希表。
哈希表一般使用數組實現,散列數據結構的性能取決於如下三個因素

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

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

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

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

總結

以上內容也只是大概說明了一下數據結構是什麼,有什麼,對於面試中問的問題,經過上面的介紹依然可能給不出答案。因此咱們須要站在巨人的肩膀上去摸索,而不是本身所有重頭來過。要想回答的以上面試的問題,還須要進行更多的擴展介紹,未完待續。

參考文章:大數據文摘出品《應對程序員面試,你必須知道的八大數據結構》

相關文章
相關標籤/搜索