2021 1 索引優先佇列 c

2021-10-18 10:26:44 字數 4177 閱讀 5997

函式名功能

void insert(int k,key key)插入元素key,並和索引k關聯

void change(int k,key key)將索引為k的值改為key

void delmin()刪除最小元素並返回索引

key min()返回最小元素

void contains(int k)是否包含索引k

#pragma once

#include

#include

#include

using

namespace std;

#define out(x) cout

<

class

key>

class

indexminpq

intsize()

bool

contains

(int k)

intminindex()

key keyof

(int k)

key min()

;int

delmin()

;void

change

(int k, key key)

;void

insert

(int i, key key)

;void

remove

(int k)

;private

:int m_maxn =0;

int m_n =0;

vector<

int>

* m_pq =

nullptr

;//儲存索引,二叉堆,從一開始

vector<

int>

* m_qp =

nullptr

;//逆序,qp[pq[i]]=pq[qp[i]]=i

vector

* m_keys =

nullptr

;//儲存元素

void

sink

(int k)

;//下沉

void

swim

(int k)

;//上浮

bool

less

(int x,

int y)

;//y是否小於x

void

exch

(int x,

int y)

;bool

greater

(int i,

int j)

;//x是否大於y

void

validateindex

(int idx);}

;void

test_indexminpq()

;

#include

"indexminpq.h"

template

<

class

key>

inline indexminpq

::indexminpq

(int maxn)

m_maxn = maxn;

m_n =0;

//佇列中元素個數

m_keys =

new vector

(maxn +1)

; m_pq =

new vector<

int>

(maxn +1)

; m_qp =

new vector<

int>

(maxn +1)

;//不要0位置

for(

int i =

1; i <= maxn;

++i)

}template

<

class

key>

void indexminpq

::insert

(int i, key key)

m_n++

;//加到末尾,並上浮

m_qp-

>

at(i)

= m_n;

m_pq-

>

at(m_n)

= i;

m_keys-

>

at(i)

= key;

swim

(m_n);}

template

<

class

key>

key indexminpq

::min()

template

<

class

key>

int indexminpq

::delmin()

int min = m_pq-

>at(

1);exch(1

, m_n--);

sink(1

);//assert(min == m_pq[m_n + 1]);

m_qp-

>

at(min)=-

1;m_keys-

>

at(min)

=key()

; m_pq-

>

at(m_n +1)

=-1;

return min;

}template

<

class

key>

void indexminpq

::change

(int i, key key)

m_keys-

>

at(i)

= key;

swim

(m_qp-

>

at(i));

sink

(m_qp-

>

at(i));

}template

<

class

key>

void indexminpq

::sink

(int k)

}template

<

class

key>

void indexminpq

::swim

(int k)

}template

<

class

key>

void indexminpq

::exch

(int x,

int y)

template

<

class

key>

bool indexminpq

::greater

(int i,

int j)

template

<

class

key>

bool indexminpq

::less

(int x,

int y)

template

<

class

key>

void indexminpq

::validateindex

(int idx)

}void

test_indexminpq()

; indexminpq<

double

>

minpq(9

);for(

int i =

0; i <4;

++i)

out(minpq.

min())

, hh;

minpq.

change(3

,2.09);

out(minpq.

min())

, hh;

minpq.

change(4

,1.89);

out(minpq.

min())

, hh;

}int

main()

C 優先佇列

半題外話 優先佇列個人認為主要優點是可以在排序後進行類似於插入排序的操作,適合於需要在陣列排序後再次進行操作的題目 再由此產生一堆bug 本蒟蒻是在敲貪心的題時遇見的 弱得連個貪心都不會敲了呵 就開始了學 mo 習 ca 之旅 優先佇列的結構 佇列1.back 返回乙個引用,指向最後乙個元素 2.e...

c 優先佇列

優先佇列容器與佇列一樣,只能從隊尾插入元素,從隊首刪除元素。但是它有乙個特性,就是佇列中最大的元素總是位於隊首,所以出隊時,並非按照先進先出的原則進行,而是將當前佇列中最大的元素出隊。這點類似於給佇列裡的元素進行了由大到小的順序排序。元素的比較規則預設按元素值由大到小排序,可以過載 操作符來重新定義...

優先佇列 c

1.標頭檔案 include queue 2.定義 優先佇列和佇列一樣,只能從隊尾插入元素,從隊首刪除元素。佇列中最大的元素總是位於隊首。可以通過過載 運算子來重新定義比較規則。3.訪問 和佇列不同,優先佇列沒有front 和back 函式,只能通過 top 來訪問隊首元素 堆頂元素,優先順序最高的...