最近看到了一个算法博客不错推荐一下,C20182030Epic,果然是江山代有人才出啊,除了像编写c++ permer plus的大佬刘未鹏还有轮子哥刘梓翰,还有阮一峰等大佬外,也有像硕士研究生之类的毛星云等,还有我的安卓大佬罗sheng阳,没想到高中的学生水平也不赖,因此拜读了他几篇博文并做点笔记
- 第一篇:优先队列priority_queue详解
需要了解的基础知识堆排序:堆就是数组表示完全二叉树。
树有一个有趣的性质:一个编号节点为i的结点的父亲结点编号i/2的结点,左儿子为2i,右儿子为2i+1.如果每个结点存的值都大于或等于自己所有节点的值就叫做大根堆,反之叫小根堆
void input(int d)
{
head[size++]=d;
push_head(head,head+size,greater<int>());
}
**queue就是一个遵守FIFO策略的链表,先进先出策略,需要两个头文件,#include
- queue的声明与构造函数
- queue<数据结构>队列名
- queue的基本操作
q.size();//返回q里元素的个数
q.push(k);//在q的末尾插入k
q.pop();//删除掉q的第一个元素
优先队列有哪些强大之处呢
自动排序
using namespace std:就是一个叫做"std"的namespace,里面封存了一些东西
一个优先队列声明的基本格式
priority_queue<数据结构>队列名;
priority_queue<结构名,vector<结构名>,greater/less<结构名> >队列名;
可以简写为priority_queue<结构名>,不过这样只能从大到小了
三个结构体名保持一致,要求结构有小于的规则,系统自带的数据结构小于规则是显然的,对于结构体需要通过重载运算符等方式规定。
struct point
{
int x,y;
bool operator<(const point &p)const
{
return x*x+y*y<p.x*p.x+p.y*p.y;
//假设这是平面上的两个点,规定两个点的大小关系为距离原点的距离小者小,
//这个函数的意思是:当你使用小于运算符判断一个点a与另一个点(函数里的
//p)的大小关系时,系统会判断a.x*a.x+a.y*a.y是否<p.x*p.x+p.y*p.y
//如果式子成立,说明a点小于p点return1
}
};
priority_queue<point>QP;