priorityQueue优先级队列 (python、c++)

优先级队列

  • 优先级队列
  • python
  • C++

最近用优先队列写了一个SNIC超像素分割的工程,有兴趣的可以下载看看。(VIP大佬让我赚一点下载积分吧,感激不尽)
https://download.csdn.net/download/koffee_f/10767813
之前觉得速度很慢,原来是因为一个cout没有删掉。删掉之后在release下跑很快。

优先级队列

队列就是一个先进先出(FIFO)的结构,而优先级队列则是对队列里的每一个元素设置一个优先级,取元素时先获得优先级最高的一个元素。在python和c++里都有库可以调用。(java里应该也有,但是我不会java,所以算了吧。)

今天看了SNIC超像素分割的一个程序,“每次取距离中心最近的点”这个操作,想想就很麻烦。研究发现把距离设置成优先级,然后用一个队列就解决了。对基于SDF网格的三维重建,可能也会碰到类似的需要对网格排序的情况。库帮忙自动维护这些数据,实在是太方便了。

具体的逻辑这个博客讲的非常好,有空再研究。
https://blog.csdn.net/qq_35326718/article/details/72866180
先简单记录一下怎么用

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++

这么方便的东西STL里就有,只要include “queue” 就可以了
转载自 https://blog.csdn.net/baidu_35643793/article/details/70173709

#include  
using namespace std;
priority_queue<int> big;  //大根堆  
priority_queue<int,vector<int>,greater<int> > small;  //小根堆,最后的两个“>”之间要有空格,vector不用单另开头文件。

#include
#include
#include
#include
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;

你可能感兴趣的:(图像分割)