最大K个数问题的Python版解法总结


Posted in Python onJune 16, 2016

TopK问题,即寻找最大的K个数,这个问题非常常见,比如从1千万搜索记录中找出最热门的10个关键词.
方法一:
先排序,然后截取前k个数.
时间复杂度:O(n*logn)+O(k)=O(n*logn)。
这种方式比较简单粗暴,提一下便是。

方法二:最大堆

我们可以创建一个大小为K的数据容器来存储最小的K个数,然后遍历整个数组,将每个数字和容器中的最大数进行比较,如果这个数大于容器中的最大值,则继续遍历,否则用这个数字替换掉容器中的最大值。这个方法的理解也十分简单,至于容器的选择,很多人第一反应便是最大堆,但是python中最大堆如何实现呢?我们可以借助实现了最小堆的heapq库,因为在一个数组中,每个数取反,则最大数变成了最小数,整个数字的顺序发生了变化,所以可以给数组的每个数字取反,然后借助最小堆,最后返回结果的时候再取反就可以了,代码如下:

import heapq
def get_least_numbers_big_data(self, alist, k):
  max_heap = []
  length = len(alist)
  if not alist or k <= 0 or k > length:
    return
  k = k - 1
  for ele in alist:
    ele = -ele
    if len(max_heap) <= k:
      heapq.heappush(max_heap, ele)
    else:
      heapq.heappushpop(max_heap, ele)

  return map(lambda x:-x, max_heap)


if __name__ == "__main__":
  l = [1, 9, 2, 4, 7, 6, 3]
  min_k = get_least_numbers_big_data(l, 3)

方法三:quick select

quick select算法.其实就类似于快排.不同地方在于quick select每趟只需要往一个方向走.
时间复杂度:O(n).

def qselect(A,k): 
  if len(A)<k:return A 
  pivot = A[-1] 
  right = [pivot] + [x for x in A[:-1] if x>=pivot] 
  rlen = len(right) 
  if rlen==k: 
    return right 
  if rlen>k: 
    return qselect(right, k) 
  else: 
    left = [x for x in A[:-1] if x<pivot] 
    return qselect(left, k-rlen) + right 
 
for i in range(1, 10): 
  print qselect([11,8,4,1,5,2,7,9], i)
Python 相关文章推荐
Python构建XML树结构的方法示例
Jun 30 Python
Python实现压缩和解压缩ZIP文件的方法分析
Sep 28 Python
python使用正则表达式的search()函数实现指定位置搜索功能
Nov 10 Python
python遍历文件夹下所有excel文件
Jan 03 Python
Python使用wget实现下载网络文件功能示例
May 31 Python
用Python编写一个高效的端口扫描器的方法
Dec 20 Python
浅析Python 中几种字符串格式化方法及其比较
Jul 02 Python
Python定时任务APScheduler的实例实例详解
Jul 22 Python
pytorch制作自己的LMDB数据操作示例
Dec 18 Python
Win系统PyQt5安装和使用教程
Dec 25 Python
Python enumerate() 函数如何实现索引功能
Jun 29 Python
python对输出的奇数偶数排序实例代码
Dec 04 Python
Python中的多行注释文档编写风格汇总
Jun 16 #Python
Python构造自定义方法来美化字典结构输出的示例
Jun 16 #Python
浅谈Python中chr、unichr、ord字符函数之间的对比
Jun 16 #Python
详解Python中 __get__和__getattr__和__getattribute__的区别
Jun 16 #Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
Jun 16 #Python
Python黑魔法@property装饰器的使用技巧解析
Jun 16 #Python
Python实现类似jQuery使用中的链式调用的示例
Jun 16 #Python
You might like
php session的锁和并发
2016/01/22 PHP
PHP实现限制IP访问的方法
2017/04/20 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
jquery中对表单的基本操作代码
2010/07/29 Javascript
jQuery timers计时器简单应用说明
2010/10/28 Javascript
ASP.NET中AJAX 调用实例代码
2012/05/03 Javascript
js中符号转意问题示例探讨
2013/08/19 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
javascript异步编程的4种方法
2014/02/19 Javascript
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
2014/05/11 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
2015/03/04 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
微信小程序-消息提示框实例
2016/11/24 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
Vue中使用clipboard实现复制功能
2018/09/05 Javascript
在vue项目中,将juery设置为全局变量的方法
2018/09/25 Javascript
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
mpvue实现左侧导航与右侧内容的联动
2019/10/21 Javascript
Python生成短uuid的方法实例详解
2018/05/29 Python
python实现名片管理系统项目
2019/04/26 Python
python处理大日志文件
2019/07/23 Python
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
药学专业大学生个人的自我评价
2013/11/04 职场文书
军人违纪检讨书
2014/02/04 职场文书
安全例会汇报材料
2014/08/23 职场文书
离婚协议书格式
2015/01/26 职场文书
教师节寄语2015
2015/03/23 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书
入团申请书格式
2019/06/20 职场文书
珍惜时间的诗歌赏析
2019/08/23 职场文书
用Python selenium实现淘宝抢单机器人
2021/06/18 Python
Spring-cloud Config Server的3种配置方式
2021/09/25 Java/Android