最大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启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
Apr 09 Python
使用python实现tcp自动重连
Jul 02 Python
python虚拟环境virtualenv的使用教程
Oct 20 Python
使用Python的Django和layim实现即时通讯的方法
May 25 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
May 25 Python
基于wxPython的GUI实现输入对话框(2)
Feb 27 Python
Python实现的爬取小说爬虫功能示例
Mar 30 Python
Python实用工具FuckIt.py介绍
Jul 02 Python
django 连接数据库 sqlite的例子
Aug 14 Python
python exit出错原因整理
Aug 31 Python
django中cookiecutter的使用教程
Dec 03 Python
Python 一键获取电脑浏览器的账号密码
May 11 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:风雨欲来 路在何方?
2006/10/09 PHP
下载文件的点击数回填
2006/10/09 PHP
PHP调用MySQL的存储过程的实现代码
2008/08/12 PHP
PHP中usort在值相同时改变原始位置问题的解决方法
2011/11/27 PHP
说说PHP的autoLoad自动加载机制
2012/09/27 PHP
PHP创建word文档的方法(平台无关)
2016/03/29 PHP
thinkPHP利用ajax异步上传图片并显示、删除的示例
2018/09/26 PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
2020/08/24 PHP
将json当数据库一样操作的javascript lib
2013/10/28 Javascript
jquery遍历select元素(实例讲解)
2013/12/31 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
javascript判断css3动画结束 css3动画结束的回调函数
2015/03/10 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
nodejs require js文件入口,在package.json中指定默认入口main方法
2018/10/10 NodeJs
vue transition 在子组件中失效的解决
2019/11/12 Javascript
[50:20]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第四局
2016/03/06 DOTA
python中sys.argv函数精简概括
2018/07/08 Python
pandas 对日期类型数据的处理方法详解
2019/08/08 Python
AmazeUI的JS表单验证框架实战示例分享
2020/08/21 HTML / CSS
迪卡侬印度官网:购买所有体育用品
2017/06/24 全球购物
阿玛瑞酒店中文官方网站:Amari.com
2018/02/13 全球购物
英国领先的游戏零售商:GAME
2019/09/24 全球购物
网站设计师的岗位职责
2013/11/21 职场文书
大学生专科学习生活的自我评价
2013/12/07 职场文书
文秘专业个人求职信
2013/12/22 职场文书
竞选学习委员演讲稿
2014/04/28 职场文书
班级体育活动总结
2014/07/05 职场文书
村党支部书记四风问题个人对照检查材料思想汇报
2014/10/06 职场文书
群众路线教育实践活动学习笔记
2014/11/05 职场文书
2014年保险业务员工作总结
2014/12/23 职场文书
高中教师个人工作总结
2015/02/10 职场文书
中班上学期个人总结
2015/02/12 职场文书
详解MySQL集群搭建
2021/05/26 MySQL
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python
vscode远程免密登入Linux服务器的配置方法
2022/06/28 Servers