最大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数组的处理代码
Jan 04 Python
python自动化测试之从命令行运行测试用例with verbosity
Sep 28 Python
Python实现提取文章摘要的方法
Apr 21 Python
python中yaml配置文件模块的使用详解
Apr 27 Python
python使用Matplotlib绘制分段函数
Sep 25 Python
详解Python 正则表达式模块
Nov 05 Python
python时间序列按频率生成日期的方法
May 14 Python
PyQt5重写QComboBox的鼠标点击事件方法
Jun 25 Python
Python实现微信好友的数据分析
Dec 16 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
Mar 12 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
Aug 07 Python
selenium判断元素是否存在的两种方法小结
Dec 07 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
六酷社区论坛HOME页清新格调免费版 下载
2007/03/07 PHP
MYSQL 小技巧 -- LAST_INSERT_ID
2009/11/24 PHP
PHP判断上传文件类型的解决办法
2015/10/20 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
2016/05/13 PHP
CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解
2016/11/01 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
PHP simplexml_load_string()函数实例讲解
2019/02/03 PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
2019/05/20 PHP
jQuery插件 tabBox实现代码
2010/02/09 Javascript
Js与下拉列表处理问题解决
2014/02/13 Javascript
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
jQuery+HTML5+CSS3制作支持响应式布局时间轴插件
2016/08/10 Javascript
使用jQuery,Angular实现登录界面验证码详解
2017/04/27 jQuery
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
2018/10/08 Javascript
layui type2 通过url给iframe子页面传值的例子
2019/09/06 Javascript
使用p5.js临摹动态图形
2019/10/23 Javascript
使用JavaScript获取Django模板指定键值数据
2020/05/27 Javascript
用Python编写一个基于终端的实现翻译的脚本
2015/04/24 Python
python队列queue模块详解
2018/04/27 Python
Python中py文件转换成exe可执行文件的方法
2019/06/14 Python
python字典改变value值方法总结
2019/06/21 Python
Python页面加载的等待方式总结
2021/02/28 Python
阿根廷在线宠物商店:Puppis
2018/03/23 全球购物
英国可持续奢侈品包包品牌:Elvis & Kresse
2018/08/05 全球购物
印度服装购物网站:Limeroad
2018/09/26 全球购物
新媒传信软件测试面试题
2013/02/24 面试题
Servlet面试题库
2015/07/18 面试题
写给女朋友的道歉信
2014/01/08 职场文书
《春晓》教学反思
2014/04/20 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
教师节寄语2015
2015/03/23 职场文书
2015年优质护理服务工作总结
2015/04/08 职场文书
道歉短信大全
2015/05/12 职场文书
2016大学生求职自荐信范文
2016/01/28 职场文书
浅谈Web Storage API的使用
2021/06/23 Javascript