堆:实质是一颗完全二叉树,最大堆的特点:父节点值均大于子节点;最小堆的父节点值均小于子节点;

一般使用连续内存存储堆内的值,因而可以根据当前节点的索引值推断子节点的索引值:

节点i的父节点为(i-1)/2;

节点j的左子结点:j * 2 + 1;

节点j的右子结点:j * 2 + 2;

以下代码实现了最大堆最小堆,当比较函数使用std::greater,得到最大堆,当比较函数使用std::less得到最小堆;

代码及测试用例如下:

 //最大最小堆
//MaxMinHeap.h #pragma once
#include <assert.h> using namespace std; template <typename T>
void mswap(T &a, T &b)
{
T tmp = a;
a = b;
b = tmp;
} template <typename T,typename Compare = std::less<T>>
class MaxMinHeap
{
public:
int hSize ; //堆空间
int hCurNum;//堆内已占用空间
T *data; private:
Compare comp;//比较函数
public:
MaxMinHeap(int size)
{
hSize = size;
assert(hSize>);
data = new T[hSize];
hCurNum = ;
};
~MaxMinHeap(void)
{
if(data!=NULL)
delete []data;
}; void headAdd(T num)
{
if (hCurNum==hSize)
{
if (comp(num,data[]))//greater 大顶堆 保留最小的K个数;less 小顶堆 保留最大的K个数
return;
data[]=num;
HeapFixDown(,hCurNum);
}
else
{
data[hCurNum++]=num;
HeapFixUp(hCurNum-);
}
};
//最大堆排序后得到升序序列;最小堆排序后得到降序序列
void sort()
{
for (int i=hCurNum-; i >= ; --i)
{
mswap(data[i],data[]);
HeapFixDown(,i);
}
} void GetHnum(T &n)//获取最大堆的最小值或者最小堆的最大值
{
n = data[];
};
void HeapFixUp(int index)
{
assert (index < hCurNum);
T tmp=data[index];
int j = (index - )/;//父节点
while(j>= && index !=)
{
if(comp(data[j],tmp))
break;
data[index]=data[j];
index = j;
j = (index - )/;
}
data[index]=tmp;
}; //从节点index开始进行向下调整
void HeapFixDown(int index, int n)
{
assert(index<hCurNum);
assert(n<hCurNum); T tmp=data[index];
int j = index*+;
while(j<n)
{
if(j+ < n && comp(data[j+],data[j]))//大顶堆中左右孩子找最大的,小顶堆左右孩子找最小的
++j;
if(comp(tmp,data[j]))
break;
data[index]=data[j];
index = j;
j = index*+;
}
data[index]=tmp;
};
}; #include <functional>
#include <iostream>
#include "MaxMinHeap.h " using namespace std; int main(int argc , char ** argv)
{
MaxMinHeap<float,greater<float>> test(); for (int i = ;i < ; ++i)
{
test.headAdd(-i*+);
}
for (int i = ; i < ; ++i)
{
cout<<test.data[i]<<endl;
}
test.sort();
for (int i = ; i < ; ++i)
{
cout<<test.data[i]<<" ";
}
cout<<endl;
return ;
}

