最大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中的输入和输出功能进行读取和写入的教程
Apr 14 Python
Python的Bottle框架中返回静态文件和JSON对象的方法
Apr 30 Python
python下载图片实现方法(超简单)
Jul 21 Python
Python中按值来获取指定的键
Mar 04 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
Jun 19 Python
python读取ini配置文件过程示范
Dec 23 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
Apr 08 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
Apr 23 Python
Java多线程实现四种方式原理详解
Jun 02 Python
一文详述 Python 中的 property 语法
Sep 01 Python
python 实现Requests发送带cookies的请求
Feb 08 Python
分享python函数常见关键字
Apr 26 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
Zerg剧情介绍
2020/03/14 星际争霸
PHP 抓取网页图片并且另存为的实现代码
2010/03/24 PHP
PHP If Else(elsefi) 语句
2013/04/07 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(四)
2014/06/23 PHP
将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
2016/03/03 PHP
SAE实时日志接口SDK用法示例
2016/10/09 PHP
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
一起来写段JS drag拖动代码
2010/12/09 Javascript
javascript五图轮播切换实用版
2012/08/17 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
2013/07/12 Javascript
js实现两个值相加alert出来精确到指定位
2013/09/25 Javascript
AngularJS+Node.js实现在线聊天室
2015/08/28 Javascript
jquery自适应布局的简单实例
2016/05/28 Javascript
Javascript实现代码折叠功能
2016/08/25 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
2016/12/08 Javascript
javascript实现一个网页加载进度loading
2017/01/04 Javascript
nodejs中模块定义实例详解
2017/03/18 NodeJs
Angular4学习笔记之准备和环境搭建项目
2017/08/01 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
vue中使用v-model完成组件间的通信
2019/08/22 Javascript
使用eslint和githooks统一前端风格的技巧
2020/07/29 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
轻松掌握python设计模式之策略模式
2016/11/18 Python
python: 自动安装缺失库文件的方法
2018/10/22 Python
Python对象转换为json的方法步骤
2019/04/25 Python
利用matplotlib为图片上添加触发事件进行交互
2020/04/23 Python
基于tensorflow for循环 while循环案例
2020/06/30 Python
Python Matplotlib绘图基础知识代码解析
2020/08/31 Python
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
上班玩游戏检讨书
2014/02/07 职场文书
党的群众路线教育实践活动公开承诺书
2014/03/28 职场文书
2019中小学生安全过暑期倡议书
2019/06/24 职场文书
python glom模块的使用简介
2021/04/13 Python
CSS实现单选折叠菜单功能
2021/11/01 HTML / CSS
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL