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完全新手教程
Feb 08 Python
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
Aug 25 Python
Python切片用法实例教程
Sep 08 Python
详解Python中的正则表达式的用法
Apr 09 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
Apr 19 Python
Python实现基于PIL和tesseract的验证码识别功能示例
Jul 11 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
Jul 19 Python
python+opencv像素的加减和加权操作的实现
Jul 14 Python
django-rest-framework 自定义swagger过程详解
Jul 18 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
Nov 25 Python
Python基础之元类详解
Apr 29 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Apr 12 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编码转换函数应用技巧
2016/10/22 PHP
发一个自己用JS写的实用看图工具实现代码
2008/07/26 Javascript
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
复制js对象方法(详解)
2013/07/08 Javascript
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
2015/05/06 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
使用BootStrapValidator完成前端输入验证
2016/09/28 Javascript
Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件
2017/06/29 Javascript
微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析
2017/11/27 Javascript
详解JavaScript基础知识(JSON、Function对象、原型、引用类型)
2018/01/16 Javascript
Vue自定义弹窗指令的实现代码
2018/08/13 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
2019/09/18 Javascript
ES10的13个新特性示例(小结)
2019/09/23 Javascript
JavaScript碰撞检测原理及其实现代码
2020/03/12 Javascript
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
Js和VUE实现跑马灯效果
2020/05/25 Javascript
[00:17]游戏风云独家报道:DD赛后说出数字秘密 吓死你们啊!
2014/07/13 DOTA
Python字符编码与函数的基本使用方法
2017/09/30 Python
Python使用SQLite和Excel操作进行数据分析
2018/01/20 Python
Python 获得命令行参数的方法(推荐)
2018/01/24 Python
python中使用psutil查看内存占用的情况
2018/06/11 Python
Python使用进程Process模块管理资源
2020/03/05 Python
Spartoo芬兰:欧洲最大的网上鞋店
2016/08/28 全球购物
玛蒂尔达简服装:Matilda Jane Clothing
2019/02/13 全球购物
奥地利时尚、美容、玩具和家居之家:Kastner & Öhler
2020/04/26 全球购物
EJB3推出JPA的原因
2013/10/16 面试题
机电一体化大学生求职信
2013/11/08 职场文书
元旦晚会邀请函
2014/02/01 职场文书
英语教学随笔感言
2014/02/20 职场文书
租赁协议书
2015/01/27 职场文书
广告业务员岗位职责
2015/02/13 职场文书
撤诉申请书法院范本
2015/05/18 职场文书
Python词云的正确实现方法实例
2021/05/08 Python
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis
SQL Server数据库备份和恢复数据库的全过程
2022/06/14 SQL Server