Python heapq使用详解及实例代码


Posted in Python onJanuary 25, 2017

 Python heapq 详解

Python有一个内置的模块,heapq标准的封装了最小堆的算法实现。下面看两个不错的应用。

小顶堆(求TopK大)

话说需求是这样的: 定长的序列,求出TopK大的数据。

import heapq
import random

class TopkHeap(object):
  def __init__(self, k):
    self.k = k
    self.data = []

  def Push(self, elem):
    if len(self.data) < self.k:
      heapq.heappush(self.data, elem)
    else:
      topk_small = self.data[0]
      if elem > topk_small:
        heapq.heapreplace(self.data, elem)

  def TopK(self):
    return [x for x in reversed([heapq.heappop(self.data) for x in xrange(len(self.data))])]

if __name__ == "__main__":
  print "Hello"
  list_rand = random.sample(xrange(1000000), 100)
  th = TopkHeap(3)
  for i in list_rand:
    th.Push(i)
  print th.TopK()
  print sorted(list_rand, reverse=True)[0:3]

大顶堆(求BtmK小)

这次的需求变得更加的困难了:给出N长的序列,求出BtmK小的元素,即使用大顶堆。

算法实现的核心思路是:将push(e)改为push(-e)、pop(e)改为-pop(e)。

class BtmkHeap(object):
  def __init__(self, k):
    self.k = k
    self.data = []

  def Push(self, elem):
    # Reverse elem to convert to max-heap
    elem = -elem
    # Using heap algorighem
    if len(self.data) < self.k:
      heapq.heappush(self.data, elem)
    else:
      topk_small = self.data[0]
      if elem > topk_small:
        heapq.heapreplace(self.data, elem)

  def BtmK(self):
    return sorted([-x for x in self.data])

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
Python生成随机密码的方法
Jun 16 Python
Python读取文件内容的三种常用方式及效率比较
Oct 07 Python
Python批量更改文件名的实现方法
Oct 29 Python
python创建列表和向列表添加元素的实现方法
Dec 25 Python
Django框架实现逆向解析url的方法
Jul 04 Python
opencv python统计及绘制直方图的方法
Jan 21 Python
python+pyqt5实现KFC点餐收银系统
Jan 24 Python
ERLANG和PYTHON互通实现过程详解
Jul 05 Python
python Tensor和Array对比分析
Jan 08 Python
python自动点赞功能的实现思路
Feb 26 Python
python字典通过值反查键的实现(简洁写法)
Sep 30 Python
Django Auth用户认证组件实现代码
Oct 13 Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
Jan 24 #Python
Python调用C++程序的方法详解
Jan 24 #Python
python中import学习备忘笔记
Jan 24 #Python
用python实现简单EXCEL数据统计的实例
Jan 24 #Python
Python如何import文件夹下的文件(实现方法)
Jan 24 #Python
利用Python脚本实现ping百度和google的方法
Jan 24 #Python
解决python2.7用pip安装包时出现错误的问题
Jan 23 #Python
You might like
php 设计模式之 工厂模式
2008/12/19 PHP
在windows服务器开启php的gd库phpinfo中未发现
2013/01/13 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
2013/10/25 PHP
PHP中对于浮点型的数据需要用不同的方法解决
2014/03/11 PHP
php的curl封装类用法实例
2014/11/07 PHP
Div自动滚动到末尾的代码
2008/10/26 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
使用原生js实现页面蒙灰(mask)效果示例代码
2014/06/20 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
JQuery基础语法小结
2015/02/27 Javascript
解决WordPress使用CDN后博文无法评论的错误
2015/12/15 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
2016/02/22 Javascript
jQuery事件绑定用法详解
2016/09/08 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
2017/01/04 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
ES6中Generator与异步操作实例分析
2017/03/31 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
js学使用setTimeout实现轮循动画
2017/07/17 Javascript
vue.js前后端数据交互之提交数据操作详解
2018/04/24 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
Vue3.0中的monorepo管理模式的实现
2019/10/14 Javascript
js实现幻灯片轮播图
2020/08/14 Javascript
[06:21]完美世界亚洲区首席发行官竺琦TI3采访
2013/08/26 DOTA
[07:48]DOTA2上海特级锦标赛主赛事首日RECAP
2016/03/04 DOTA
用python登录Dr.com思路以及代码分享
2014/06/25 Python
详细介绍Python函数中的默认参数
2015/03/30 Python
两个命令把 Vim 打造成 Python IDE的方法
2016/03/20 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
python如何把字符串类型list转换成list
2020/02/18 Python
空指针到底是什么
2012/08/07 面试题
汽车技术服务英文求职信范文
2014/01/02 职场文书
创建卫生先进单位实施方案
2014/03/10 职场文书
商务助理求职信范文
2014/04/20 职场文书
邮政竞聘演讲稿
2014/09/03 职场文书
2014年为民办实事工作总结
2014/12/20 职场文书
药品销售员2015年终工作总结
2015/10/22 职场文书