最大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 相关文章推荐
在MAC上搭建python数据分析开发环境
Jan 26 Python
Python数据操作方法封装类实例
Jun 23 Python
python生成tensorflow输入输出的图像格式的方法
Feb 12 Python
对python numpy数组中冒号的使用方法详解
Apr 17 Python
PyQt5每天必学之日历控件QCalendarWidget
Apr 19 Python
pandas Dataframe行列读取的实例
Jun 08 Python
详解Python 装饰器执行顺序迷思
Aug 08 Python
获取django框架orm query执行的sql语句实现方法分析
Jun 20 Python
Python3.9又更新了:dict内置新功能
Feb 28 Python
python 按钮点击关闭窗口的实现
Mar 04 Python
keras slice layer 层实现方式
Jun 11 Python
关于tensorflow softmax函数用法解析
Jun 30 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
Windows下Apache + PHP SESSION丢失的解决过程全纪录
2015/04/07 PHP
在PHP语言中使用JSON和将json还原成数组的方法
2016/07/19 PHP
php数据库操作model类(使用__call方法)
2016/11/16 PHP
Phpstorm+Xdebug断点调试PHP的方法
2018/05/14 PHP
JavaScript中的排序算法代码
2011/02/22 Javascript
html中的input标签的checked属性jquery判断代码
2012/09/19 Javascript
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
JS将光标聚焦在文本最后的实现代码
2014/03/28 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
webpack打包单页面如何引用的js
2017/06/07 Javascript
在Vue中使用echarts的方法
2018/02/05 Javascript
Angular模版驱动表单的使用总结
2018/05/05 Javascript
关于HTML5的data-*自定义属性的总结
2018/05/05 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
微信小程序canvas拖拽、截图组件功能
2018/09/04 Javascript
JS常用跨域方法实现原理解析
2020/12/09 Javascript
linux 下实现python多版本安装实践
2014/11/18 Python
Python中文竖排显示的方法
2015/07/28 Python
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
python2 与 python3 实现共存的方法
2018/07/12 Python
Python 矩阵转置的几种方法小结
2019/12/02 Python
python mysql中in参数化说明
2020/06/05 Python
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
澳大利亚手表品牌:Time IV Change
2018/10/06 全球购物
关于逃课的检讨书
2014/01/23 职场文书
超市重阳节活动方案
2014/02/10 职场文书
四风存在的原因分析
2014/02/11 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书
2016年春节慰问信息
2015/03/25 职场文书
2015年信贷员工作总结
2015/04/28 职场文书
开学典礼观后感
2015/06/15 职场文书
婚宴父亲致辞
2015/07/27 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书
2016年优秀共青团员事迹材料
2016/02/25 职场文书