Top k问题(线性时间选择算法)】的更多相关文章

线性时间选择算法中,最坏情况仍然可以保持O(n). 原因是通过对中位数的中位数的寻找,保证每次分组后,任意一组包含元素的数量不会大于某个值. 普通的Partition最坏情况下,每次只能排除一个元素,所以会造成O(n2)的复杂度. 具体证明可以参考: 王云鹏论文<线性时间选择算法时间复杂度深入研究>…
问题描述:给定n个整数,求其中第k小的数. 分析:显然,对所有的数据进行排序,即很容易找到第k小的数.但是排序的时间复杂度较高,很难达到线性时间,哈希排序可以实现,但是需要另外的辅助空间. 这里我提供了一种方法,可以在O(n)线性时间内解决Top k问题.关于时间复杂度的证明,不再解释,读者可以查阅相关资料.具体的算法描述如下: 算法:LinearSelect(S,k) 输入:数组S[1:n]和正整数k,其中1<=k<=n: 输出:S中第k小的元素 1. If  n<20  Then  …
Top K问题在数据分析中非常普遍的一个问题(在面试中也经常被问到),比如: 从20亿个数字的文本中,找出最大的前100个. 解决Top K问题有两种思路, 最直观:小顶堆(大顶堆 -> 最小100个数): 较高效:Quick Select算法. LeetCode上有一个215. Kth Largest Element in an Array,类似于Top K问题. 1. 堆 小顶堆(min-heap)有个重要的性质--每个结点的值均不大于其左右孩子结点的值,则堆顶元素即为整个堆的最小值.JDk…
程序员编程艺术:第三章续.Top K算法问题的实现 作者:July,zhouzhenren,yansha.     致谢:微软100题实现组,狂想曲创作组.     时间:2011年05月08日     微博:http://weibo.com/julyweibo .     出处:http://blog.csdn.net/v_JULY_v .     wiki:http://tctop.wikispaces.com/. --------------------------------------…
应用场景: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节.        假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个.一个查询串的重复度越高,说明查询它的用户越多,也就是越热门.),请你统计最热门的10个查询串,要求使用的内存不能超过1G. 问题解析: 要统计最热门查询,首先就是要统计每个Query出现的次数,然后根据统计结果,找出Top 10.所以我们可以基于这个思路分两步来设计该算法…
#include <ctime> #include <iostream> using namespace std; template <class Type> void Swap(Type &x,Type &y); inline int Random(int x, int y); template <class Type> void BubbleSort(Type a[],int p,int r); template <class Ty…
Description 给定线性序集中n个元素和一个整数k,n<=2000000,1<=k<=n,要求找出这n个元素中第k小的数. Input 第一行有两个正整数n,k. 接下来是n个整数(0<=ai<=1e9). Output 输出第k小的数 Sample Input 6 3 1 3 5 2 4 6 Sample Output 3 利用快速排序可以找出第k小的,加上随机函数改进一下: #include <cstdio> #include <cstdlib&…
常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中“选择”出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插入的元素放…
简要介绍下快速排序的思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列.时间复杂度为O(nlogn) 一.<data structure and algorithm analysis in c>中的实现,测试过,觉得该说明的已经注释  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18…
BFPRT算法原理 在BFPTR算法中,仅仅是改变了快速排序Partion中的pivot值的选取,在快速排序中,我们始终选择第一个元素或者最后一个元素作为pivot,而在BFPTR算法中,每次选择五分中位数的中位数作为pivot,这样做的目的就是使得划分比较合理,从而避免了最坏情况的发生.算法步骤如下 1. 将  个元素划为  组,每组5个,至多只有一组由  个元素组成. 2. 寻找这  个组中每一个组的中位数,这个过程可以用插入排序. 3. 对步骤2中的  个中位数,重复步骤1和步骤2,递归下…