TOP K问题的若干实现
问题描述:在长度为n的序列中,找出其最大的K个数
1.冒泡排序
每冒泡一次,可将最大的数放到序列尾部,冒泡K次即可。
时间复杂度:O(K*n)
空间复杂度:O(1)
2.扫描数组,将最大的N个数存在缓存中,当有更大的数到来时替换缓存中的数
TOP_K(A,K)
n = length of A
create array T[K] = {-∞}
t = for i = , n-
do
if T[K-] < A[i] then
INSERT A[i] TO SORTED ARRAY T[]
时间复杂度:O(n*K)
空间复杂度:O(K)
可以考虑用最小堆代替缓存数组存储最大的K个数,这样当A[i] 大于堆顶元素时,使用A[i]代替堆顶元素,然后调整堆,复杂度为 O(n*lgK)
3.堆排序,优先级队列
构造一个堆,从堆顶取出N个元素
时间复杂度: O(n+K*lgn)
空间复杂度: O(1)
4.用选择法找出第K个元素,然后对前K个元素进行排序
FIND_K( A ,K)
n = length of A
i = random index of n
swap A[i] A[n-] a =
b = n-
while true
while A[a] <= A[n-]
a++
while A[b] >= A[n-]
b++
if a>= b then break
swap A[a] A[b]
swap A[b] A[n-] if b == K then return b
else if b > K then return FIND_K(A[:b],K)
else return FIND_K(A[b:n],K-b) TOP_K(A,K)
p = FIND_K(A,K)
sort(A,,p)
FIND_K的时间复杂度为O(n),则TOP_K的时间复杂度为 O(n + K*lgK)
TOP K问题的若干实现的更多相关文章
- 海量数据中找top K专题
1. 10亿个数中找出最大的1000个数 这种题目就是分治+堆排序. 为啥分治?因为数太多了,全部加载进内存不够用,所以分配到多台机器中,或者多个文件中,但具体分成多少份,视情况而定,只要保证满足内存 ...
- top(k,n)—db kernel队解题思路
0. 比赛 公司里的第三届XX中间件性能挑战赛 我和另外两个P5组队参加,队名为"db kernel".最后获得了第八,应该是P5里的最高排名. 以下简单扼要地介绍一下题目,以及我 ...
- [LeetCode] Top K Frequent Elements 前K个高频元素
Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...
- Leetcode 347. Top K Frequent Elements
Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...
- 大数据热点问题TOP K
1单节点上的topK (1)批量数据 数据结构:HashMap, PriorityQueue 步骤:(1)数据预处理:遍历整个数据集,hash表记录词频 (2)构建最小堆:最小堆只存k个数据. 时间复 ...
- LeetCode "Top K Frequent Elements"
A typical solution is heap based - "top K". Complexity is O(nlgk). typedef pair<int, un ...
- [IR] Ranking - top k
PageRanking 通过: Input degree of link "Flow" model - 流量判断喜好度 传统的方式又是什么呢? Every term在某个doc中的 ...
- 347. Top K Frequent Elements
Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...
- 面试题:m个长度为n的ordered array,求top k 个 数字
package com.sinaWeibo.interview; import java.util.Comparator; import java.util.Iterator; import java ...
随机推荐
- React Native Could not expand ZIP
Execution failed for task ':app:prepareSrolkReactNativeFilePickerUnspecifiedLibrary'. Could not expa ...
- yum安装mysql后root用户的临时密码
1.查看root用户临时随机密码 yum 安装mysql后,无法通过空密码登录数据库,如下: [root@ mysql]# mysql -u root -p Enter password: ERROR ...
- UVA 725 UVA 10976 简单枚举
UVA 725 题意:0~9十个数组成两个5位数(或0开头的四位数),要求两数之商等于输入的数据n.abcde/fghij=n. 思路:暴力枚举,枚举fghij的情况算出abcde判断是否符合题目条件 ...
- maven说明
1.maven 仓库地址 http://mvnrepository.com/ 2.maven jar包搜索地址 http://search.maven.org/ 3. 点开上面的 版本链接,就可以看到 ...
- 使用VBS打开程序和关闭程序
下面这个是先执行程序后,然后再结束程序. Dim Wsh Set Wsh = WScript.CreateObject("WScript.Shell") '下行是设置延时启动时间 ...
- oracle数据库插入优化
通过程序要把1000万的数据插入到数据表中,刚开始每100条数据耗时50ms左右,但是越往后越慢,最慢到了十几秒的都有,真实好坑了. 于是在网上百度了一波,如何进行insert优化.倒是有了一点小小的 ...
- java8 日期处理
这两周写业务逻辑,总会有各种日期操作,但是又记不住API,就是记不住API啊 这篇博客不错,记下来 https://lw900925.github.io/java/java8-newtime-api. ...
- pyCharm上解决安装不上pandas库问题
最近在PyCharm上安装pandas库的时候,总是安装不上,提示好像是pip除了错误.我使用的是python .4版本.最后判断应该是自己pip版本应该太旧了,最后再cmd更新了pip之后就行了.如 ...
- Strust2遇到的问题
前端发一次请求,后台执行execute方法多次,最后发现Acion类继承ActionSupport类,且覆盖了execute,当用户数量一上来就会出现执行多次的BUG,所以千万要注意不能给此方法加An ...
- 关于linux 编程
emacs 编辑器 gcc/g++ 编译器 gdb 调试工具 valgrind 内存泄露检查 doxygen 文档组织工具