最大堆 最小堆 解决TOPK问题的更多相关文章

  1. Java最小堆解决TopK问题

    TopK问题是指从大量数据(源数据)中获取最大(或最小)的K个数据. TopK问题是个很常见的问题:例如学校要从全校学生中找到成绩最高的500名学生,再例如某搜索引擎要统计每天的100条搜索次数最多的 ...

  2. scala写算法-用小根堆解决topK

    topK问题是指从大量数据中获取最大(或最小)的k个数,比如从全校学生中寻找成绩最高的500名学生等等. 本问题可采用小根堆解决.思路是先把源数据中的前k个数放入堆中,然后构建堆,使其保持堆序(可以简 ...

  3. Black Box--[优先队列 、最大堆最小堆的应用]

    Description Our Black Box represents a primitive database. It can save an integer array and has a sp ...

  4. HDU 1425 sort(堆排序/快排/最大堆/最小堆)

    传送门 Description 给你n个整数,请按从大到小的顺序输出其中前m大的数. Input 每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不 ...

  5. PAT-1147(Heaps)最大堆和最小堆的判断+构建树

    Heaps PAT-1147 #include<iostream> #include<cstring> #include<string> #include<a ...

  6. c++/java/python priority_que实现最大堆和最小堆

    #include<iostream>#include<vector>#include<math.h>#include<string>#include&l ...

  7. Google 面试题:Java实现用最大堆和最小堆查找中位数 Find median with min heap and max heap in Java

    Google面试题 股市上一个股票的价格从开市开始是不停的变化的,需要开发一个系统,给定一个股票,它能实时显示从开市到当前时间的这个股票的价格的中位数(中值). SOLUTION 1: 1.维持两个h ...

  8. C++ multiset通过greater、less指定排序方式,实现最大堆、最小堆功能

    STL中的set和multiset基于红黑树实现,默认排序为从小到大. 定义三个multiset实例,进行测试: multiset<int, greater<int>> gre ...

  9. 502. IPO(最小堆+最大堆法 or 排序法)

    题目: 链接:https://leetcode-cn.com/problems/ipo/submissions/ 假设 力扣(LeetCode)即将开始其 IPO.为了以更高的价格将股票卖给风险投资公 ...

随机推荐

  1. CF380C. Sereja and Brackets[线段树 区间合并]

    C. Sereja and Brackets time limit per test 1 second memory limit per test 256 megabytes input standa ...

  2. java 多线程之wait(),notify,notifyAll(),yield()

    wait(),notify(),notifyAll()不属于Thread类,而是属于Object基础类,也就是说每个对像都有wait(),notify(),notifyAll()的功能.因为都个对像都 ...

  3. git放弃本地修改 强制更新

    git fetch --all git reset --hard origin/mastergit fetch 只是下载远程的库的内容,不做任何的合并 git reset 把HEAD指向刚刚下载的最新 ...

  4. insert、update select from

    1.insert select from <一棵树-博客园> 收集整理,转载请注明出处! 使用SELECT INTO 和 INSERT INTO SELECT 表复制语句了. 1.INSE ...

  5. Linux服务器高并发实践经历

    作为一个师父离职早的野生程序员,业务方面还可以达到忽悠别人的水平,但上升到性能层面那就是硬伤. 真实天上掉馅饼,公司分配了一个测试性能的任务,真是感觉我的天空星星都亮了. 高并发主要限制因素:CPU. ...

  6. Angular快速入门篇

    简介 AngularJS 是一个为动态WEB应用设计的结构框架,提供给大家一种新的开发应用方式,这种方式可以让你扩展HTML的语法,以弥补在构建动态WEB应用时静态文本的不足,从而在web应用程序中使 ...

  7. C#基础系列——反射笔记

    前言:使用反射也有几年了,但是一直觉得,反这个概念很抽象,今天有时间就来总结下这个知识点. 1.为什么需要反射: 最初使用反射的时候,作为小菜总是不理解,既然可以通过new 一个对象的方式得到对象,然 ...

  8. 读深入了解c++内核对象模型小结(1/3/4)

    之前早就听说这本书不错,如果想对c++进一步的了解可以看看,此书是进阶阶段参考,笔者自己看了书的第一.三.四章节,后面会继续.      第一章讲了c++的对象模型的引入,各种模型的对比和现在c++采 ...

  9. C# double 四舍五入

    public static double Round(object data) { if (data == null || data == System.DBNull.Value) { return ...

  10. PRINCE2第二个原则

    PRINCE2要求项目团队吸取以前的经验教训,在项目生命周期中发现.记录和应对.吸取经验教训,应该记录在整个生命周期中,项目准备期应该回顾以往类似项目,看看是否有经验教训可以应用,如果项目是第一次做, ...