当前位置: 首页 > news >正文

简单的topK问题

复制代码
/************************************************************************/
/* 
求一组数据中的top(K)问题,这是一个经典的top(K)问题。
分析:
方法一:如果数据量不大,那么最常用的方法就是排序从大大小,然后找出前k个数据。
比较高效率的排序算法,如快排,堆排序等,总体时间复杂度为 O(N*log2(N))+O(K)=O(N*log2(N))
或是直接用部分排序算法,如选择排序,直接找出前K个元素,时间复杂度为O(N*K),
至于O(N*log2(N)) 还是O(N*K)效率高,看K的取值,若K<log2(N)那么部分排序效率高。

方法二:
如果数据量非常大,不能够加载到内存中,这就成了一个海量数据问题。求其中的top(K)
就是我们所求的前K个大的数据。
这样考虑,我们用一个长度为K大小的数组存储前k个数据,然后经过一次扫描数据,每次
扫描一个数据,和数据中最小的数据比较,如果小于这个数据,继续下一个数据扫描,如果
大于这个数据,那么就替换掉数组中最小的那个数据。这样所消耗的时间效率为O(N*K)
进一步,我们可以用容量为K大小的最小堆来存储前K个数据,如果我们新扫描的数据小于堆顶
的数据,那么我们就替换最小堆的堆顶数据,调整最小堆形成新的最小堆。

最小堆可以用一个长为K大小的数组h模拟,对于结点h[i],其中父节点为h[i/2],
儿子节点为:h[2*i+1]和h[2*i+2];

*/
/************************************************************************/

/*
n为要判断的数字,h为最小堆,k为topk 即最小堆维持的大小。
*/
void topK(int n,int *h,int K)
{
    if(n<h[0])return;
    int p = 0;
    int q = 0;
    h[0] = n;
    while(p < K)
    {
        q = 2*p +1;
        if (q >= K) break;
        if (h[p] < h[q] && h[p] < h[q+1])break;
        if (h[2*p+1] > h[2*p+2] ) q++;
        int tem = h[q];
        h[q] = h[p];
        h[p] = tem;
        p = q;

    }
}
复制代码

 







本文转自NewPanderKing51CTO博客,原文链接:http://www.cnblogs.com/newpanderking/p/3952218.html ,如需转载请自行联系原作者



相关文章:

  • 5月第4周安全回顾 永久拒绝服务攻击出现 黑客攻击基础设施
  • JavaScript 七大实用技巧:轻松编程2
  • 用友BQ商业智能平台设计模式——信息域智能查询
  • Oracle隐含参数scn不一至启动
  • 应用虚拟化之规划篇二 项目流程规划
  • centos 安装 jenkins
  • wxPython 笔记(9)向窗体中加入控件
  • 硬链接与软链接
  • linux 文件属性
  • mysql配置文件调优
  • LDAP实现企业异构平台的统一认证
  • 配置rsync源服务器
  • js获取区域坐标
  • 海洋祝福电子贺卡
  • 虚拟局域网(VLAN)和以太网通道
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • Android Studio:GIT提交项目到远程仓库
  • Cumulo 的 ClojureScript 模块已经成型
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • express.js的介绍及使用
  • linux学习笔记
  • MobX
  • mysql中InnoDB引擎中页的概念
  • node-glob通配符
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • 飞驰在Mesos的涡轮引擎上
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 浏览器缓存机制分析
  • 前端js -- this指向总结。
  • 软件开发学习的5大技巧,你知道吗?
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • # include “ “ 和 # include < >两者的区别
  • (4) PIVOT 和 UPIVOT 的使用
  • (c语言)strcpy函数用法
  • (八)Spring源码解析:Spring MVC
  • (七)Java对象在Hibernate持久化层的状态
  • (生成器)yield与(迭代器)generator
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .gitignore文件_Git:.gitignore
  • .naturalWidth 和naturalHeight属性,
  • .net 7 上传文件踩坑
  • .NET Core 2.1路线图
  • .Net Core 中间件验签
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 的程序集加载上下文
  • .net连接MySQL的方法
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • @angular/cli项目构建--http(2)
  • @javax.ws.rs Webservice注解
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [100天算法】-不同路径 III(day 73)