最大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编写简单网络爬虫抓取视频下载资源
Nov 04 Python
通过5个知识点轻松搞定Python的作用域
Sep 09 Python
Python 序列的方法总结
Oct 18 Python
Python基于numpy灵活定义神经网络结构的方法
Aug 19 Python
python中的decorator的作用详解
Jul 26 Python
浅谈pycharm的xmx和xms设置方法
Dec 03 Python
关于python之字典的嵌套,递归调用方法
Jan 21 Python
详解python实现交叉验证法与留出法
Jul 11 Python
Python算法的时间复杂度和空间复杂度(实例解析)
Nov 19 Python
Python 支持向量机分类器的实现
Jan 15 Python
增大python字体的方法步骤
Jul 05 Python
深入了解Python 方法之类方法 &amp; 静态方法
Aug 17 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比较多维数组中值的大小排序实现代码
2012/09/08 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
2014/09/27 PHP
php文件压缩之PHPZip类用法实例
2015/06/18 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
2016/11/25 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
JS array 数组详解
2009/03/22 Javascript
jCallout 轻松实现气泡提示功能
2013/09/22 Javascript
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
基于jquery实现简单的手风琴特效
2015/11/24 Javascript
JS模拟简易滚动条效果代码(附demo源码)
2016/04/05 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
JQuery控制图片由中心点逐渐放大效果
2016/06/26 Javascript
深入理解AngularJS中的ng-bind-html指令
2017/03/27 Javascript
使用3D引擎threeJS实现星空粒子移动效果
2020/09/13 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
详解适配器在JavaScript中的体现
2018/09/28 Javascript
微信小程序实现简单表格
2019/02/14 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
jquery添加div实现消息聊天框
2020/02/08 jQuery
vue v-on:click传递动态参数的步骤
2020/09/11 Javascript
Python中的高级数据结构详解
2015/03/27 Python
基于Django模板中的数字自增(详解)
2017/09/05 Python
python 定义n个变量方法 (变量声明自动化)
2018/11/10 Python
在Sublime Editor中配置Python环境的详细教程
2020/05/03 Python
python自动生成sql语句的脚本
2021/02/24 Python
使用spring mvc+localResizeIMG实现HTML5端图片压缩上传的功能
2016/12/16 HTML / CSS
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
如何现实servlet的单线程模式
2014/08/05 面试题
公司财务自我评价分享
2013/12/17 职场文书
清洁工表扬信
2014/01/08 职场文书
机关工会开展学习雷锋活动总结
2014/03/01 职场文书
一份恶作剧的检讨书
2014/09/13 职场文书
浅谈Redis中的RDB快照
2021/06/29 Redis