演算法+資料結構=程式設計
陣列是最簡單、也是使用最廣泛的資料結構。棧、佇列等其他資料結構均由陣列演變而來。下圖是乙個包含元素(1,2,3和4)的簡單陣列,陣列長度為4。
每個資料元素都關聯乙個正數值,我們稱之為索引,它表明陣列中每個元素所在的位置。大部分語言將初始索引定義為零。
以下是陣列的兩種型別:
著名的撤銷操作幾乎遍布任意乙個應用。但你有沒有思考過它是如何工作的呢?這個問題的解決思路是按照將最後的狀態排列在先的順序,在記憶體中儲存歷史工作狀態(當然,它會受限於一定的數量)。這沒辦法用陣列實現。但有了棧,這就變得非常方便了。
可以把棧想象成一列垂直堆放的書。為了拿到中間的書,你需要移除放置在這上面的所有書。這就是lifo(後進先出)的工作原理。
下圖是包含三個資料元素(1,2和3)的棧,其中頂部的3將被最先移除:
與棧相似,佇列是另一種順序儲存元素的線性資料結構。棧與佇列的最大差別在於棧是lifo(後進先出),而佇列是fifo,即先進先出。
乙個完美的佇列現實例子:售票亭排隊隊伍。如果有新人加入,他需要到隊尾去排隊,而非隊首——排在前面的人會先拿到票,然後離開隊伍。
下圖是包含四個元素(1,2,3和4)的佇列,其中在頂部的1將被最先移除:
移除先入隊的元素、插入新元素
鍊錶是另乙個重要的線性資料結構,乍一看可能有點像陣列,但在記憶體分配、內部結構以及資料插入和刪除的基本操作方面均有所不同。
鍊錶就像乙個節點鏈,其中每個節點包含著資料和指向後續節點的指標。 鍊錶還包含乙個頭指標,它指向鍊錶的第乙個元素,但當列表為空時,它指向null或無具體內容。
鍊錶一般用於實現檔案系統、雜湊表和鄰接表。
這是鍊錶內部結構的展示:
鍊錶包括以下型別:
單鏈表(單向)
雙向鍊錶(雙向)
圖是一組以網路形式相互連線的節點。節點也稱為頂點。 一對節點(x,y)稱為邊(edge),表示頂點x連線到頂點y。邊可以包含權重/成本,顯示從頂點x到y所需的成本。
樹形結構是一種層級式的資料結構,由頂點(節點)和連線它們的邊組成。 樹類似於圖,但區分樹和圖的重要特徵是樹中不存在環路。
樹形結構被廣泛應用於人工智慧和複雜演算法,它可以提供解決問題的有效儲存機制。
這是乙個簡單樹的示意圖,以及樹資料結構中使用的基本術語:
其中,二叉樹和二叉搜尋樹是最常用的樹。
字典樹,也稱為「字首樹」,是一種特殊的樹狀資料結構,對於解決字串相關問題非常有效。它能夠提供快速檢索,主要用於搜尋字典中的單詞,在搜尋引擎中自動提供建議,甚至被用於ip的路由。
以下是在字典樹中儲存三個單詞「top」,「so」和「their」的例子:
這些單詞以頂部到底部的方式儲存,其中綠色節點「p」,「s」和「r」分別表示「top」,「thus」和「theirs」的底部。
雜湊法(hashing)是乙個用於唯一標識物件並將每個物件儲存在一些預先計算的唯一索引(稱為「鍵(key)」)中的過程。因此,物件以鍵值對的形式儲存,這些鍵值對的集合被稱為「字典」。可以使用鍵搜尋每個物件。基於雜湊法有很多不同的資料結構,但最常用的資料結構是雜湊表。
雜湊表通常使用陣列實現。
下圖為如何在陣列中對映雜湊鍵值對的說明。該陣列的索引是通過雜湊函式計算的。
資料結構 十大經典排序演算法
0演算法概述 0.1演算法分類 十種常見排序演算法可以分為兩大類 比較類排序 通過比較來決定元素間的相對次序,由於其時間複雜度不能突破o nlogn 因此也稱為非線性時間比較類排序。非比較類排序 不通過比較來決定元素間的相對次序,它可以突破基於比較排序的時間下界,以線性時間執行,因此也稱為線性時間非...
十大熱門的大資料技術
隨著大資料分析市場的快速滲透到各行業務,哪些大資料技術是剛需?哪些技術有極大的潛在價值?根據弗雷斯特研究公司發布的指數,這裡給出最熱的十個大資料技術 分析 隨著現在硬體和軟體解決方案的成熟,許多公司利用大資料技術來收集海量資料 訓練模型 優化模型,並發布 模型來提高業務水平或者避免風險 nosql資...
十大排序演算法筆記 資料結構
直接插入排序 用0號位置作為哨兵,把r i 放r 0 裡 將待排序的放在陣列裡 for i從2到length 迴圈,每迴圈乙個i與前面已經排好序的每乙個值比較,如果比第i個數小,則把r 0 插入到第i個數裡面 插入前,每乙個數需要往後移乙個單位再插入 前插法或後插法都可 折半插入排序 在原本有序的的...