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获取远程图片大小和尺寸的方法
Mar 26 Python
初步讲解Python中的元组概念
May 21 Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
Nov 20 Python
如何在Python中编写并发程序
Feb 27 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
Nov 07 Python
python3使用QQ邮箱发送邮件
May 20 Python
python 列表输出重复值以及对应的角标方法
Jun 11 Python
使用Python轻松完成垃圾分类(基于图像识别)
Jul 09 Python
python监控进程状态,记录重启时间及进程号的实例
Jul 15 Python
Django框架配置mysql数据库实现过程
Apr 22 Python
python 实时调取摄像头的示例代码
Nov 25 Python
python 如何引入协程和原理分析
Nov 30 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中对数据库操作的封装
2006/10/09 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
php实现PDO中捕获SQL语句错误的方法
2017/02/16 PHP
JSON 学习之完全手册 图文
2007/05/29 Javascript
5个javascript的数字格式化函数分享
2011/12/07 Javascript
js如何调用qq互联api实现第三方登录
2014/03/28 Javascript
浅谈javascript回调函数
2014/12/07 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
基于jQuery实现的QQ表情插件
2015/08/25 Javascript
jQuery ui实现动感的圆角渐变网站导航菜单效果代码
2015/08/26 Javascript
基于BootStrap的Metronic框架实现页面链接收藏夹功能按钮移动收藏记录(使用Sortable进行拖动排序)
2016/08/29 Javascript
JS 循环li添加点击事件 (闭包的应用)
2016/12/10 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
jQuery实现简单轮播图效果
2020/12/27 jQuery
python实现调用其他python脚本的方法
2014/10/05 Python
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
Python sqlite3事务处理方法实例分析
2017/06/19 Python
python如何统计序列中元素
2020/07/31 Python
python3库numpy数组属性的查看方法
2018/04/17 Python
Python 多维List创建的问题小结
2019/01/18 Python
Python 堆叠柱状图绘制方法
2019/07/29 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
Python如何重新加载模块
2020/07/29 Python
基于Python实现体育彩票选号器功能代码实例
2020/09/16 Python
Django集成MongoDB实现过程解析
2020/12/01 Python
CSS3用@font-face实现自定义英文字体
2013/09/23 HTML / CSS
英国电子专家:maplin
2019/09/04 全球购物
优秀的茶餐厅创业计划书
2014/01/03 职场文书
电子商务专业学生职业生涯规划
2014/03/07 职场文书
办公室文员工作自我鉴定
2014/09/19 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
小学五年级(说明文3篇)
2019/08/13 职场文书
哪类餐饮行业,最适合在高校创业?
2019/08/19 职场文书
详解vue身份认证管理和租户管理
2021/05/25 Vue.js
教你怎么用python selenium实现自动化测试
2021/05/27 Python
英镑符号 £
2022/02/17 杂记