《資料結構與演算法之美》9講學習筆記

2021-10-19 04:40:27 字數 1770 閱讀 3875

一、什麼是佇列?1.先進者先出,這就是典型的「佇列」結構。

2.支援兩個操作:入隊enqueue(),放乙個資料到隊尾出隊dequeue(),從隊頭取乙個元素

3.所以,和棧一樣,佇列也是一種操作受限的線性表。

二、如何實現佇列?

1.佇列api

public inte***ce queue
2.陣列實現(順序佇列)

3.鍊錶實現(鏈式佇列)

4.迴圈佇列(基於陣列)

當隊滿時,(tail+1)%n=head

//入隊:關鍵在於隊滿的條件

public boolean enqueue(string item)

//出隊:關鍵在於隊空的條件

public string dequeue()

}三、佇列有哪些常見的應用?1.阻塞佇列1)在佇列的基礎上增加阻塞操作,就成了阻塞佇列。

2)阻塞佇列就是在隊列為空的時候,從隊頭取資料會被阻塞,因為此時還沒有資料可取,直到佇列中有了資料才能返回;如果佇列已經滿了,那麼插入資料的操作就會被阻塞,直到佇列中有空閒位置後再插入資料,然後在返回。

3)從上面的定義可以看出這就是乙個「生產者-消費者模型」。

這種基於阻塞佇列實現的「生產者-消費者模型」可以有效地協調生產和消費的速度。

「生產者」生產資料的速度過快,「消費者」來不及消費時,儲存資料的佇列很快就會滿了,這時生產者就阻塞等待,直到「消費者」消費了資料,「生產者」才會被喚醒繼續生產

不僅如此,基於阻塞佇列,我們還可以通過協調「生產者」和「消費者」的個數,來提高資料處理效率,比如配置幾個消費者,來應對乙個生產者

2.併發佇列

1)在多執行緒的情況下,會有多個執行緒同時操作佇列

2)併發佇列簡單的實現就是在enqueue()、dequeue()方法上加鎖,但是鎖粒度大併發度會比較低,同一時刻僅允許乙個存或取操作

3)實際上,基於陣列的迴圈佇列利用cas原子操作可以實現非常高效的併發佇列。這也是迴圈佇列比鏈式佇列應用更加廣泛的原因。

3.執行緒池資源枯竭是的處理

在資源有限的場景,當沒有空閒資源時,基本上都可以通過「佇列」這種資料結構來實現請求排隊

4.佇列的其他應用

分布式訊息佇列,如 kafka 也是一種佇列。

資料結構與演算法之美(筆記9)雜湊演算法

我們前面講到雜湊表,雜湊函式,這裡又是雜湊演算法,實際上,雜湊函式就是雜湊演算法的乙個特例。只不過在雜湊表中,我們通常希望雜湊函式簡單,才不會影響查詢等的效能。雜湊演算法的定義和原理很簡單,就是把任意二進位制串值對映為固定長度的二進位制值串,這個對映的規則就是雜湊演算法,而通過原始的資料對映之後得到...

資料結構與演算法之美

什麼是資料結構?什麼是演算法 狹義重點 複雜度分析 方法 邊學邊練,適度刷題 複雜度分析 時間複雜度 常見時間複雜度 非多項式量級 非常低效的演算法 空間複雜度 漸進空間複雜度,表示演算法的儲存空間和資料規模的增長關係 最好情況時間複雜度 理想情況的時間複雜度 最壞情況時間複雜度 最糟糕的情況下的時...

《資料結構與演算法之美》筆記 鍊錶

typedef struct node node 陣列和鍊錶都是線性表。陣列必須是連續空間,而鍊錶無所謂。鍊錶 單鏈表 迴圈鍊錶 雙向鍊錶 陣列 插入 刪除的時間複雜度是o n 隨機訪問的時間複雜度是o 1 鍊錶 插入 刪除的時間複雜度是o 1 隨機訪問的時間複雜端是o n 快取淘汰策略 先進先出策...