資料結構總結(一) 一種特殊的有序佇列

2021-05-22 11:02:35 字數 1489 閱讀 4127

遇到過一種比較特殊的佇列,以前我習慣叫它「雙端佇列」,可能是當時的誤解,先假想一下如下的情況:

有一堆元素,每個元素有乙個關鍵值key,乙個代表位置的pos。對於乙個給定的位置p,我要找與這個位置距離不超過k的最小(大)的值。但是還有乙個重要限制,這堆元素得乙個乙個處理和查詢,先處理的元素的pos必須比後處理的元素的pos要小。就是說,第乙個元素處理,第二個元素處理。。。第i個元素處理,這時候如果要查詢,只能查詢跟第i個元素距離為k的最小(大)的前面處理過的元素,我姑且定位為這種查詢為「立即查詢」吧。這裡有點不好理解,或者說,這麼苛刻的條件,這種結構會有什麼用武之地,慢慢來,後面你就會明白。

我繼續沿用「雙端佇列」來稱呼我所要表達的這種結構,「雙端佇列」支援兩種操作,一是插入,二是出佇列,出來的這個元素是和給定的乙個pos值不超過k距離的最小(大)的元素。

下面以支援彈出最小元素為例,最大類似

1.基本結構:

令元素為e(key,pos),表示關鍵字為key,位置為pos的元素;令查詢q(pos,k),查詢前面出現的,跟pos位置不超過k的最小元素。

2.插入操作:

佇列中將維護乙個有序單調非降的序列,當插入元素e(key, pos)時,按key二分查詢,查詢的落點將落在》key的第乙個,如:

que(key):1 2 3 4 7

如果插入3,那麼落點是4這個位置,然後修改隊尾指標r,使得佇列調整為que(key): 1 2 3 3,也就是說4,7都被刪除了。為什麼呢?因為我後面如果有查詢(出佇列),我要找最小值,而且,根據前面我們說的必須條件,前面先處理的元素的pos要比我當前小,也就是說4,7的pos比後面的3小,故後面的查詢q(pos,k),無論是pos還是key,4,7比新來的3都沒有優勢,不可能是他們,所以刪除也無妨。

這裡f是佇列的頭位置,而r是佇列的尾位置的下乙個。

3.出佇列操作(查詢)

出佇列很簡單,因為已經是乙個有序非降的序列,所以越前面的元素越小,但是,可能其距離不滿足要求。這時有個減小佇列的維護,如果前面的元素不滿足條件,那麼這些元素都可以從佇列中刪除了,因為後面的查詢操作將更加不能滿足距離要求(還記得必須條件嗎)。

我將給乙個列子來說明這個「雙端佇列」的乙個應用:

這道題目的意思是:給定乙個陣列,如[1 3 -1 -3 5 3 6 7],給定乙個視窗m=3,視窗從左到又移動,輸出每次視窗中的最小最大值。

該例子[1 3 -1] -3 5 3 6 7,最小-1,最大3

1 [3 -1 -3] 5 3 6 7,最小-3,最大3

等等。。。

其實就是每次查詢跟第i個元素距離不超過m的最小(大),在這裡每個元素的key是其值,pos是出現的下標。滿足pos越後面越大,而且每次都是「立即查詢」。故可用「雙端佇列」求解。

其他在一些dp類中,也很有可能用到它來做優化,08年北京賽區regional中就有乙個又此結構優化的dp的題目,具體忘記了。

下面是pku2828的**:

資料結構隊的使用

本程式實現佇列的基本功能 建立隊 進隊 出隊 判滿 判空 銷毀 main.c include include squeue.h int main void return ok queue.c include include include squeue.h 建立squeue createqueue ...

Trie樹 一種NB的資料結構

最近在做一些題的時候更加理解到為什麼有一句話叫做程式 演算法 資料結構,可能之前的一些題我用 最基本的資料型別加上一些 意想不到 的演算法就可以解決,但是往往一些問題,佐以精妙的資料結構能讓人事半功倍。字典樹,是一種 樹形結構 是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的 字串 但不僅限...

樹 一種資料結構(二)

通過樹形結構的構造,進行組合設計模式 composite 的實現 node作為基類 本身不持有資料,用於維護共同的節點結構 class node protected node size t id,boost shared ptrp parent p id id 通過建構函式傳遞進來的父類指標建立與其...