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

  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. Couchbase入门——环境搭建以及HelloWorld

    一.引言 NoSQL(Not Only SQL),火了很久了,一直没空研究.最近手上一个项目对Cache有一定的要求,借此机会对NoSQL入门一下.支持NoSQL的数据库系统有很多,  比如Redis ...

  2. Git使用注意事项

    第一次用git时push时,突然想到我没有设置ssh key,却也可以push代码到自己仓库,那我本地登陆的账号Git是存在哪儿了呢? Git本地账户凭证管理 在第一次push到远程仓库时,git会提 ...

  3. Java的selenium代码随笔(8)

    Selenium截图方法一: Selenium中截图类TakeScreenshout,这个类主要是获取浏览器窗体内的内容,不包括浏览器的菜单和桌面的任务栏区域,我们用百度首页来截图,看看截图效果. F ...

  4. RabbitMQ之安装

    RabbitMQ是一个消息代理.它的核心原理非常简单:接收和发送消息.你可以把它想像成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处.在这个比喻中,RabbitMQ就扮演着邮箱.邮局以 ...

  5. telnet-server、telnet

    1.查询yum仓库中的安装包 [root@localhost /]# yum list |grep telnettelnet.x86_64                              1 ...

  6. python 迭代器、生成器、枚举的使用

    迭代器 器:包含了多个值的容器 迭代:循环反馈(一次从容器中取出一个值) 迭代器:从装有多个值的容器中一次取出一个值给外界 遍历:被遍历的对象必须是有序容器 ls = [1, 2, 3, 4, 5] ...

  7. linux搭建所遇到的坑elasticsearch-6.3.0

    注意: 不能使用主账号(root账号运行,必须使用子账号登录) 第一步安装:: wget https://artifacts.elastic.co/downloads/elasticsearch/el ...

  8. C# 比较多个数组(lambda,匿名比较器)

    //逐个比较,找出最大的那个数组 static void Main(string[] args) { //测试数据 , , }; , , }; , , }; , , }; List<int[]& ...

  9. Xshell连接ubuntu server端的vim(256色彩配置)

    VIM主题(Xshell端) [注]我的配置:Xshell连接VMware Workstation Pro下的Ubuntu 18 server版(要注意这里的server版,好似该版本没有下述的256 ...

  10. 【CF715E】Complete the Permutations 第一类斯特林数

    题目大意 有两个排列 \(p,q\),其中有一些位置是空的. 你要补全这两个排列. 定义 \(s(p,q)\) 为 每次交换 \(p\) 中的两个数,让 \(p=q\) 的最小操作次数. 求 \(s( ...