当我们需要高效的完成以下操作时:

  1.插入一个元素

  2.取得最小(最大)的数值,并且删除

能够完成这种操作的数据结构叫做优先队列

而能够使用二叉树,完成这种操作的数据结构叫做堆(二叉堆)

堆与优先队列的时间复杂度:

若共有n个元素,则可在O(logn)的时间内完成上述两种操作

堆的结构如下图:

堆最重要的性质就是儿子的值一定不小于父亲的值,且堆从上到下,从左到右紧密排列。

堆的操作:

当我们希望向堆中插入元素时,堆的内部会进行如下操作(以插入元素3为例):

(1.在堆的末尾插入该值)

(2.不断向上提升该元素,直到满足堆的性质为止)

当我们需要删除堆中的最小值时,堆的内部则进行如下操作

(1.将堆的最后一个节点复制到根节点位置,而后删除最后一个节点)

(2.不断向下交换,直到满足堆的性质为止)

堆的代码实现:

int heap[MAXSIZE],hsize=;

void Push(int x) //向堆中添加元素
{
int i = hsize++; //堆的大小增加
while(i > )
{
int father_id = (i - )/; //父亲节点的编号 if(heap[i] > heap[father_id]) //判断是否满足堆的性质
break; heap[i] = heap[father_id]; //将父亲节点下放,将新增元素上移
i = father_id;
}
heap[i] = x;
} void Pop() //弹出堆中的最小值
{
int root = heap[]; //记录最小值 int x = heap[hsize--]; //堆的大小减少 int i = ; while(i * + < hsize)
{
int lson = i * + ; //左儿子节点
int rsong = lson + ; //右儿子节点 if(lson > x && rson > x) //判断是否满足堆的性质
break; if(heap[lson] < heap[rson]) //选择与儿子交换
{
heap[i] = heap[lson];
i = lson;
}
else if(ron < hsize)
{
heap[i] = heap[rson];
i = rson;
}
} heap[i] = x; return root;
}

 STL中的set:

在C++中,我们可以通过 <set>来实现堆的相关操作,使用set,我们可以方便并且迅速的完成数据检索

常用的set操作:

  1.声明:set<int> s;//声明一个存储int类型数据的堆s

  2.插入元素:s.insert(1);//插入元素1

  3.删除元素:s.erase(1);//删除键值为1的元素

  4.查询元素是否存在:

    1.    ste<int>::iterator it;
         it = s.find(1);
         if(it == s.end())
              printf("No Find\n");
         else
              printf("Find\n");

    2.    if(s.find(1) != 0)
              printf("Find");
         else
              printf("No Find\n");

  5.遍历: ste<int>::iterator it; //按键值从小到大输出

       for(it=s.begin();it!=s.end();it++)
              printf("%d\n",*it);

STL中的优先队列:

在C++中,STL里的priority_queue可以完成优先队列的实现,代码如下

#include<queue>
#include<cstdio>
using namespace std; int date[]; int main()
{
priority_queue<int> Q; //默认为最大值优先
priority_queue<int,vector<int>,greater<int> > Q1; //最小值优先
priority_queue<int,vector<int>,less<int> > Q2; //最大值优先 for(int i=;i<=;i++)
{
scanf("%d",&date[i]);
Q.push(date[i]); //插入元素
} while(!Q.empty())
{
int x = Q.top(); //读取队头元素
Q.pop(); //弹出元素
printf("%d\n",x);
} return ;
}

