福州培訓之資料結構 佇列,堆 (2月8日)

2021-08-15 12:29:47 字數 2031 閱讀 4120

今天其實講了另外的東西,但我沒聽懂,所以不寫了,把昨天的內容補一補,今天的之後自己體悟一下再來總結......

首先佇列:「先進先出」資料訪問

佇列顧名思義就像排隊一樣

更形象一點,就像只能容納乙個人的獨木橋

佇列是一種「先進先出」的容器

先存進佇列的元素比後進佇列的元素先取出

必須在先進佇列的元素取出後,後入隊的元素才可以取出

所以佇列用於訪問情況為「先進先出」的場景問題的資料訪問。

比如解決提到的過獨木橋的順序問題,以及排隊問題等。顯然,bfs過程中的村塾也是用佇列的思想

特點:1.資料存在乙個 陣列,陣列的大小即佇列容量大小

2.用兩個變數head和tail分別記錄隊首資料下標-1和隊尾資料下標

3.以陣列形式存放乙個佇列(int q[maxsize];)

4.隊空時head=tail

5.隊滿時tail=maxsize-1(注意:和tail-head無關)

6.head為隊首元素的下標-1.通過訪問q[head+1]取隊首元素。tail為隊尾元素下標

給出乙個容量為5的佇列的例子:

將元素進,出佇列:

1.訪問當前隊首的元素:q[head++]

2.新的元素x入佇列:++tail;q[tail]=x;

3.隊首元素出佇列:++head;

然而,這很浪費空間,10哥元素,逐個入隊,再逐個出隊,再逐個入隊,如此重複10000遍,所需空間就很大

隊首出隊只是隊首下標+1,假裝刪除了隊首,而實際上並沒有真正釋放空間

所以,改進!

普通的佇列vs環形佇列:

普通佇列vs雙端佇列:

接下來堆:

堆就是乙個「父親值比兒子值大」或「父親值比兒子值小」的完全二叉樹

堆實際上時乙個序列,它滿足條件:

當i=1,2,...,n/2時,k[i]<=k[2i]且k[i]<=k[2i+1];或

當i=1,2,...,n/2時,k[i]>=k[2i+1]且k[i]>=k[2i+1];

堆按照父親和兒子數值的比較關係可分為「大根堆」和「小根堆」兩種

堆在取序列最值功能上有出色的表現,

在已經生成好的堆上取序列最值操作的複雜度o(1),修改乙個生成好的堆上的資料

的複雜度為o(logn),初始化生成乙個堆也值需要o(nlogn)的時間

因此,堆很適合頻繁地查詢序列中的最大值的問題

去最值:

依照定義,堆結構種的第乙個元素即最值

所以,要去堆h中的最值,直接訪問h[1]即可獲得,相當簡單

調整:

建堆:

[code]

viod build()

刪除隊首元素:

[code]

void delete()

}插入新元素:

[code]

void insert(int key)

{int x=++n;

while(x>1)

{    if(keyok,結束

福州培訓之資料結構 鍊錶,棧 (2月7日)

今天呢,換了個老師講,大部分都聽懂了,可能是內容比較簡單的原因吧 首先,怎麼學寫程式 程式 programming 資料結構 data structure 演算法 algorithm 沒有天生前後順序關係的 陣列 記錄乙個元素的後乙個元素 反向鍊錶,雙向鍊錶,迴圈鍊錶等 特點 1.資料存在陣列裡 2...

資料結構(8)之堆

1.堆排序定義 n個關鍵字序列kl,k2,kn稱為堆,當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k2i且ki k2i 1或 2 ki k2i且ki k2i 1 1 i 若將此序列所儲存的向量r 1.n 看做是一棵完全二叉樹的儲存結構,則堆實質上是滿足如下性質的完全二叉樹 樹中任一非葉結點的...

大話資料結構8之棧和佇列2

棧的應用 四則運算表示式求值 字尾 逆波蘭 表示法定義 不需要括號的字尾表示式。例 9 3 1 3 10 2,字尾表示式為9 3 1 3 10 2 所有的符號都是在要運算的數字後面出現 字尾表示式計算結果 還是上例 1 初始化乙個空棧,此棧用於對要運算的數字進出使用 2 字尾表示式中的前三個都是數字...