博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最大堆 最小堆 解决TOPK问题
阅读量:4281 次
发布时间:2019-05-27

本文共 1992 字,大约阅读时间需要 6 分钟。

堆:实质是一颗完全二叉树,最大堆的特点:父节点值均大于子节点;最小堆的父节点值均小于子节点;一般使用连续内存存储堆内的值,因而可以根据当前节点的索引值推断子节点的索引值:节点i的父节点为(i-1)/2;节点j的左子结点:j * 2 + 1;节点j的右子结点:j * 2 + 2;以下代码实现了最大堆最小堆,当比较函数使用std::greater,得到最大堆,当比较函数使用std::less得到最小堆;
关键是考虑清楚小顶堆用于找最大,大顶推用于找最小,其他都简单。大最小堆//MaxMinHeap.h#pragma once#include 
using namespace std;template
void mswap(T &a, T &b){ T tmp = a; a = b; b = tmp;}template
>class MaxMinHeap{public: int hSize ; //堆空间 int hCurNum;//堆内已占用空间 T *data;private: Compare comp;//比较函数public: MaxMinHeap(int size) { hSize = size; assert(hSize>0); data = new T[hSize]; hCurNum = 0; }; ~MaxMinHeap(void) { if(data!=NULL) delete []data; }; void headAdd(T num) { if (hCurNum==hSize) { if (comp(num,data[0]))//greater 大顶堆 保留最小的K个数;less 小顶堆 保留最大的K个数 return; data[0]=num; HeapFixDown(0,hCurNum); } else { data[hCurNum++]=num; HeapFixUp(hCurNum-1); } }; //最大堆排序后得到升序序列;最小堆排序后得到降序序列 void sort() { for (int i=hCurNum-1; i >=1 ; --i) { mswap(data[i],data[0]); HeapFixDown(0,i); } } void GetHnum(T &n)//获取最大堆的最小值或者最小堆的最大值 { n = data[0]; }; void HeapFixUp(int index) { assert (index < hCurNum); T tmp=data[index]; int j = (index - 1)/2;//父节点 while(j>=0 && index !=0) { if(comp(data[j],tmp)) break; data[index]=data[j]; index = j; j = (index - 1)/2; } data[index]=tmp; }; //从节点index开始进行向下调整 void HeapFixDown(int index, int n) { assert(index
#include
#include "MaxMinHeap.h "using namespace std;int main(int argc , char ** argv){ MaxMinHeap
> test(20); for (int i = 0 ;i < 20; ++i) { test.headAdd(-i*2+38); } for (int i = 0 ; i < 20 ; ++i) { cout<
<

转载地址:http://mtfgi.baihongyu.com/

你可能感兴趣的文章
四旋翼飞行器Quadrotor飞控之 PID调节(参考APM程序)
查看>>
最流行的开源飞控项目ArduPilot Mega(APM)介绍及发展历史
查看>>
利用加速度求解位置的算法——三轴传感器
查看>>
基于STM32的开源微型四轴飞行器
查看>>
Crazyflie微型四轴 深入解读1
查看>>
Crazyflie微型四轴 深入解读2
查看>>
四旋翼微型飞行器设计
查看>>
android如何改变系统默认横竖屏方向
查看>>
普通gpio口的申请和设置
查看>>
在kernel里添加一个i2c外围设备
查看>>
android lcd调试 高通平台lcd调试深入分析总结(mipi和rgb接口)
查看>>
高通平台开机logo连续显示调试总结
查看>>
Android display架构分析
查看>>
高通安卓调试LCD几方面总结(一)
查看>>
高通安卓调试LCD几方面总结(二)
查看>>
高通平台 lcd driver 调试小结
查看>>
开机logo切换逻辑深入研究
查看>>
高通平台手机开发之LCD
查看>>
高通平台修改LK(bootloader)开机logo
查看>>
lk启动流程详细分析
查看>>