堆,set,优先队列的更多相关文章

  1. 最小堆实现优先队列:Python实现

    最小堆实现优先队列:Python实现 堆是一种数据结构,因为Heapsort而被提出.除了堆排序,“堆”这种数据结构还可以用于优先队列的实现. 堆首先是一个完全二叉树:它除了最底层之外,树的每一层的都 ...

  2. Java数据结构之堆和优先队列

    概述 在谈堆之前,我们先了解什么是优先队列.我们每天都在排队,银行,医院,购物都得排队.排在队首先处理事情,处理完才能从这个队伍离开,又有新的人来排在队尾.但仅仅这样就能满足我们生活需求吗,明显不能. ...

  3. heap堆&&priority_queue优先队列

    堆(heap)不是stl中的东西...它分为 max heap 和min heap. 但我不想用这些,而是采用了priority_queue,优先队列,定义在queue中.顾名思义,它的作用就是无论怎 ...

  4. 数据结构-堆实现优先队列(java)

    队列的特点是先进先出.通常都把队列比喻成排队买东西,大家都非常守秩序,先排队的人就先买东西. 可是优先队列有所不同,它不遵循先进先出的规则,而是依据队列中元素的优先权,优先权最大的先被取出. 这就非常 ...

  5. [ACM] POJ 1442 Black Box (堆,优先队列)

    Black Box Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7099   Accepted: 2888 Descrip ...

  6. 第6章 堆排序,d叉堆,优先队列

    #include<stdio.h> #include<stdlib.h> #include<string.h> #define leftChild(i) (2*(i ...

  7. Java堆和优先队列

    普通队列:先进先出,后进后出 优先队列:出队顺序和入队顺序无关,和优先级相关. 堆中某个节点的值总是不对于其父节点的值,最大堆. public class Array<E> { priva ...

  8. 《数据结构》C++代码 堆(优先队列)

    堆,是优先队列最常用的一种实现方式.在优先队列中,每个元素都被赋予了一个优先级,而每次出队时都让优先级最高的元素出队.堆,则是一种存储优先队列的方法,特指以一棵树形式存储的优先队列.最常用的是二叉堆, ...

  9. 【最短路】Dijkstra+ 链式前向星+ 堆优化(优先队列)

    Dijkstra+ 链式前向星+ 优先队列   Dijkstra算法 Dijkstra最短路算法,个人理解其本质就是一种广度优先搜索.先将所有点的最短距离Dis[ ]都刷新成∞(涂成黑色),然后从起点 ...

  10. 堆 堆排序 优先队列 图文详解(Golang实现)

    引入 在实际应用中,我们经常需要从一组对象中查找最大值或最小值.当然我们可以每次都先排序,然后再进行查找,但是这种做法效率很低.哪么有没有一种特殊的数据结构,可以高效率的实现我们的需求呢,答案就是堆( ...

随机推荐

  1. MyCP.java蓝墨云班课

    题目要求: 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bin 用来把文本文件(内容 ...

  2. js中uuid不被识别

    后台传了uuid值给前台,然后js报错 原因:反正就是js不认你这个字符串,他觉得你这是应该是数字,但是后面想了想,也不是数字啊,然后就不认了. 解决办法:告诉他,为夫这里是字符串.拼接html的时候 ...

  3. 解决hash冲突的方法

    复制粘贴于:https://www.cnblogs.com/wuchaodzxx/p/7396599.html#H1_2 开放地址法(线性探测法.二次探测.伪随机探测) 再哈希法 链地址法 建立公共溢 ...

  4. Friendly Date Ranges 让日期区间更友好

    把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1). 记住不要显示那些可以被推测出来的信息: 如果 ...

  5. Asp.Net Core中DI的知识总结

    在asp.net core中DI的概念是由这几部分组成的: IServiceCollection,保存IServiceDescriptor实例的列表 IServiceProvider,只有一个方法Ge ...

  6. Django ORM多表操作

    多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对 ...

  7. Ajax设置自定义请求头的两种方法

    用自定义请求头token为例 方法一 $.ajax({ type: "post", url:"http://127.0.0.1:4564/bsky-app/templat ...

  8. Java代理模式之Cglib代理

    Cglib代理,也叫做子类代理.在内存中构建一个子类对象从而实现对目标对象功能的扩展. CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类.不鼓励直接使用ASM,因 ...

  9. 触发器SQL

    CREATE TRIGGER FUEL.HDGJcoaldayexpend1_insertTRIGGER AFTER INSERT ON FUEL.coaldayexpend1 REFERENCING ...

  10. Mint-UI Picker 三级联动

    Mint-UI Picker组件的三级联动 HTML: <mt-picker :slots="slots" value-key="name" @chang ...