1. 程式人生 > >資料結構與演算法之八 佇列

資料結構與演算法之八 佇列

視訊課堂https://edu.csdn.net/course/play/7621

目標

在本章中,你將學到: 識別佇列的特性 運用不同型別的佇列 運用佇列來解決程式設計問題 使用雜湊法儲存和搜尋資料

考慮這樣一種情形,你要建立一個有以下請求集的應用程式: 應用程式可被應用於多使用者的請求。 每次,僅處理一個請求。 先到的請求優先被處理。 然而,這些軟體接受請求的速度要遠大於處理請求的速度。 因此需要將請求儲存在佇列中直到被處理。
你如何解決此問題? 你可以通過以這樣的方式儲存請求來解決該問題,即以請求到達的順序來獲取請求。 稱為佇列的資料結構以資料的到達順序來儲存和獲取它們。 佇列也被稱為先入先出佇列(FIFO)。


一個佇列就是含有一組元素的列,這個列中資料從佇列一端新增,然後從隊列另一端刪除。


插入:指將資料新增到佇列中。 假設希望將元素F新增到佇列中。 因為新增操作發生在末端,元素F將新增到元素D之後。 現在元素F
變成了末端。


刪除:指的是將元素從佇列中刪除。 資料從前端被刪除。因此,元素B將從佇列中移走。 現在A變成了佇列的前端。


問題描述: 考慮一個銀行的場景。當客戶來到櫃檯並輸入請求,就可以得到一個請求號碼。收到請求號碼後,客戶必須等候一段時間。客戶請求需要進入系統佇列,並按照到達的順序獲得處理。你需要實現一種適當的資料儲存機制在系統中儲存這些請求。


佇列的應用


佇列能在多個領域中得到應用,如:
印表機暫存 CPU排程 郵件服務 鍵盤緩衝 電梯

印表機暫存


印表機可能會在短時間內收到多個列印請求。 收到的列印請求頻率要大於處理請求的頻率。 因此,就需要一個臨時儲存機制來按照到達順序儲存列印請求。 在這種情況下,佇列就是最佳選擇,可以按照先到先服務原則儲存列印請求。





CPU 排程
一個 CPU 同一時間只能處理一個請求。 通常, CPU 接受請求的頻率都大於處理請求的頻率。 因此這些請求都按照到達順序暫時儲存在一個佇列中。 CPU 有空時,就會從佇列中一個個地取出請求,並處理它們。 一旦一個請求處理完後,就會從佇列中移出。 CPU 就會取出下一個請求,並處理。 在一個分時系統中( time sharing system ), CPU 分配給每個請求的時間都 是固定的。 所有的請求都臨時儲存在佇列中。 CPU 一個個地按固定時間處理每個請求。 如果請求在固定時間段中處理完成,這個請求就會從佇列中移出。 如果一個請求沒有在特定的時間段中處理完成,就會被移到佇列的末尾。 CPU 就會處理佇列中的下一個請求,依此類推。

郵件服務 在許多企業中,許多行為都是通過郵件進行的。 但如果郵件伺服器下線了,並且還有人要給你發郵件,郵件就會退回給發件 人。 要避免這樣的情況,許多企業實現了一個 郵件備份服務 當郵件伺服器發生問題時而導致郵件沒有傳送成功,這個郵件就被傳送到一 個備份伺服器。 備份伺服器將郵件臨時儲存在佇列中。 當郵件伺服器恢復工作時,所有的郵件會按到達的順序傳送給收件人。 鍵盤緩衝
佇列還被用於儲存你在鍵盤上的每一下敲擊。 有時候你通過鍵盤敲擊的資料並不是立即反映在螢幕上。 這是因為當時處理器忙於處理其他任務,無法處理你的請求。 在這種情況下,資料臨時儲存在佇列中,直到處理器開始處理這個請求。 一旦處理器空閒下來,你所有的敲擊都會按照到達的順序顯示在螢幕上。
電梯 一部電梯也使用佇列來儲存使用者的請求。 假設電梯此時在第一層。有個使用者在底層按了電梯按鈕。同時另一個使用者在 二層也按了電梯按鈕。 那麼電梯會前去最先按鈕的一層,也就是說,這些請求會按先到先服務的原 則進行處理。 但是,如果一個使用者在底層,另一個使用者在九層 (9 層往↑往↓ ) ,那麼無論 誰先按鈕,電梯都會先去底層,因為去底層的 距離更短 。這種情況下,將需 要使用 優先順序佇列



執行雜湊搜尋

二叉搜尋演算法有以下缺點: 它只能搜尋排序過的列表。 它還需要一個方法能夠直接訪問列表的中間元素。 能夠克服這些限制並且提供高效率的搜尋演算法是雜湊搜尋。

雜湊有兩個限制: 它可能導致衝突。 它不能順序訪問。
定義雜湊
假設您要搜尋與給定記錄列表中的某個給定鍵值相對應的記錄。 要檢索所需記錄,需要順序地搜尋整個記錄直到找到具有所需鍵值的記錄。 該方法十分耗時,尤其當列表非常大的時候更加耗時。 一個有效的解決方法是在偏移地址的幫助下搜尋該記錄。 可以使用稱為雜湊法的技術來計算記錄的偏移地址。
雜湊的基本原理是將鍵值轉換為偏移地址來檢索記錄。 鍵轉換為地址是通過一種關係(公式)來完成的,就是雜湊 使用雜湊搜尋記錄的過程總結為:  1.  給定一個鍵,雜湊函式將它轉換為範圍從 1 n 的雜湊值(位置),其中 n 是已經為這些記 錄分配的儲存(地址)空間的大小。  2. 在產生的位置處檢索到記錄。  

雜湊有兩個限制: 它可能導致衝突。 它不能順序訪問。
選擇雜湊函式的兩個原則標準是: 簡單並且能夠快速計算。 能夠在地址空間中獲取鍵的均勻分佈。 設計一個雜湊函式有各種技術,其中有: 擷取法 模組法 平方取中法 摺疊法
解決衝突

試圖將兩個鍵儲存在同一位置的情形稱為衝突。 兩個記錄不能佔用同一個位置。因此,需要注意發生衝突的情況。 衝突可以使用稱為分離鍵的方法得到解決。

使用雜湊比使用其他搜尋方法更快速。 雜湊效率在理想化的情況下是 O(1) 但是,由於衝突,雜湊的效率會降低。 在這種情況下,雜湊的效率取決於雜湊函式的質量。
小結

在本章中,你已經學到: 一個佇列就是線型資料結構,佇列中的元素被插入在佇列末端,然後從佇列前端 刪除。 佇列上可進行的操作有插入和刪除。 可通過使用陣列或連結列表來實現佇列。 一個使用迴圈陣列實現的佇列能克服線性陣列實現的佇列的空間利用率問題。 使用連結列表實現的佇列也被稱為連結佇列。

佇列能在多個領域中得到應用: 印表機暫存 CPU 排程 郵件服務 鍵盤緩衝 電梯 雜湊的基本原理是將給定的鍵值轉換成偏移地址以檢索記錄。 在雜湊中,鍵轉換為地址是通過一個關係(公式)也就是雜湊函式來完成的。 雜湊函式為兩個或多個鍵產生相同的雜湊值,這種情況稱作衝突。 使用一個好的雜湊函式可以使衝突發生的可能性降至最小。

選擇雜湊函式的兩個原則標準是: 簡單並且計算快速。 在地址空間中應該達到均衡的鍵分佈。 可以使用各種技術來設計雜湊函式,它們是: 擷取法 模組法 平方取中法 摺疊法 衝突問題可以使用稱為分離鏈的方法得到解決。