資料結構,你還記得嗎(上)

2022-01-11 01:18:27 字數 2701 閱讀 3680

2023年,瑞士計算機科學家niklaus wirth寫了一本書,名為《演算法+資料結構=程式設計》。40多年後,它仍然是true。所以作為軟體工程師(碼農),你不知道資料結構,就需要喝下這碗十全大補湯了。

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

資料結構是一種處理資料的思想;

資料結構是一種處理資料的模型;

陣列是最簡單、也是使用最廣泛的資料結構。棧、佇列等其他資料結構均由陣列演變而來。每個資料元素都關聯乙個正數值,我們稱之為索引,它表明陣列中每個元素所在的位置。大部分語言將初始索引定義為零。

陣列的兩種型別:

陣列的基本操作

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

類似羽毛球筒

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

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

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

棧的基本操作

面試中關於棧的常見問題

類似水管

與棧相似,佇列是另一種順序儲存元素的線性資料結構。棧與佇列的最大差別在於棧是lifo(後進先出),而佇列是fifo,即先進先出。

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

佇列的基本操作

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

鍊錶是另乙個重要的線性資料結構,乍一看可能有點像陣列,但在記憶體分配、內部結構以及資料插入和刪除的基本操作方面均有所不同。鍊錶就像乙個節點鏈,其中每個節點包含著資料和指向後續節點的指標。 鍊錶還包含乙個頭指標,它指向鍊錶的第乙個元素,但當列表為空時,它指向null或無具體內容。鍊錶一般用於實現檔案系統、雜湊表和鄰接表。

這是鍊錶內部結構的展示:

鍊錶型別

面試中關於鍊錶的常見問題

樹形結構是一種層級式的資料結構,由頂點(節點)和連線它們的邊組成。 樹類似於圖,但區分樹和圖的重要特徵是樹中不存在環路。樹形結構被廣泛應用於人工智慧和複雜演算法,它可以提供解決問題的有效儲存機制。

這是乙個簡單樹的示意圖,以及樹資料結構中使用的基本術語:

root - 根節點

parent - 父節點

child - 子節點

leaf - 葉子節點

sibling - 兄弟節點

樹形結構的主要型別
其中,二叉樹和二叉搜尋樹是最常用的樹。

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

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

圖的型別

面試中關於圖的常見問題

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

字典樹,也稱為「字首樹」,是一種特殊的樹狀資料結構,對於解決字串相關問題非常有效。它能夠提供快速檢索,主要用於搜尋字典中的單詞,在搜尋引擎中自動提供建議,甚至被用於ip的路由。

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

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

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

雜湊法(hashing)是乙個用於唯一標識物件並將每個物件儲存在一些預先計算的唯一索引(稱為「鍵(key)」)中的過程。因此,物件以鍵值對的形式儲存,這些鍵值對的集合被稱為「字典」。可以使用鍵搜尋每個物件。基於雜湊法有很多不同的資料結構,但最常用的資料結構是雜湊表。

雜湊表通常使用陣列實現,雜湊資料結構的效能取決於以下三個因素

下圖為如何在陣列中對映雜湊鍵值對的說明。該陣列的索引是通過雜湊函式計算的。

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

以上內容也只是大概說明了一下資料結構是什麼,有什麼,對於面試中問的問題,通過上面的介紹依然可能給不出答案。所以我們需要站在巨人的肩膀上去摸索,而不是自己全部重頭來過。要想回答的以上面試的問題,還需要進行更多的擴充套件介紹,未完待續。

參考文章:大資料文摘出品《應對程式設計師面試,你必須知道的八大資料結構》

敏捷宣言,你還記得嗎

敏捷!敏捷?在實際的軟體開發過程中,很多團隊都用了敏捷方式 然而是否做好敏捷了呢?值得反思。敏捷宣言的這些經典信條,值得我們常常反思 我們一直在實踐中探尋更好的軟體開發方法,身體力行的同時也幫助他人。由此我們建立了如下價值觀 個體和互動 高於 流程和工具 工作的軟體 高於 詳盡的文件 客戶合作 高於...

明天就要面試,你還記得這些知識嗎?

我學習c 的tips 1 1.配置異常 debug exceptions 每個異常都可以配置。2.健壯程式的處理 1 throw 對應的異常,不能夠慎用catch exception e 這種捕獲方法.2 異常轉義丟擲,給使用者以合理的提示,不要丟擲假異常.3 給出斷言trace.assert 便於...

零基礎學Python 字典,你還記得嗎?

字典,這個東西你現在還用嗎?隨著網路的發展,用的人越來越少了。不少人習慣於在網上搜尋,不僅有web版,乃至於已經有手機版的各種字典了。我曾經用過一本小小的 新華字典 新華字典 是中國第一部現代漢語字典。最早的名字叫 伍記小字典 但未能編纂完成。自1953年,開始重編,其凡例完全採用 伍記小字典 從1...