最大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 相关文章推荐
Django验证码的生成与使用示例
May 20 Python
Python实现破解猜数游戏算法示例
Sep 25 Python
django自带的server 让外网主机访问方法
May 14 Python
Python OpenCV 使用滑动条来调整函数参数的方法
Jul 08 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
Aug 31 Python
python实现超市管理系统(后台管理)
Oct 25 Python
如何使用Python脚本实现文件拷贝
Nov 20 Python
python实现高斯判别分析算法的例子
Dec 09 Python
Python基础之字符串操作常用函数集合
Feb 09 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
May 16 Python
Python3爬虫中识别图形验证码的实例讲解
Jul 30 Python
Python词云的正确实现方法实例
May 08 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
php采集自中央气象台范围覆盖全国的天气预报代码实例
2015/01/04 PHP
php实现分页显示
2015/11/03 PHP
PHP实现小程序批量通知推送
2018/11/27 PHP
PHP封装的简单连接MongoDB类示例
2019/02/13 PHP
javascript背投广告代码的完善
2008/04/08 Javascript
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
window.open不被拦截的实现代码
2012/08/22 Javascript
jquery实现右侧栏菜单选择操作
2016/03/04 Javascript
jQuery中deferred对象使用方法详解
2016/07/14 Javascript
canvas实现探照灯效果
2017/02/07 Javascript
vue.js开发环境安装教程
2017/03/17 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
2018/05/15 Javascript
JavaScript选择排序算法原理与实现方法示例
2018/08/06 Javascript
微信小程序开发之左右分栏效果的实例代码
2019/05/20 Javascript
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
[03:55]2016国际邀请赛中国区预选赛首日TOP10精彩集锦
2016/06/27 DOTA
python实现数独算法实例
2015/06/09 Python
使用python实现接口的方法
2017/07/07 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
2019/03/13 Python
用Python实现将一张图片分成9宫格的示例
2019/07/05 Python
将python安装信息加入注册表的示例
2019/11/20 Python
解决pyCharm中 module 调用失败的问题
2020/02/12 Python
Django实现前台上传并显示图片功能
2020/05/29 Python
Python三维绘图之Matplotlib库的使用方法
2020/09/20 Python
python实现粒子群算法
2020/10/15 Python
Python 找出英文单词列表(list)中最长单词链
2020/12/14 Python
CSS3 特效范例整理
2011/08/22 HTML / CSS
幼儿园实习自我鉴定
2013/12/15 职场文书
大学生涯自我鉴定
2014/01/16 职场文书
感恩节红领巾广播稿
2014/02/11 职场文书
党务公开方案
2014/05/06 职场文书
银行大堂经理培训心得体会
2016/01/09 职场文书
2016优秀护士先进个人事迹材料
2016/02/25 职场文书
使用golang编写一个并发工作队列
2021/05/08 Golang