最大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之传说中的函数编写条规
Oct 11 Python
Python中处理字符串之endswith()方法的使用简介
May 18 Python
Python调用SQLPlus来操作和解析Oracle数据库的方法
Apr 09 Python
详解Python实现按任意键继续/退出的功能
Aug 19 Python
python连接数据库的方法
Oct 19 Python
Python将多份excel表格整理成一份表格
Jan 03 Python
Python函数参数匹配模型通用规则keyword-only参数详解
Jun 10 Python
python3的print()函数的用法图文讲解
Jul 16 Python
python 标准差计算的实现(std)
Jul 29 Python
基于python模拟bfs和dfs代码实例
Nov 19 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
Feb 03 Python
在python3.9下如何安装scrapy的方法
Feb 03 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控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
php自定义hash函数实例
2015/05/05 PHP
深入解析PHP中foreach语句控制数组循环的用法
2015/11/30 PHP
PHP的mysqli_rollback()函数讲解
2019/01/23 PHP
Thinkphp5 自定义上传文件名的实现方法
2019/07/23 PHP
Jquery中增加参数与Json转换代码
2009/11/20 Javascript
基于jquery的图片幻灯展示源码
2012/07/15 Javascript
jquery如何判断某元素是否具备指定的样式
2013/11/05 Javascript
Jquery中扩展方法extend使用技巧
2014/08/24 Javascript
Javascript连接Access数据库完整实例
2015/08/03 Javascript
Javascript之Date对象详解
2016/06/07 Javascript
jQuery实现根据滚动条位置加载相应内容功能
2016/07/18 Javascript
浅谈jquery中next与siblings的区别
2016/10/27 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
2016/12/27 Javascript
vue router路由嵌套不显示问题的解决方法
2017/06/17 Javascript
pycharm 使用心得(九)解决No Python interpreter selected的问题
2014/06/06 Python
老生常谈Python进阶之装饰器
2017/05/11 Python
Python tkinter模块中类继承的三种方式分析
2017/08/08 Python
解决Python中定时任务线程无法自动退出的问题
2019/02/18 Python
Python with语句和过程抽取思想
2019/12/23 Python
Python3打包exe代码2种方法实例解析
2020/02/17 Python
Python 合并拼接字符串的方法
2020/07/28 Python
简述python Scrapy框架
2020/08/17 Python
Python爬虫爬取有道实现翻译功能
2020/11/27 Python
HTML5实现签到 功能
2018/10/09 HTML / CSS
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
销售副总经理岗位职责
2013/12/11 职场文书
文明青少年标兵事迹材料
2014/01/28 职场文书
视光学毕业生自荐书范文
2014/02/13 职场文书
艺术学院毕业生求职信
2014/07/09 职场文书
2014购房个人委托书范本
2014/10/12 职场文书
2014年环卫工作总结
2014/11/22 职场文书
高中生综合素质自我评价
2015/03/06 职场文书
团支部组织委员竞选稿
2015/11/21 职场文书
nginx配置proxy_pass中url末尾带/与不带/的区别详解
2021/03/31 Servers