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字符串处理实例详解
May 18 Python
对python使用http、https代理的实例讲解
May 07 Python
解决python大批量读写.doc文件的问题
May 08 Python
Django rest framework工具包简单用法示例
Jul 20 Python
Python实现快速傅里叶变换的方法(FFT)
Jul 21 Python
python 获取url中的参数列表实例
Dec 18 Python
用python做游戏的细节详解
Jun 25 Python
python 实现将多条曲线画在一幅图上的方法
Jul 07 Python
解决Pycharm 导入其他文件夹源码的2种方法
Feb 12 Python
Python接口自动化判断元素原理解析
Feb 24 Python
Python多线程Threading、子线程与守护线程实例详解
Mar 24 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
Jan 06 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 stripslashes和addslashes的区别
2014/02/03 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
2016/09/11 PHP
PHP htmlentities()函数用法讲解
2019/02/25 PHP
PHP SESSION跨页面传递失败解决方案
2020/12/11 PHP
一个简单的js渐显(fadeIn)渐隐(fadeOut)类
2010/06/19 Javascript
妙用Jquery的val()方法
2012/06/27 Javascript
Jquery判断form表单数据是否变化
2016/03/30 Javascript
vue使用$emit时,父组件无法监听到子组件的事件实例
2018/02/26 Javascript
angular2 ng2-file-upload上传示例代码
2018/08/23 Javascript
JS实现时间校验的代码
2020/05/25 Javascript
vue在图片上传的时候压缩图片
2020/11/18 Vue.js
vue 通过base64实现图片下载功能
2020/12/19 Vue.js
ES6字符串的扩展实例
2020/12/21 Javascript
Python牛刀小试密码爆破
2011/02/03 Python
实例讲解Python的函数闭包使用中应注意的问题
2016/06/20 Python
python模块之re正则表达式详解
2017/02/03 Python
Scrapy爬虫实例讲解_校花网
2017/10/23 Python
Python简单过滤字母和数字的方法小结
2019/01/09 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
python制作图片缩略图
2019/04/30 Python
Python3安装pip工具的详细步骤
2019/10/14 Python
Django项目中使用JWT的实现代码
2019/11/04 Python
python+selenium 脚本实现每天自动登记的思路详解
2020/03/11 Python
虚拟机下载python是否需要联网
2020/07/27 Python
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
美国新娘礼品店:The Paisley Box
2020/09/08 全球购物
高校教师思想汇报
2014/01/11 职场文书
教师求职自荐书
2014/06/14 职场文书
学生安全责任书范本
2014/07/24 职场文书
2014年教研员工作总结
2014/12/23 职场文书
承诺保证书格式
2015/02/28 职场文书
2015年医院药剂科工作总结
2015/05/04 职场文书
2015年计划生育协会工作总结
2015/05/13 职场文书
军训新闻稿范文
2015/07/17 职场文书
感恩父母主题班会
2015/08/12 职场文书
python 中的@运算符使用
2021/05/26 Python