演算法基礎--03
接上篇博文。
今天時間是2018年10月29日,本篇博文介紹的是這本書的第三篇內容,主要是一些資料結構方面的一些知識點的總結。那麼下面我們就開始了。
第三章 資料結構
對於需要輸入大量資料,處理並且輸出結果演算法,在輸入輸出大量資料或者處理過程中需要高效的儲存和處理各種各樣大量的資料。那麼就引來了資料結構。
3.1 資料結構
首先有兩個例子,一個是日本的郵編,一個是學校學生的學籍或者學生號的例子。主要為了說明一下資料結構的由來,兩個例子為了方便理解。
所謂的資料結構就是為了高效的管理大量資料的構造。
資料結構和處理過程在演算法中同樣具有重要的程度。
3.2 常用的資料結構
陣列
同類資料緊密排列就得到陣列,可以分為一維陣列 二維陣列 三維陣列以及多維陣列
連結串列
管理按照順序排列的資料的時候使用的資料結構。按照順序或者逆序管理的前後關聯的資料
堆疊
取資料的順序和存資料的順序相反(“先進後出”)
佇列
按照排序的先後順序處理資料,取資料和存資料的順序是一致的(“先進先出”)
樹
樹木的結構
像樹木結構一樣管理資料的資料結構成為“樹”
3.3 堆疊
堆疊 stack 音譯過來的 意思是“堆疊”。
把資料用堆疊的方式來管理的資料結構。
管理資料有兩種操作:
(1)寫入資料 push
(2)讀取資料 pop
像堆疊這樣,最後寫入的資料最先讀取的資料管理的方式被稱為LIFO或者FILO
3.4 佇列
一種先輸入的資料先輸出的資料結構。
像佇列這樣最先輸入的資料最先輸出的特徵的資料管理方式,被稱為FIFO或者LILO
3.5 連結串列
把離散的資料串起來
管理按照第一、第二這樣順序排列的資料,最常用的資料結構是一維陣列。連結串列也是一樣,可以用來管理順序排列的資料。
區別:
陣列:資料是沒有間隙的緊密排列的
連結串列:資料就像用繩子一樣串起來,位置不一定相互緊靠。
連結串列中各個元素的位置可以自由排列。無論資料的儲存位置如何變更,連結串列也可以正確的管理各個資料的位置。
連結串列中一共有多少個有效資料這個資訊的方法也和陣列不同。陣列用一個單獨的變數儲存有效資料的個數。而連結串列則是在最後一個數據中標記“已經沒有下一個資料了”來表示這是連結串列的結尾了。
3.6 單向連結串列
連結串列中,有一個方向將資料連線起來的連結串列稱為單向連結串列。
兩個重要資訊:
資料:儲存在各個元素之中、意圖通過連結串列來管理的值
指向下一個元素的指標:充當元素和元素之間緊密連線的繩子,在這個場合被稱為NEXT指標
NEXT指標:表示的資訊是下一個元素儲存在哪裡。
連結串列中,最後一個元素的NEXT指標標識終止資訊,表示的是沒有下一個元素。
另外的一個重要資訊是HEAD指標,指向第一個元素的指標,儲存第一個元素的位置資訊。
如果連結串列一個數據也沒有的話,那麼他的HEAD指標指示的就是沒有第一個元素這個資訊,通常會用無效的指標來表示。
如果指標的值都是從1開始的值,那麼通常會用0來表示無效指標。
3.7 雙向連結串列
能檢索上一個或者下一個資料
在連結串列裡,用向前或者向後兩個方向把資料連線起來的連結串列稱為雙向連結串列。
三個資訊:
資料:儲存在各個元素之中,意圖通過連結串列來管理的值。
指向下一項的資訊:NEXT指標,充當和下一個元素之間的緊密連線的繩子
指向上一項的資訊:PREV指標,充當和上一個元素之間的緊密連線的繩子
末尾元素的next指標以及起始元素的prev指標都分別表示“沒有下一個元素”這樣的終止資訊
還有兩個資訊:
指向起始元素的指標head指標和指向末尾元素的指標tail指標。
head指標儲存的是起始元素的位置資訊,tail指標儲存的是末尾元素的位置資訊。
當雙向連結串列裡一個元素都沒有的時候,head元素和tail元素分別儲存“沒有起始元素”和“沒有末尾元素”這樣的資訊。
3.8 陣列的優勢
要從順序的一組資料中找到第n個元素,用陣列的話可以在一瞬間完成。而用連結串列的話,要訪問第N個元素只能從起始位置開始,一個個來進行訪問。如下圖所示:
這樣來看,訪問第N個元素,陣列相比連結串列顯然更加有效率。
3.9 連結串列的優勢
1.資料插入:
陣列插入資料必須把新資料插入位置往後的所有資料都向後移動。為了插入一條資料,往往需要進行大量的資料移動操作。
對於連結串列,插入一份資料只需要把插入位置原來的連結去掉,讓前後兩份資料連上新的資料就可以了。
2.資料刪除:
在刪除一份資料的時候,如果是陣列,就必須把刪除的資料後面所有的資料向前移動。對於連結串列而言,無論刪除的資料後面有多少條資料,都只需要把這份資料和前後的連結去掉,把前後資料直接連結起來就可以了。
在資料的插入和刪除上鍊表效率更高。
3.10 環形緩衝區
陣列元素的個數存在上限。
通過讓一個數組首尾相連,得到末尾元素後面還有元素這樣的資料結構。
事實上,末尾元素後面沒有元素了,不過通過指定末尾元素的下一個元素是起始元素這樣的規則,利用原有的一維陣列的結構,就可以永遠的訪問任意一個元素的下一個元素,這就是其特點。
3.11 樹
樹是一種管理有像樹幹,樹枝,樹葉一樣關係的資料結構。
樹由節點(頂點)和邊(枝)組成,並且由一個節點作為起始點,這個節點成為根節點。
相應的其他概念:
父節點 :從根節點,延伸出來的這些節點又可以向下繼續延伸出新的節點。舊的節點成為父節點。
子節點 :從根節點,延伸出來的這些節點又可以向下繼續延伸出新的節點。新的節點成為子節點。
葉子節點:一個子節點都沒有的節點。
深度:從根節點出發,到達某一個節點所要經過的邊的個數成為深度。
3.12 二叉樹
在樹形結構中,如果每個父節點只有兩個子節點那麼就被稱為二叉樹。
兩個子節點分別被稱為左子樹和右子樹。不過也不是所有的父節點都有兩個子節點。
唯一的限制就是每一個節點的子節點都不能超過兩個。
二叉樹可以使用陣列進行表示。可以定義某一個父節點的元素的索引是i,其左節點的元素索引為2*i+1,其右節點的元素的索引為2*i+2
二叉樹通常可以用於表示父子節點儲存的資料大小關係,也可以用於表示二項式,另外可以用於搜尋演算法。
3.13 圖
關注的是兩個以上的資料專案之間是如何關聯在一起的,並且通過圖形一樣的方式把這種關聯方式表現出來。
專案成為節點,節點的關係的連線成為邊。
有時候,圖的邊也是有向的。由節點和有方向的邊組成的圖成為有向圖。
如果一個圖的每條邊都擁有權重,那麼這個圖就是加權圖。
專題三
為什麼陣列的起始下標有時是0,有時是1?
造成這個差異的由來是不同的計算機程式語言的設定。
最早流行的語言的陣列的起始位置就是從1開始,後面的語言的起始位置基本都是0。
下篇將要介紹本書的第四章 演算法基礎。看了現在大概快一百頁了。開始講演算法的基礎了。希望有興趣的朋友接下來持續關注。感謝您的欣賞。我是BurgessLee,一個程式設計小白,希望我們一起學習進步,期待您的加入。