数据结构--堆
来源:互联网 发布:古川雄辉 知乎 编辑:程序博客网 时间:2024/05/14 20:25
堆:
小根堆,根节点小于孩子节点,向堆中插入元素,首先插入到末尾,之后在不断的提升自己。
左孩子的编号 = 自己编号*2+1;
右孩子的编号 = 自己编号*2+2;
在堆中删除最小值的时候,首先将最后一个节点的数值复制到根节点上去,并且删除最后一个节点,然后不断向下交换直到没有大小颠倒为止,如果存在孩子,选择数值较小的孩子进行交换。
实现:通过数组表示编号:
#include <iostream>using namespace std;const int MAX = 100;int heap[MAX];int a[MAX];int n;int sz = 0;void push(int x){ int i = sz++; while(i>0){ int p = (i-1)/2; if(heap[p]<=x) break;//符合堆的性质 heap[i] = heap[p]; //把父节点的数值放下,把自己提上去 i = p; } heap[i] = x;}int pop(){ int min = heap[0]; //最后节点提到根节点 int x = heap[--sz]; int i=0; while(i*2+1<sz){ int a = i*2+1,b=i*2+2;//左右孩子 if(heap[a]>heap[b] && b<sz)a = b; if(heap[a]>x) break; //大小颠倒 heap[i] = heap[a]; i = a; } heap[i] = x; return min;}int main(){ cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; push(a[i]); } for(int i=0;i<n;i++) cout<<heap[i]<<" "; cout<<endl; cout<< pop(); cout<<endl; cout<<pop(); return 0;}在STL里面,使用优先队列来描述堆的情况,区别在于队首出来的是最大值。
例子:加油站问题
输入:
N 加油站个数,L:路段总长度 P初始汽车油量 A每个加油站位置到初始地点的距离, B代表每个加油站加油之后可以跑的距离,若最终可以到达目的地,输出至少加油的次数,否则输出-1.
#include <iostream>#include <queue>using namespace std;const int MAX = 100;int N,L,P;int A[MAX],B[MAX];void slove(){ A[N] = L; B[N] = 0; N++; priority_queue<int> que; int ans=0,pos=0,tank = P; for(int i=0;i<N;i++){ int dis = A[i]-pos; while(tank < dis){ if(que.empty()){ cout<<"-1"<<endl; return; } tank += que.top(); que.pop(); ans++; } tank -= dis; pos = A[i]; que.push(B[i]); } cout<<ans<<endl;}int main(){ cin>>N>>L>>P; for(int i=0;i<N;i++) cin>>A[i]>>B[i]; slove(); return 0;}
输入:
N=4 L=25 P=10
A={10 14 20 21}
B={10 5 2 4}
输出:2
0 0
- 数据结构:堆
- 数据结构-堆
- 堆数据结构
- 堆数据结构
- 数据结构:堆
- 数据结构-堆
- 数据结构-堆
- 数据结构 堆
- 数据结构--堆
- 数据结构:堆
- 数据结构:堆
- 数据结构--堆
- 堆数据结构
- 数据结构- 堆
- 数据结构:堆
- 【数据结构】堆
- 数据结构--堆
- 数据结构-堆
- git提交错误警示
- DirectX11学习笔记
- 目录取消svn版本控制
- php 获得某个目录下所有的文件名
- Remove Nth Node From End of List,Longest Common Prefix,Palindrome Number,Roman to Integer
- 数据结构--堆
- makefile模板
- 事件响应链
- 使用Amoeba for mysql实现mysql读写分离
- 基于HTML5的网络拓扑图
- 数组Fibonacci Microsoft Visual Studio 运行 C语言写
- Java mina TcpCommunicationHandler extends IoHandlerAdapter
- 函数返回值类型
- 你不懂之--驻极体麦克风简介