大小堆C++实现
C++大小堆实现(仿函数)
具体代码如下
#pragma once
#include<iostream>
#include<vector> using namespace std; template<class T>
class Big
{
public:
bool operator()(T x, T y)
{
return x > y;
}
};
template<class T=int>
class Sma
{
public:
bool operator()(T x, T y)
{
return x < y;
}
}; template<class T,class Cmp>
class Heap
{
public:
Heap()
{}
Heap(const T* arr, size_t size)
{
for (int i = ; i < size; ++i)
{
_heap.push_back(arr[i]);
}
int root = (_heap.size() - ) / ;//找到第一个非叶子结点
while (root>=)
//向下调整
AdjustDown(root--);
} void Push(T & t)
{
_heap.push_back(t);
AdjustUp(_heap.size() - );
}
void pop()
{
if (_heap.size() == )
return;
if (_heap.size() <= )
{
swap(_heap[], _heap[_heap.size() - ]);
_heap.pop_back();
}
else
{
swap(_heap[], _heap[_heap.size() - ]);
_heap.pop_back();
AdjustDown();
}
}
bool IsEmpty()const
{
return _heap.size() == ;
}
const T & top() const
{
if (_heap.size() != )
return _heap[];
else
throw exception("this is a bug");
}
protected:
void AdjustDown(int root)
{
//int child = root * 2 + 2 >= _heap.size() ? root * 2 + 1 : Cmp(_heap[root * 2 + 1], _heap[root * 2 + 2]) ? root * 2 + 1 : root * 2 + 2;
while (root <= (_heap.size() - ) / )
{
int child = root * + >= _heap.size() ? root * + : Cmp()(_heap[root * + ], _heap[root * + ]) ? root * + : root * + ;
if (!Cmp()(_heap[root], _heap[child]))
{
swap(_heap[root], _heap[child]);
}
else
{
break;
}
root = child;
}
} void AdjustUp(int child)
{
while (child >= )
{
int root = (child - ) / ;
if (!Cmp()(_heap[root], _heap[child]))
{
swap(_heap[root], _heap[child]);
}
child = root;
}
}
protected:
vector<T> _heap;
}; void test_heap()
{
int arr[] = { , , , , , , , , , };
Heap<int, Sma<int> >hp1(arr, );
int b = ;
hp1.Push(b);
cout << "Over!" << endl;
while (!hp1.IsEmpty())
{
cout << hp1.top() << " ";
hp1.pop();
}
system("pause");
}
大小堆C++实现的更多相关文章
- [剑指offer] 41. 数据流中的中位数 (大小堆,优先队列)
对于海量数据与数据流,用最大堆,最小堆来管理. class Solution { public: /* * 1.定义一个规则:保证左边(大顶堆)和右边(小顶堆)个数相差不大于1,且大顶堆的数值都小于等 ...
- Java实现 LeetCode 786 第 K 个最小的素数分数(大小堆)
786. 第 K 个最小的素数分数 一个已排序好的表 A,其包含 1 和其他一些素数. 当列表中的每一个 p<q 时,我们可以构造一个分数 p/q . 那么第 k 个最小的分数是多少呢? 以整数 ...
- Java实现 LeetCode 630 课程表 III(大小堆)
630. 课程表 III 这里有 n 门不同的在线课程,他们按从 1 到 n 编号.每一门课程有一定的持续上课时间(课程时间)t 以及关闭时间第 d 天.一门课要持续学习 t 天直到第 d 天时要完成 ...
- Java生产环境JVM设置成固定堆大小深层原理
可能很多人都知道Java程序上生产后,运维人员都会设定好JVM的堆大小,而且还是把最大最小设置成一样的值.那究竟是为什么呢?一般而言,Java程序如果你不显示设定该值得话,会自动进行初始化设定. -X ...
- Java堆内存
Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象. 在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ).新生代 ( Yo ...
- 关于栈和堆的定量分析(★firecat推荐★)
文章来源:http://blog.csdn.net/bigbug_zju/article/details/39525281 计算机系统中的堆和栈是跟程序员最密切的两个概念.如果没有栈和堆的概念,下面程 ...
- windows 堆管理
windows堆管理是建立在虚拟内存管理的基础之上的,每个进程都有独立的4GB的虚拟地址空间,其中有2GB的属于用户区,保存的是用户程序的数据和代码,而系统在装载程序时会将这部分内存划分为4个段从低地 ...
- 堆溢出学习笔记(linux)
本文主要是linux下堆的数据结构及堆调试.堆溢出利用的一些基础知识 首先,linux下堆的数据结构如下 /* This struct declaration is misleading (but a ...
- 浅谈Java堆内存分代回收
目录 1.概述 2.堆内存是如何分代的 3.各分代之间是如何配合工作的 1.概述 与C++不同的是, 在Java中我们无需关心对象占用空间的释放, 这主要得益于Java中的垃圾处理器(简称GC)帮助我 ...
随机推荐
- Linux系统——ACL权限控制及特殊权限
ACL权限控制 ACL(access control list),可以提供除属主.属组.其他人的rwx权限之外的细节权限设定 ACL的权限控制 (1)User 使用者 (2)Group 群组 (3)M ...
- Java设计原则—里氏替换原则(转)
里氏替换原则(Liskov Substitution Principel)是解决继承带来的问题. 继承的优点: 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性: 提高代码的重用性: 子类 ...
- jq--ajax中止请求
比如我后端设置延迟3s再响应给前端,我用的是node之koa2 router.get('/vueDemo/getStudents', async ( ctx ) => { //延迟3s asyn ...
- Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2) C Voltage Keepsake
地址:http://codeforces.com/contest/801/problem/C 题目: C. Voltage Keepsake time limit per test 2 seconds ...
- HDU - 4725 The Shortest Path in Nya Graph(拆点+Dijkstra)
题意:N个点,每个点有一个层号L,相邻的两层 Li 与 Li+1 之间的距离为C.另外给出M条无向边,求从点1到点N的最短路. 分析:同一层之间的两点距离并不是0,这是一个小坑.依次把相邻两层的所有点 ...
- $python collections库
collections库是python内置的集合库,本文主要讲解以下5种数据结构的用法: namedtuple 命名元组,是tuple的子类 deque 双向列表 defaultdict 有默认值的字 ...
- Java并发编程:Lock(转)
本文转自:http://www.cnblogs.com/dolphin0520/p/3923167.html Java并发编程:Lock 在上一篇文章中我们讲到了如何使用关键字synchronized ...
- 怎么解决teamviewer检测商业用途无法使用的问题
https://jingyan.baidu.com/article/d5c4b52be51162da560dc517.html
- python3_ftp文件传输
Python中的ftplib模块 Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件 FTP的工作流程及基本操作可参考协议RFC95 ...
- [转]tomcat之一:指定tomcat运行时JDK版本
今天在做项目的时候,主管让我在本机上启动多个tomcat且指定不同的jdk环境.因为在企业的项目中个,对于同一个服务器中有多个jdk和tomcat,所以就需要手动指定不同的jdk. 在网上找了很多资料 ...