1、海量数据top k问题

100亿个数中找出最大的前K个数,我们可以遍历K次找到,但是时间复杂度就很大为 O(KN);因此,我们可以用堆来实现,只需遍历一次,思路如下:

  • 如果要找前K个最大的数,我们用小堆,每次用堆顶元素和遍历的数比,如果堆顶元素小,则让堆顶元素的值等于它,然后向下调整
  • 如果要找前K个最小的数,我们用大堆,每次用堆顶元素和遍历的数比,如果堆顶元素大,则让堆顶元素的值等于它,然后向下调整

2、代码如下

这里我们暂时用有限的几个数模仿海量数据,来判断算法是否正确

TopK.h
#pragma once//堆的操作见其他文章,这里只用到堆的结构体和,大堆小堆函数指针
#include "Heap.h"//TopK
void TopK(Heap *hp, DataType * array, long size, int K);
//初始化堆
void HeapTopKInit(Heap *hp, Compare cmp, int K);
//交换元素
void SwopTopK(DataType *a, DataType *b);
//打印元素
void TopK_Print(Heap *hp, int K);
//向下调整算法
void AdjustDownTopK(Heap  *hp, DataType parent)
//测试
void TestTopK();
TopK.c
#include "TopK.h"//求最小的3个元素
void TopK(Heap *hp, DataType * array, long size, int K)
{for (long i = 0; i < K; i++){InsertHeap(hp, array[i]);AdjustDownTopK(hp, i);}for (long i = K; i < size; i++){if (hp->cmp(array[0],hp->_array[i])){SwopTopK(&hp->_array[0],&array[i]);AdjustDownTopK(hp, 0);}}
}//向下调整
void AdjustDownTopK(Heap  *hp, DataType parent)
{int child = (parent<<1)+1;if (NULL == hp)return;while (child < hp->_size){//找到孩子中较小的一个if ((child+1) < hp->_size && hp->cmp(hp->_array[child+1], hp->_array[child])){child += 1;}//如果双亲大于孩子,则交换if (hp->cmp(hp->_array[child], hp->_array[parent])){Swop(&hp->_array[parent], &hp->_array[child]);parent = child;child = (parent << 1) + 1;}else{break;}}
}void SwopTopK(DataType *a, DataType *b)
{DataType temp = *a;*a = *b;*b = temp;
}void TopK_Print(Heap *hp, int K)
{int i = 0;for (; i < K; i++){printf("%d ", hp->_array[i]);}printf("\n");
}void HeapTopKInit(Heap *hp, Compare cmp, int K)
{if (NULL == hp)return;hp->_array = (DataType*)malloc(sizeof(DataType)* K);hp->_capacity = K;hp->_size = 0;hp->cmp = cmp;
}void TestTopK()
{Heap hp;int array[] = { 53, 17, 78, 9, 45, 65, 87, 23, 31 };int K = 3;HeapTopKInit(&hp, Greater, K);TopK(&hp, array, sizeof(array)/sizeof(array[0]),K);TopK_Print(&hp, K);}

堆的简单应用——TopK相关推荐

  1. 【C】二叉树--顺序结构(详解堆的实现,topK排序、堆排)、和链式结构(链式结构的遍历、链式结构常见递归操作以及练习题)

    本章我们将引入树的概念并详细介绍二叉树.我们会在介绍顺序二叉树基础上,进一步介绍堆以及堆的实现,并以此为依据详解topK排序.堆排等问题:然后我们会介绍链式二叉树的实现以及各种操作.最后,我们也会给出 ...

  2. 堆的向下调整算法、堆的向上调整算法、堆的实现、Topk问题

    目录 一.堆 1.堆的概念 2.堆的性质 3.堆的分类 二.堆的向下调整算法 三.堆的创建 四.堆的向上调整算法 五.堆的实现 1.堆的初始化 2.堆的销毁 3.堆的插入 4.堆的删除 5.获取堆顶的 ...

  3. 堆排序(小根堆)的简单实现(java)

    堆排序是一种树形选择排序方法,它的特点是:在排序过程中,将L[1...n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系,在当前无序区中选择关键字最大(或最小)的 ...

  4. 堆的应用(堆排序,TopK问题)

    堆的应用 1)排序 堆排序 选择排序 既可以找到最大的放在最后 也可以找到最小的方最前 但是,堆排序不能找最小的放在最前 因为把最小数放在最前,会破坏掉堆的原来的顺序,除非重新建堆 1, 2,9,16 ...

  5. 拜托,别再问我什么是堆了!

    前言 堆是生产中非常重要也很实用的一种数据结构,也是面试中比如求 Top K 等问题的非常热门的考点,本文旨在全面介绍堆的基本操作与其在生产中的主要应用,相信大家看了肯定收获满满! 本文将会从以下几个 ...

  6. Topk 问题详解及代码和数据分析

    Topk 问题描述 从海量数据中寻找最大(或最小)的 k 个元素,这类问题被称为 Topk 问题.这个问题无论在实际应用还是面试都会被问到.那我们今天就来看看到底有几种解决方案,以及各个方案的优劣情况 ...

  7. 计算机程序的思维逻辑 (47) - 堆和PriorityQueue的应用

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>(马俊昌著),由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买:京东自营链接 ...

  8. 数据结构与算法之美笔记——基础篇(中):树,二叉树,二叉查找树,平衡二叉查找树,红黑树,递归树,堆

    树: A 节点就是 B 节点的父节点,B 节点是 A 节点的子节点.B.C.D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点.我们把没有父节点的节点叫作根节点,也就是图中的节点 E.我们 ...

  9. 海量数据——TopK问题

    TopK问题是一个经典的海量数据处理问题,比如微博热搜每隔10分钟都会更新出排行前10的热门搜索信息,再或者通过大数据找出一个地区最爱吃的水果等,都可以使用TopK问题来解决,其核心思想就是最小堆的引 ...

最新文章

  1. 2020年,5种将死的编程语言
  2. 使用Wisdom RESTClient如何在Linux和Mac上获取测试报告和API文档?
  3. 想拿高新就必须知道的知识
  4. ARM的cache和写缓冲器(write buffer)
  5. 华为电视测试软件,华为智慧屏电视安装第三方软件,简单实测可行攻略
  6. 固态电池技术取得新突破,充电一分钟续航800公里
  7. 95-20-050-启动器-ServerBootstrap
  8. Spring Cloud 服务治理
  9. 详解CSS的Flex布局
  10. 圣殿骑士的一篇关于WPF的培训好文,WPF应用与团队开发(转)
  11. 裴礼文《数学分析中的典型问题与方法》P61~90
  12. Mstar的Monitor方案笔记(五)——Gamma
  13. 手机测试的主要测试内容
  14. python清除历史记录_只需python两行代码,就能获取你的浏览器历史浏览记录
  15. Apple 公司开发者账号注册
  16. SCSI子系统基础学习笔记 (之UFS子系统) - 2.1UFS子系统初始化之ufs_qcom_probe
  17. [python爬虫]selenium模拟登录京东招聘网,爬取研发类,数据清洗,数据存储,终数据分析和可视化
  18. python文件批量重命名_文件批量重命名的python代码
  19. POI 导入excel文件( 一 )
  20. catv系统主要有哪三部分组成_CATV系统组成包括( )_学小易找答案

热门文章

  1. 中谷教育Python26~29笔记——正则表达式
  2. 博途PLC 1200/1500PLC MODBUS-RTU通讯优化(状态机编程)
  3. zabbix5.0 High swap space usage ( less than 50% free)解决步骤。相关小知识:linux系统mem和swap的关系
  4. python计算ex函数_python – numpy:计算softmax函数的导数
  5. 软件工程专业毕业生的就业前景如何,如何扩展自身的就业空间
  6. python大数快速判断质数与分解质因数
  7. 微信公众平台初级使用教程
  8. 【C语言】厘米换算英尺英寸
  9. DOS第二天 dir
  10. Flutter 项目实战(Dio+MVP+FutureBuilder )五