python实现topk问题
方法1:
用python中的heapq实现
import heapq
import randomclass TopKHeap(object):def __init__(self,k):self.data=[]self.k=kdef push(self,num):if len(self.data)<self.k:heapq.heappush(self.data,num)else:top_min=self.data[0]if num>top_min:heapq.heapreplace(self.data,num)def topk(self):return list(reversed([heapq.heappop(self.data) for i in range(self.k)]))if __name__ == '__main__':heap=TopKHeap(10)for i in range(100000):n=random.randint(0,100000)# print(n,'------------')heap.push(n)print(heap.topk())
方法2:
思路一样,就是自己写个最大堆,
步骤:
- 先用前k个数据建立好一个最小堆(k个结点)
- 然后对剩下的每一个数和根结点比较,比根结点大则替换根结点,替换之后此时就不是最小堆,所以需要再次建堆,使得变成最小堆;如过比根结点小,则继续遍历下一个数,直至遍历结束,
- 结束后,此时的堆就是这海量数据中最大的k个数,输出即可
注意:输出的数不是有序的,是最小堆的结果,要有序,得再进行排序
堆排序:https://blog.csdn.net/qq_41386300/article/details/89375074
import randomdef heap(data,root):if 2*root+1<len(data):if 2*root+2<len(data) and data[2*root+2]<data[2*root+1]:k=2*root+2else:k=2*root+1if data[k]<data[root]:data[root],data[k]=data[k],data[root]heap(data,k)def min_heap(data):for i in range(len(data)//2-1,-1,-1):heap(data,i)return datadef topk(data,k):data_k=min_heap(data[:k])for i in range(k,len(data)):if data[i]>data_k[0]:data_k[0]=data[i]data_k=min_heap(data_k)return data_kif __name__ == '__main__':data=[random.randint(0,1000) for i in range(1000)]print(topk(data,10))
python实现topk问题相关推荐
- 关于某日访问次数最多的IP的topK问题的三种解法
题目描述 在july大神的博客中,看到这样两道题: 1. 海量日志数据,提取出某日访问百度次数最多的那个IP. 2. 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复 ...
- python算法完整教程专栏完整目录
python算法完整教程专栏完整目录 专栏说明如下 专栏目录 专栏说明如下 内容:python算法完整教程 数量:692篇博文(2023年2月15日截止) 更新时间至:2023年2月15日(后续加上去 ...
- python numpy 求top-k accuracy指标
top-k acc表示在多分类情况下取最高的k类得分的label,与真实值匹配,只要有一个label match,结果就是True. 如对于一个有5类的多分类任务 a_real = 1 a_pred ...
- python topk
生成数组 百万元素 import numpy as npinputs = [ np.random.random() for _ in range(1000000)] 计时器 from functool ...
- python TopK算法
TopK算法 寻找数组中的最小的k个数,也叫topk问题. 该算法要解决的问题是:在线性时间内找到一个无序序列中第 kk 大的数. 如:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2, ...
- 飘逸的python - 大数据TopK问题的quick select解法
TopK问题,即寻找最大的K个数,这个问题非常常见,比如从1千万搜索记录中找出最热门的10个关键词. 方法一: 先排序,然后截取前k个数. 时间复杂度:O(n*logn)+O(k)=O(n*logn) ...
- Python 数据结构与算法——选取算法(TopK)
该算法要解决的问题是:在线性时间内找到一个无序序列中第 kk 大的数.(或许,该程序最重要的用途是找出中间值--也就是该序列完成排序后位于中间 (1+n)/2(1+n)/2 的元素值).有趣的是,稍加 ...
- 剑指offer 40.最小的 K 个数 python代码
题目 寻找数组中的最小的k个数,也叫topk问题. 牛客网测试地址 注意: 牛客网的提交需要将最终的结果排序 思路 快速排序的 partition() 方法,会返回一个整数 j 使得 a[l-j-1] ...
- Python第三方库jieba(中文分词)入门与进阶(官方文档)
jieba "结巴"中文分词:做最好的 Python 中文分词组件 github:https://github.com/fxsjy/jieba 特点 支持三种分词模式: 精确模式, ...
最新文章
- 上市3年市值缩水9成,AI教育第一股流利说谋求私有化
- 什么是百度竞价创意断句符
- UNITY 手游(安卓)如何使用C/C++代码
- 使用pull解析XML文件
- 我们究竟还要学习哪些Android知识?看这一篇就够了!
- java.lang.NoSuchMethodError: android.app.Notification$Builder.setChannelId
- SmartFox中的類型轉換
- xampp for mac mysql_xampp for mac下载-Xampp Mac版下载 V7.3.2-PC6苹果网
- unix环境高级编程读后感
- linux用cat建文件,如何使用Linux cat命令
- Mybatis报错: Could not find resource mapper
- Latex中在字母上加上波浪线
- c++中的sort函数
- python - RSA加密
- 红米note9 android10,红米note9pro和红米note10pro区别
- OmniPlan Pro Mac 项目规划管理软件
- 中国楼市房贷真相:只有傻瓜才自掏腰包!
- windows中oracle自动备份
- 凡客诚品网络推广技巧简单分析
- php大道至简之laravel-debugbar插件