週五, 十一月 16, 2018

Latest News

Blog & Social Extension

 

瑞士計算機科學家 Niklaus Wirth 在 1976 年寫了一本書,名為《算法+數據結構=編程》。

40 多年後,這個等式仍被奉為真理。這就是為什麼在面試過程中,需要考察軟體工程師對數據結構的理解。

幾乎所有的問題都需要面試者對數據結構有深刻的理解。無論你是初入職場的新兵(剛從大學或者軟體培訓班畢業),還是擁有幾十年經驗的職場老鳥。

有些面試題會明確提及某種數據結構,例如,「給定一個二叉樹。」而另一些則隱含在面試題中,例如,「我們希望記錄每個作者相關的書籍數量。」

即便是對於一些非常基礎的工作來說,學習數據結構也是必須的。那麼,就讓我們先從一些基本概念開始入手。

什麼是數據結構?

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

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

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

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

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

常見的數據結構

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

  • 數組
  • 隊列
  • 鏈表
  • 字典樹(這是一種高效的樹形結構,但值得單獨說明)
  • 散列表(哈希表)

數組

數組是最簡單、也是使用最廣泛的數據結構。棧、隊列等其他數據結構均由數組演變而來。下圖是一個包含元素(1,2,3 和 4)的簡單數組,數組長度為 4。

1. 台灣電商進軍東南亞,這目前應該是屬於政府新南向五大旗艦計畫中的創新產業交流領域,您是新南向工作小組召集人,您如何看待台灣電商進軍東南亞的發展機會和前瞻性?

2. 目前政府的新南向政策主軸是以軟實力作為趨動箭頭,例如農業、醫療技術的交流合作,但在台灣企業進軍東南亞上政府的政策還稍嫌疲弱,政府能如何協助台灣企業進入東南亞設廠、打開市場破口?

3. 過去台灣慣於將東南亞視為一個整體,但它實際上其實是一個有 3、4 種語言流通的複雜市場,您認為台灣企業和東南亞原生的跨國企業合作,對於台企在東南亞的擴張和發展是有幫助的嗎?會有什麼樣的幫助?

棧的基本操作

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

面試中關於棧的常見問題

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

隊列

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

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

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

隊列的基本操作

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

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

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

鏈表

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

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

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

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

鏈表包括以下類型:

  • 單鏈表(單向)
  • 雙向鏈表(雙向)

鏈表的基本操作:

  • InsertAtEnd – 在鏈表的末尾插入指定元素
  • InsertAtHead – 在鏈接列表的開頭/頭部插入指定元素
  • Delete  – 從鏈接列表中刪除指定元素
  • DeleteAtHead – 刪除鏈接列表的第一個元素
  • Search  – 從鏈表中返回指定元素
  • isEmpty – 如果鏈表為空,則返回 true

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

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

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

Root – 根節點

Parent – 父節點

Child – 子節點

Leaf – 葉子節點

Sibling – 兄弟節點

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

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

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

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

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

字典樹(Trie)

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

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

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

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

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

哈希表

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

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

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

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

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

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

在數組中查找對稱鍵值對

追蹤遍歷的完整路徑

查找數組是否是另一個數組的子集

檢查給定的數組是否不相交

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

本文摘自:【我們為什麼挑選這篇文章】通過嚴格的履歷面試之後,下一關往往就是軟體工程師的實戰演練,這塊真的就只能靠經驗,但我們整理介紹了面試必備的八大數據結構,祝大家都能找到好工作。(科技報橘責任編輯:林子鈞)

相關報導 

SHARE