最大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中函数传参详解
Jul 03 Python
Python+Selenium自动化实现分页(pagination)处理
Mar 31 Python
基于Python的XSS测试工具XSStrike使用方法
Jul 29 Python
python3+PyQt5重新实现QT事件处理程序
Apr 19 Python
python 通过logging写入日志到文件和控制台的实例
Apr 28 Python
Python爬虫小技巧之伪造随机的User-Agent
Sep 13 Python
详解通过API管理或定制开发ECS实例
Sep 30 Python
计算机二级python学习教程(2) python语言基本语法元素
May 16 Python
python调用有道智云API实现文件批量翻译
Oct 10 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
Feb 04 Python
pytorch实现线性回归以及多元回归
Apr 11 Python
Python实现简单得递归下降Parser
May 02 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
《雄兵连》系列首部大电影《烈阳天道》:可能是因为期望值太高了
2020/08/18 国漫
PHP内核探索:变量概述
2014/01/30 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
php实现保存周期为1天的购物车类
2017/07/07 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
2018/07/21 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
JavaScript实现Flash炫光波动特效
2015/05/14 Javascript
JS中this上下文对象使用方式
2016/10/09 Javascript
微信小程序实现传参数的几种方法示例
2018/01/10 Javascript
Vue.js中的extend绑定节点并显示的方法
2019/06/20 Javascript
layui多图上传实现删除功能的例子
2019/09/23 Javascript
vue学习笔记之Vue中css动画原理简单示例
2020/02/29 Javascript
Vertx基于EventBus发送接受自定义对象
2020/11/16 Javascript
[01:20]DOTA2 2017国际邀请赛冠军之路无止竞
2017/06/19 DOTA
布同 统计英文单词的个数的python代码
2011/03/13 Python
python安装以及IDE的配置教程
2015/04/29 Python
python数据预处理之将类别数据转换为数值的方法
2017/07/05 Python
Python读取mat文件,并转为csv文件的实例
2018/07/04 Python
Python列表解析操作实例总结
2020/02/26 Python
对python中return与yield的区别详解
2020/03/12 Python
Django Session和Cookie分别实现记住用户登录状态操作
2020/07/02 Python
python的数学算法函数及公式用法
2020/11/18 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
2020/11/25 Python
解决python3.6用cx_Oracle库连接Oracle的问题
2020/12/07 Python
德国PC硬件网站:CASEKING
2016/10/20 全球购物
Osklen官方在线商店:巴西服装品牌
2019/04/25 全球购物
夏威夷咖啡公司:Hawaii Coffee Company
2019/09/19 全球购物
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
优秀求职信范文分享
2013/12/19 职场文书
防邪知识进家庭活动方案
2014/08/26 职场文书
医院2014国庆节活动策划方案
2014/09/21 职场文书
大学生团支书竞选稿
2015/11/21 职场文书
mysqldump进行数据备份详解
2022/07/15 MySQL