最大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中模块与包有相同名字的处理方法
May 05 Python
python中日志logging模块的性能及多进程详解
Jul 18 Python
Python有序查找算法之二分法实例分析
Dec 11 Python
代码分析Python地图坐标转换
Feb 08 Python
Python minidom模块用法示例【DOM写入和解析XML】
Mar 25 Python
Python单元和文档测试实例详解
Apr 11 Python
Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例
May 04 Python
Pycharm新建模板默认添加个人信息的实例
Jul 15 Python
python中利用matplotlib读取灰度图的例子
Dec 07 Python
pytorch制作自己的LMDB数据操作示例
Dec 18 Python
Django自定义全局403、404、500错误页面的示例代码
Mar 08 Python
python中rc1什么意思
Jun 19 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
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
$.ajax json数据传递方法
2008/11/19 Javascript
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
jquery插件推荐浏览器嗅探userAgent
2014/11/09 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
jQuery使用$.get()方法从服务器文件载入数据实例
2015/03/25 Javascript
Jquery全选与反选点击执行一次的解决方案
2015/08/14 Javascript
Javascript中的几种继承方式对比分析
2016/03/22 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
js 判断各种数据类型的简单方法(推荐)
2016/08/29 Javascript
Vue 父子组件、组件间通信
2017/03/08 Javascript
js仿微信抢红包功能
2020/09/25 Javascript
微信小程序tabBar模板用法实例分析【附demo源码下载】
2017/11/28 Javascript
Nodejs 和 Electron ubuntu下快速安装过程
2018/05/04 NodeJs
JS判断字符串是否为整数的方法--简单的正则判断
2018/07/23 Javascript
js实现删除li标签一行内容
2019/04/16 Javascript
通过循环优化 JavaScript 程序
2019/06/24 Javascript
Vue实现push数组并删除的例子
2019/11/01 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
Python中eval带来的潜在风险代码分析
2017/12/11 Python
用Python实现大文本文件切割的方法
2019/01/12 Python
python简单验证码识别的实现方法
2019/05/10 Python
Python实现制度转换(货币,温度,长度)
2019/07/14 Python
利用python3 的pygame模块实现塔防游戏
2019/12/30 Python
Python基于unittest实现测试用例执行
2020/11/25 Python
html5 实现客户端验证上传文件的大小(简单实例)
2016/05/15 HTML / CSS
联想印度官方网上商店:Lenovo India
2019/08/24 全球购物
俄罗斯最大的在线珠宝大卖场:Nebo
2019/12/08 全球购物
校友会欢迎辞
2014/01/13 职场文书
党员学习十八大感想
2014/01/17 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
2014国庆节国旗下演讲稿(精选版)
2014/09/26 职场文书
Css预编语言及区别详解
2021/04/25 HTML / CSS
如何使用Python实现一个简易的ORM模型
2021/05/12 Python