最大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自动化运维_文件内容差异对比分析
Dec 13 Python
python ansible服务及剧本编写
Dec 29 Python
python如何让类支持比较运算
Mar 20 Python
使用Python实现在Windows下安装Django
Oct 17 Python
详解Python用户登录接口的方法
Apr 17 Python
linux下安装python3和对应的pip环境教程详解
Jul 01 Python
在pytorch中对非叶节点的变量计算梯度实例
Jan 10 Python
python中的 zip函数详解及用法举例
Feb 16 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
Apr 15 Python
jenkins+python自动化测试持续集成教程
May 12 Python
详解python变量与数据类型
Aug 25 Python
python图像处理 PIL Image操作实例
Apr 09 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 魔术方法使用说明
2009/10/20 PHP
在字符串指定位置插入一段字符串的php代码
2010/02/16 PHP
PHP实现的MD5结合RSA签名算法实例
2017/10/07 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
2019/06/22 PHP
extjs 列表框(multiselect)的动态添加列表项的方法
2009/07/31 Javascript
jQuery 使用手册(一)
2009/09/23 Javascript
jQuery.query.js 取参数的两点问题分析
2012/08/06 Javascript
jQuery操作checkbox选择(list/table)
2013/04/07 Javascript
放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解
2013/04/20 Javascript
解决css和js的{}与smarty定界符冲突问题的两种方法
2013/09/10 Javascript
JS关闭窗口或JS关闭页面的几种代码分享
2013/10/25 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
2016/11/29 Javascript
深入理解基于vue-cli的vuex配置
2017/07/24 Javascript
微信小程序wx.request实现后台数据交互功能分析
2017/11/25 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
vue实现局部刷新的实现示例
2019/04/16 Javascript
pyside写ui界面入门示例
2014/01/22 Python
Python实现模拟登录及表单提交的方法
2015/07/25 Python
python中多个装饰器的执行顺序详解
2018/10/08 Python
Flask框架web开发之零基础入门
2018/12/10 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
Django中使用极验Geetest滑动验证码过程解析
2019/07/31 Python
Python笔记之观察者模式
2019/11/20 Python
Python测试Kafka集群(pykafka)实例
2019/12/23 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
flask框架蓝图和子域名配置详解
2020/01/25 Python
Tensorflow进行多维矩阵的拆分与拼接实例
2020/02/07 Python
python PIL模块的基本使用
2020/09/29 Python
世界上最大的二手相机店:KEN
2017/05/17 全球购物
合作意向书
2014/07/30 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/06 PostgreSQL