topN问题
topN问题:给出一个数组,找出前N个最大的元素。
topN问题可以用分治法解决,这个问题与快速排序类似,快速排序是用一个数对数组进行划分,topN问题则不需完成排序,只需划分出前n个最大的数字即可。所以可以采用快排中partition函数的操作,将每次操作的返回值与N作对比,若比N小则对N及其后续的元素继续进行划分,若比N大则对N及其之前的元素进行划分,直到找出N。
该方法的时间复杂度:Θ(n)
示例代码:
import random def partition(a,i,j):
if i < j:
key = random.randint(i,j)
tmp = a[key]
a[key] = a[j]
a[j] = tmp
k = i-1
for index in range(i,j):
if a[index] > a[j]:
k += 1
tmp = a[k]
a[k] = a[index]
a[index] = tmp
else:
k += 1
tmp = a[k]
a[k] = a[j]
a[j] = tmp
#此处与快排不同,当欲划分的数组元素皆相同时会导致栈溢出,所以当元素相同时
#返回一个随机下标
if a[i] == a[j]:
return random.randint(i,j)
return k
return i def find_top_n(a,i,j,top_index):
top_ret = partition(a,i,j)
#当返回值比top_index小时,对top_ret及后续元素继续进行划分
if top_ret < top_index:
return find_top_n(a,top_ret,j,top_index)
#当返回值比top_index大时,对top_ret及先前元素继续进行划分
elif top_ret > top_index:
return find_top_n(a,i,top_ret,top_index)
#当返回值等于top_index时,已找到TopN
else:
return top_ret def main(args):
a = []
for i in range(10):
a.append(random.randint(0,100))
print(a)
find_top_n(a,0,len(a)-1,5)
print(a)
return 0 if __name__ == '__main__':
import sys
sys.exit(main(sys.argv))
topN问题的更多相关文章
- storm入门(二):关于storm中某一段时间内topN的计算入门
刚刚接触storm 对于滑动窗口的topN复杂模型有一些不理解,通过阅读其他的博客发现有两篇关于topN的非滑动窗口的介绍.然后转载过来. 下面是第一种: Storm的另一种常见模式是对流式数据进行所 ...
- 【mysql】一维数据TopN的趋势图
创建数据表语句 数据表数据 对上述数据进行TopN排名 select severity,sum(count) as sum from widgt_23 where insertTstamp>=' ...
- 【转载】使用LFM(Latent factor model)隐语义模型进行Top-N推荐
最近在拜读项亮博士的<推荐系统实践>,系统的学习一下推荐系统的相关知识.今天学习了其中的隐语义模型在Top-N推荐中的应用,在此做一个总结. 隐语义模型LFM和LSI,LDA,Topic ...
- QL查询案例:取得分组 TOP-N
[转]SQL查询案例:取得分组 TOP-N CREATE TABLE TopnTest ( name VARCHAR(10), --姓名 procDate DATETIME, ...
- 使用LFM(Latent factor model)隐语义模型进行Top-N推荐
最近在拜读项亮博士的<推荐系统实践>,系统的学习一下推荐系统的相关知识.今天学习了其中的隐语义模型在Top-N推荐中的应用,在此做一个总结. 隐语义模型LFM和LSI,LDA,Topic ...
- 大数据算法设计模式(1) - topN spark实现
topN算法,spark实现 package com.kangaroo.studio.algorithms.topn; import org.apache.spark.api.java.JavaPai ...
- topN 算法 以及 逆算法(随笔)
topN 算法 以及 逆算法(随笔) 注解:所谓的 topN 算法指的是 在 海量的数据中进行排序从而活动 前 N 的数据. 这就是所谓的 topN 算法.当然你可以说我就 sort 一下 排序完了直 ...
- pyspark进行词频统计并返回topN
Part I:词频统计并返回topN 统计的文本数据: what do you do how do you do how do you do how are you from operator imp ...
- TOP-N类查询
Top-N查询 --Practices_29:Write a query to display the top three earners in the EMPLOYEES table. Displa ...
- hive 分组排序,topN
hive 分组排序,topN 语法格式:row_number() OVER (partition by COL1 order by COL2 desc ) rankpartition by:类似hiv ...
随机推荐
- jQuery之方法绑定(事件注册)代码小结
1.最直接的模式,直接将一个function对象传入方法函数,如下面的click(),好处坏处一看便知 $("#btnComfirmChooseCompany").click(fu ...
- 洛谷题解 P2865 【[USACO06NOV]路障Roadblocks】
链接:https://www.luogu.org/problemnew/show/P2865 题目描述 Bessie has moved to a small farm and sometimes e ...
- Java 根据Date计算年龄
- 【bzoj3670】: [Noi2014]动物园 字符串-kmp-倍增
[bzoj3670]: [Noi2014]动物园 一开始想的是按照kmp把fail算出来的同时就可以递推求出第i位要f次可以跳到-1 然后把从x=i开始顺着fail走,走到fail[x]*2<i ...
- 查看Eclipse版本号的方法及各个版本区别 Eclipse选择标准
这篇文章主要介绍了查看Eclipse版本号的方法及各个版本区别 Eclipse选择标准,方便初学者选择适合自己的版本,需要的朋友可以参考下 Eclipse 是一个开放源代码的.基于Java的可扩展开发 ...
- 洛谷P4559 [JSOI2018]列队(主席树)
题面 传送门 题解 首先考虑一个贪心,我们把所有的人按\(a_i\)排个序,那么排序后的第一个人到\(k\),第二个人到\(k+1\),...,第\(i\)个人到\(k+i-1\),易证这样一定是最优 ...
- 老男孩Day16作业:登录、注册、后台管理页面(动态)
一.作业需求: 1.后台管理主界面(左边菜单框.(全选.反选)框.返回顶部按钮) 2.老男孩登录.注册页面 二.博客地址:https://www.cnblogs.com/catepython/p/93 ...
- 在Pd中取消Code Name 同步
以前记得现在忘记了,好不容易找回来,记住备忘吧.
- 一个数字从后向前输入每一位数字,Camel和Pascal命名规范,IsValid()
int num = int.Parse(Console.ReadLine()); ; ) { n = num % ; num /= ; Console.WriteLine(n); } Camel和Pa ...
- CDQZ Day1
#include<cassert> #include<cstdio> #include<vector> using namespace std; ,maxt=,ma ...