資料結構番外篇 stl應用 1 優先佇列

2021-09-01 17:53:14 字數 3618 閱讀 1128

stl是一種重要技巧,可以極大地簡化程式設計過程

在總結stl之前,我們先簡單介紹一下迭代器。

迭代器可以簡單理解為位址的等價物。

在不同資料型別中迭代器支援的操作略有不同

其中vector使用的是隨機訪問迭代器,其支援的操作可以參考上述**

雖然本文用不上預備知識,但是還是先說一下吧

接下來介紹常用stl——優先佇列

優先佇列(英文priority_queue)是一種維護集合最大最小值的資料結構(堆)

它能夠在o(1)時間得到乙個集合的最大(小)值,在o(logn)時間加入新的元素或者刪除最大(小)的元素

常見操作如下:

優先佇列預設為大根堆,即維護最大值

#include

#include

#include

#include

using namespace std;

priority_queue<

int> q1;

//預設大根堆

priority_queue<

int,vector<

int>

,less<

int>

> q2;

//等價的大根堆

priority_queue<

int,vector<

int>

,greater<

int>

> q3;

//小根堆

intmain()

while

(!q1.

empty()

)//檢查是否非空

while

(q3.

size()

>0)

//返回元素個數

}

優先佇列的優化十分優秀,很多情況下甚至比手寫heap還要快

洛谷p3871 中位數

題目描述

給定乙個由n個元素組成的整數序列,現在有兩種操作:

1 add a

在該序列的最後新增乙個整數a,組成長度為n + 1的整數序列

2 mid

輸出當前序列的中位數

中位數是指將乙個序列按照從小到大排序後處在中間位置的數。(若序列長度為偶數,則指處在中間位置的兩個數中較小的那個)

例1:1 2 13 14 15 16 中位數為13

例2:1 3 5 7 10 11 17 中位數為7

例3:1 1 1 2 3 中位數為1

輸入輸出格式

輸入格式:

第一行為初始序列長度n。第二行為n個整數,表示整數序列,數字之間用空格分隔。第三行為運算元m,即要進行m次操作。下面為m行,每行輸入格式如題意所述。

輸出格式:

對於每個mid操作輸出中位數的值

這道題有很多做法,在此給出簡單且時間效率高的優先佇列做法

將陣列按照從小到大排序,將較小的一半放入乙個大根堆,將較大的一半放入乙個小根堆

每次新增數的時候與兩個堆堆頂元素比較,將其放入相應的堆中

確保左堆的元素個數》=右堆的元素個數》=左堆元素個數-1

若打破了這個條件,只需將某堆中的堆頂元素換到另乙個堆即可

每一次詢問輸出左堆堆頂

#include

#include

#include

#include

#include

#include

using namespace std;

priority_queue <

int,vector<

int>

,greater<

int>> qright;

priority_queue <

int,vector<

int>

,less<

int>> qleft;

vector <

int> v;

intmain()

sort

(v.begin()

+1,v.end()

);for(

int i =

1; i <= n/

2; i ++

)qleft.

push

(v[i]);

for(

int i = n/2+

1; i <= n; i ++

)qright.

push

(v[i]);

scanf

("%d"

,&m)

;while

(m--

)else

else qright.

push

(x);

int a = qleft.

size()

,b=qright.

size()

;if(a-b>1)

else

if(b>a)}}

}

洛谷p1484 種樹

題目描述

cyrcyr今天在種樹,他在一條直線上挖了n個坑。這n個坑都可以種樹,但為了保證每一棵樹都有充足的養料,cyrcyr不會在相鄰的兩個坑中種樹。而且由於cyrcyr的樹種不夠,他至多會種k棵樹。假設cyrcyr有某種神能力,能預知自己在某個坑種樹的獲利會是多少(可能為負),請你幫助他計算出他的最大獲利。

輸入輸出格式

輸入格式:

第一行,兩個正整數n,k。

第二行,n個正整數,第i個數表示在直線上從左往右數第i個坑種樹的獲利。

輸出格式:

輸出1個數,表示cyrcyr種樹的最大獲利。

這道題採用的思想是在一棵樹被種之後,要改種左右兩顆樹獲利等於左右兩樹之和減去這棵樹,我們把這個獲利再當成之前被種的樹的獲利放入堆中,並且標記左右兩棵樹無效。

最後k次取堆頂元素求和

#include

#include

#include

#include

using namespace std;

#define n 500004

int f[n]

,l[n]

,r[n]

,n,k,cnt,tot;

long

long ans;

bool vis[n<<2]

;struct num

}buf;

priority_queue heap;

intmain()

);vis[i]=1

; r[i]

=i+1

; l[i]

=i-1;}

for(

int i =

1; i <= k ; i ++))

; r[buf.pos]

=r[r[buf.pos]

];l[r[buf.pos]

]=buf.pos;

l[buf.pos]

=l[l[buf.pos]

];r[l[buf.pos]

]=buf.pos;

vis[buf.pos]=1

;}cout<

}

資料結構 查詢番外篇 靜態數表的查詢 次優查詢樹

二分查詢對於等概率的查詢的效能是最優的,但是如果我們對於 資料查詢的概率不相等時,顯而易見簡單再用二分查詢不一定能得到最高的效率。如果只考慮查詢成功的情況,則使查詢效能達最佳的判定樹是其帶權內路徑長度之和ph值 ph w1h1 w2h2 wnhn 取最小值的二叉樹。這種二叉樹稱為靜態最優查詢樹。找到...

資料結構 排序番外篇 堆,堆排序與其前身選擇排序

優先佇列 特殊的 佇列 取出元素的順序是依照元素的優先權 關鍵字 大小,而不是元素進入佇列的先後順序 堆是優先佇列的完全二叉樹表示。堆的兩個特性 結構性 用陣列表示的完全二叉樹 有序性 任意結點的關鍵字是其子樹所有結點的最大值,叫最大堆 或最小值,叫最小堆 注意從根結點到任意結點路徑上結點序列的有序...

資料結構 STL

棧 先入後出 filo 的一種資料結構。常見操作 模擬火車調頭,進製轉換,表示式求值,單調棧 陣列形式 理解 const int num 1e6 10 定義棧的大小,可自由改變 int stac num 乙個整型棧 int top 棧頂指標 int main top 1 設定棧頂指標為 1 stac...