priorityQueue優先順序佇列 (python、c++)
阿新 • • 發佈:2018-12-18
優先順序佇列
優先順序佇列
佇列就是一個先進先出(FIFO)的結構,而優先順序佇列則是對佇列裡的每一個元素設定一個優先順序,取元素時先獲得優先順序最高的一個元素。在python和c++裡都有庫可以呼叫。(java裡應該也有,但是我不會java,所以算了吧。)
今天看了SNIC超畫素分割的一個程式,“每次取距離中心最近的點”這個操作,想想就很麻煩。研究發現把距離設定成優先順序,然後用一個佇列就解決了。對基於SDF網格的三維重建,可能也會碰到類似的需要對網格排序的情況。庫幫忙自動維護這些資料,實在是太方便了。
python
直接用SNIC裡面的例子吧
from Queue import PriorityQueue
Q= PriorityQueue()
Q=putinQ(ck,Q,numk) #初始化Q
class NODE(object):
def __init__(self,priority,description1,description2,description3):
distance=int()
xk=int()
yk=int()
k=int()
self.priority=distance
self.description1=xk
self.description2=yk
self. description3=k
def __cmp__(self,other):
return cmp(self.priority,other.priority)#優先順序佇列
def putinQ(ck,Q,numk):
for k in range(numk):
tempnode=NODE(0.0,1,1,1)
tempnode.priority=0.0
tempnode.description1=ck[k][0]
tempnode.description2=ck[k][1]
tempnode. description3=k
Q.put(tempnode)
return(Q)
#獲得Q裡的元素
Q.get();
#加入元素
Q.put(a);
#Q的長度
Qlength=Q.qsize()
C++
#include<queue>
using namespace std;
priority_queue<int> big; //大根堆
priority_queue<int,vector<int>,greater<int> > small; //小根堆,最後的兩個“>”之間要有空格,vector不用單另開標頭檔案。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
int s,b;
bool operator < (const node &x) const
{
if(x.s!=s)
return x.s>s; //從小到大
else
return x.b<b; //從大到小
}
}A[100];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&A[i].s,&A[i].b);
}
sort(A+1,A+1+n);
for(int i=1;i<=n;i++)
{
printf("%d %d\n",A[i].s,A[i].b);
}
return 0;