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

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

节点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. 常用IDEA快捷键

    [转]常用IDEA快捷键 阿烈的博客 2013-06-29 72 阅读   最近已经从eclipse转到IntelliJ IDEA,IDEA用起来太顺手了,许多功能正合我意. 看到时光印记写的一篇&l ...

  2. java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted()Z 的解决

    jetty 9 嵌入式开发时,启动正常,但是页面一浏览就报错如下: java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest ...

  3. Linux命令 -- 查看系统版本的各种方法

    适用于CentOS

  4. JQuery中Ajax的操作

    JQuery   Ajax异步操作的方式: $.ajax,$.post, $.get, $.getJSON. 一, $.ajax,这个是JQuery对ajax封装的最基础步,通过使用这个函数可以完成异 ...

  5. 上网八个常用cmd命令你掌握了几个?

                   上网八个常用cmd命令你掌握了几个? 一.ping 它是用来检查网络是否通畅或者网络连接速度的命令.作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握 ...

  6. c# 备份数据库恢复数据库

    /// <summary> /// 对数据库的备份和恢复操作,Sql语句实现 /// </summary> /// <param name="cmdText&q ...

  7. Freemarker判断是否为空

    1.判断对象是否为空 freemarker中显示某对象使用${name}. 但如果name为null,freemarker就会报错.如果需要判断对象是否为空: <#if name??> - ...

  8. Java的多线程机制系列:(二)缓存一致性和CAS

    一.总线锁定和缓存一致性 这是两个操作系统层面的概念.随着多核时代的到来,并发操作已经成了很正常的现象,操作系统必须要有一些机制和原语,以保证某些基本操作的原子性.首先处理器需要保证读一个字节或写一个 ...

  9. BZOJ 1968: [Ahoi2005]COMMON 约数研究

    1968: [Ahoi2005]COMMON 约数研究 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 2032  Solved: 1537[Submit] ...

  10. [Think In Java]基础拾遗1 - 对象初始化、垃圾回收器、继承、组合、代理、接口、抽象类

    目录 第一章 对象导论第二章 一切都是对象第三章 操作符第四章 控制执行流程第五章 初始化与清理第六章 访问权限控制第七章 复用类第九章 接口 第一章 对象导论 1. 对象的数据位于何处? 有两种方式 ...