简单的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[])return;
int p = ;
int q = ;
h[] = n;
while(p < K)
{
q = *p +;
if (q >= K) break;
if (h[p] < h[q] && h[p] < h[q+])break;
if (h[*p+] > h[*p+] ) q++;
int tem = h[q];
h[q] = h[p];
h[p] = tem;
p = q; }
}
简单的topK问题的更多相关文章
- 计算机程序的思维逻辑 (47) - 堆和PriorityQueue的应用
45节介绍了堆的概念和算法,上节介绍了Java中堆的实现类PriorityQueue,PriorityQueue除了用作优先级队列,还可以用来解决一些别的问题,45节提到了如下两个应用: 求前K个最大 ...
- Java编程的逻辑 (47) - 堆和PriorityQueue的应用
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- Topk引发的一些简单的思考
软件工程课程的一个题目:写一个程序,分析一个文本文件中各个词出现的频率,并且把频率最高的10个词打印出来.文本文件大约是30KB~300KB大小. 首先说一下这边的具体的实现都是在linux上实现的. ...
- TopK的一个简单实现
转自:http://rangerwolf.iteye.com/blog/2119096 题外话: <Hadoop in Action> 是一本非常不错的交Hadoop的入门书,而且建议看英 ...
- 关于堆排序和topK算法的PHP实现
问题描述 topK算法,简而言之,就是求n个数据里的前m大个数据,一般而言,m<<n,也就是说,n可能有几千万,而m只是10或者20这样的两位数. 思路 最简单的思路,当然是使用要先对这n ...
- InAction-MR的topK
本来只是想拿搜狗的数据练练手的,却无意踏足MR的topK问题.经过几番波折,虽然现在看起来很简单,但是摸爬滚打中也学到了不少 数据是搜狗实验室下的搜索日志,格式大概为: 00:00:00 298219 ...
- Python使用heapq实现小顶堆(TopK大)、大顶堆(BtmK小)
Python使用heapq实现小顶堆(TopK大).大顶堆(BtmK小) | 四号程序员 Python使用heapq实现小顶堆(TopK大).大顶堆(BtmK小) 4 Replies 需1求:给出N长 ...
- Mapreduce TopK
思想比较简单,就是每个通过map来获取当前的数据块中的的topk个数据,然后将他们以相同的key值放到reduce中,最后通过reduce来对这n*k个数据排序并获得topk个数据.具体的就是建立 ...
- scala写算法-用小根堆解决topK
topK问题是指从大量数据中获取最大(或最小)的k个数,比如从全校学生中寻找成绩最高的500名学生等等. 本问题可采用小根堆解决.思路是先把源数据中的前k个数放入堆中,然后构建堆,使其保持堆序(可以简 ...
随机推荐
- 【LeetCode】163. Missing Range
Difficulty: Medium More:[目录]LeetCode Java实现 Description Given a sorted integer array where the rang ...
- 求链表的倒数第m个元素
法一: 首先遍历一遍单链表,求出整个单链表的长度n,然后将倒数第m个,转换为正数第n-m+1个,接下去遍历一次就可以得到结果. 不过这种方法需要对链表进行两次遍历,第一次遍历用于求解单链表的长度,第二 ...
- js获取按键
event.altKey.event.ctrlKey.event.shiftKey 属性 属性为true表示事件发生时Alt.Ctrl.Shift键被按下并保持,为false则Alt.Ctrl.Shi ...
- POJ 3903 Stock Exchange 【最长上升子序列】模板题
<题目链接> 题目大意: 裸的DP最长上升子序列,给你一段序列,求其最长上升子序列的长度,n^2的dp朴素算法过不了,这里用的是nlogn的算法,用了二分查找. O(nlogn)算法 #i ...
- 50 tips of JavaScript,这些坑你都知道吗?
1.在局部作用域中,使用var操作符定义的变量将成为定义该变量的作用域中的局部变量,省略var的会创建全局变量:在全局作用域中,不管是否使用var操作符定义的变量都会创建一个全局变量.但是,在全局作用 ...
- BZOJ 4552 [Tjoi2016&Heoi2016]排序 线段树的分裂和合并
https://www.lydsy.com/JudgeOnline/problem.php?id=4552 https://blog.csdn.net/zawedx/article/details/5 ...
- BZOJ.4319.[cerc2008]Suffix reconstruction(后缀数组 构造 贪心)
题目链接 \(Description\) 给定SA数组,求满足SA[]的一个原字符串(每个字符为小写字母),无解输出-1. \(Solution\) 假设我们现在有suf(SA[j]),要构造suf( ...
- Java并发程序设计(十三)锁的性能优化
锁的性能优化 一.优化注意事件 一)减少锁的持有时间 只在必要时进行同步,能明显减少锁的持有时间. 二)锁的细化 缺陷:当系统需要全局锁时,其消耗的资源会比较多. 三)锁的分离 比如读写分离锁 四)锁 ...
- 数码管应用digital_pile
#include "reg52.h" #include "digital_pile.h" void main(){ //P0 = 0x00; //P2 = 0x ...
- python 反射的用法
class Foo(): def __init__(self,name): self.name=name def text(self): f=Foo() ''' hasattr(obj,name) 判 ...