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

  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. ModuleNotFoundError: No module named 'redis'

    在安装过Redis后,通过Python程序导入redis时,遇到一个“ModuleNotFoundError: No module named redis”错误,网上查了下原因,解决办法如下: Pyt ...

  2. C#字符串和ASCII码的转换

    //字符转ASCII码: public static int Asc(string character) { if (character.Length == 1) { System.Text.ASCI ...

  3. Windows下的命令神器Cmder

    1. 下载地址: https://cmder.net/ 建议安装完整版本 2.设置与基本使用 1)将cmder添加到环境变量中PATH 2)添加到右键 Cmder.exe /REGISTER ALL ...

  4. CSS3动画效果transition

    1.transition的浏览器支持情况 IE10+支持,IE6\7\8\9都不支持!目前,其他浏览器最新版本都支持,不需要再加前缀 -webkit- 之类的了 2. 还是一步一步说说怎么用trans ...

  5. rabbtimq非持久化测试

    send端代码 import pika,time,threading class send(): def __init__(self,que_nam='hello'): self.credential ...

  6. kafka基本介绍

    kafka基础知识 几个概念 kafka作为一个集群运行在一个或多个服务器上.kafka集群存储的消息是以topic为类别记录的.每个消息(也叫记录record,我习惯叫消息)是由一个key,一个va ...

  7. 【LUOGU???】WD与积木 NTT

    题目大意 把 \(n\) 个有标号物品分到一些有标号的箱子中且不允许为空,问期望箱子的数量. 多组询问. \(n\leq 100000\) 题解 记 \(f_i\) 为 \(i\) 个有标号物品分到一 ...

  8. Vim内直接使用p粘贴系统剪切板

    解决方法 set clipboard=unnamed

  9. Java集合的总结

    参考博客: http://www.jianshu.com/p/63e76826e852 http://www.cnblogs.com/LittleHann/p/3690187.html https:/ ...

  10. 您必须知道的 Git 分支开发规范

    Git 是目前最流行的源代码管理工具. 为规范开发,保持代码提交记录以及 git 分支结构清晰,方便后续维护,现规范 git 的相关操作. 分支管理 分支命名 master 分支 master 为主分 ...