最大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登陆asp网站页面的实现代码
Jan 14 Python
Python进阶之递归函数的用法及其示例
Jan 31 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
Jul 11 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
Sep 19 Python
Python实现注册、登录小程序功能
Sep 21 Python
对python中的six.moves模块的下载函数urlretrieve详解
Dec 19 Python
Golang GBK转UTF-8的例子
Aug 26 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
Aug 30 Python
Python实现搜索算法的实例代码
Jan 02 Python
Python连接字符串过程详解
Jan 06 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
Jan 10 Python
Python操作MongoDb数据库流程详解
Mar 05 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中jpgraph类库的使用介绍
2013/08/08 PHP
MongoDB在PHP中的常用操作小结
2014/02/20 PHP
PHP中提问频率最高的11个面试题和答案
2014/09/02 PHP
PHP表单数据写入MySQL数据库的代码
2016/05/31 PHP
CakePHP框架Model关联对象用法分析
2017/08/04 PHP
PHP 自动加载类原理与用法实例分析
2020/04/14 PHP
PHP获取当前时间不准确问题解决方案
2020/08/14 PHP
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
ie下动态加态js文件的方法
2011/09/13 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
2016/03/24 Javascript
微信小程序 数据遍历的实现
2017/04/05 Javascript
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
使用jquery+iframe做一个ajax上传效果(实例)
2017/08/24 jQuery
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
在Vue组件中获取全局的点击事件方法
2018/09/06 Javascript
Vue.extend实现挂载到实例上的方法
2019/05/01 Javascript
CKeditor富文本编辑器使用技巧之添加自定义插件的方法
2019/06/14 Javascript
js 实现 list转换成tree的方法示例(数组到树)
2019/08/18 Javascript
layui禁用侧边导航栏点击事件的解决方法
2019/09/25 Javascript
python创建和使用字典实例详解
2013/11/01 Python
pycharm 使用心得(一)安装和首次使用
2014/06/05 Python
基于python绘制科赫雪花
2018/06/22 Python
python 解压pkl文件的方法
2018/10/25 Python
pandas 将索引值相加的方法
2018/11/15 Python
解决pycharm启动后总是不停的updating indices...indexing的问题
2019/11/27 Python
Pytorch 数据加载与数据预处理方式
2019/12/31 Python
python中count函数简单的实例讲解
2020/02/06 Python
python之语音识别speech模块
2020/09/09 Python
移动端Html5页面生成图片解决方案
2018/08/07 HTML / CSS
世界闻名的衬衫制造商:Savile Row Company
2018/07/30 全球购物
西班牙最好的在线购买葡萄酒的商店:Vinoseleccion
2019/10/30 全球购物
室内设计自我鉴定
2013/10/15 职场文书
2015七夕情人节宣传语
2015/07/14 职场文书
小学运动会加油词
2015/07/18 职场文书
小程序实现筛子抽奖
2021/05/26 Javascript
JavaScript模拟实现网易云轮播效果
2022/04/04 Javascript