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

  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. 毕业设计5:基于MicroPython的智能火灾报警器系统的设计与实现

    随着现代家庭用火.用电量的增加,家庭火灾发生的频率越来越高.家里一旦发生火灾,如果出现扑救不及时.灭火器材缺乏.以及在场人惊慌失措.逃生迟缓等不利情况下,最终就会导致产生重大的生命财产的损失. 消防部 ...

  2. 【alpha阶段】第九次Scrum Meeting

    每日任务内容 队员 昨日完成任务 明日要完成的任务 牛宇航 #26 评价总览接口编写https://github.com/rRetr0Git/rateMyCourse/issues/26 #26 评价 ...

  3. Flask自定义转换器,实现路由匹配正则表达式参数

    Flask框架动态路由实现参数传递和Django框架有类似之处,但是相比于Django框架,Flask实现复杂的参数就需要自己自定义转换器来实现了,而不能向Django那样直接使用正则表达式 # 路由 ...

  4. mysql创建函数之省市区数据查询

    DROP FUNCTION IF EXISTS queryChildrenAreaInfo;CREATE FUNCTION queryChildrenAreaInfo(areaId varchar(2 ...

  5. git submoudle提交

    进入到各个submoudle文件夹 git status 查看所在branch和文件修改状态 git add [files]; git commit "" git pull ori ...

  6. AI佳作解读系列(四)——数据增强篇

    前言 在深度学习的应用过程中,数据的重要性不言而喻.继上篇介绍了数据合成(个人认为其在某种程度上可被看成一种数据增强方法)这个主题后,本篇聚焦于数据增强来介绍几篇杰作! (1)NanoNets : H ...

  7. 能ping通虚拟机中的Ubuntu,使用XShell连不上

    1.在宿主机上telnet 虚拟机ip  22如果显示端口无法接通,说明你的/etc/init.d/sshd 是stop或者是异常的. 2.如果没有sshd服务,使用" sudo apt-g ...

  8. MySQL性能优化神器—explain

    一.explain是什么? 简单来讲就是官方给的一个优化工具,直接在你的SQL语句前加上explain,执行整条语句,之后你就可以根据执行结果优化你的SQL啦,废话不多说,直接刚实例 测试实例 1.创 ...

  9. 深入了解servlet

    一.web项目结构 |- WebRoot :   web应用的根目录 |- 静态资源(html+css+js+image+vedio)                             |- W ...

  10. Oracle 12c 静默安装(脚本自动化)

    oracle 12C 自动化静默安装脚本 项目地址: github: https://github.com/spdir/oracle-single-install 下载安装脚本 wget https: ...