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操作CouchDB的方法
Oct 08 Python
python实现文件路径和url相互转换的方法
Jul 06 Python
Python变量作用范围实例分析
Jul 07 Python
举例详解Python中yield生成器的用法
Aug 05 Python
Python网络爬虫出现乱码问题的解决方法
Jan 05 Python
Python实现基于二叉树存储结构的堆排序算法示例
Dec 08 Python
简单了解什么是神经网络
Dec 23 Python
Python 修改列表中的元素方法
Jun 26 Python
解决django服务器重启端口被占用的问题
Jul 26 Python
Python3 io文本及原始流I/O工具用法详解
Mar 23 Python
使用tensorflow框架在Colab上跑通猫狗识别代码
Apr 26 Python
python如何将图片转换素描画
Sep 08 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
javascript 小型动画组件与实现代码
2010/06/02 PHP
浅析PHP中的字符串编码转换(自动识别原编码)
2013/07/02 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
PHP实现一维数组与二维数组去重功能示例
2018/05/24 PHP
JS中for循序中延迟加载动态效果的具体实现
2013/08/18 Javascript
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
javascript中使用new与不使用实例化对象的区别
2015/06/22 Javascript
js+html5实现的自由落体运动效果代码
2016/01/28 Javascript
20分钟轻松创建自己的Bootstrap站点
2016/05/12 Javascript
JavaScript实现计数器基础方法
2017/10/10 Javascript
Vue.js数字输入框组件使用方法详解
2019/10/19 Javascript
[03:48]2014DOTA2 TI专访71DK夺冠不靠小组赛高排名
2014/07/11 DOTA
利用python编写一个图片主色转换的脚本
2017/12/07 Python
用tensorflow实现弹性网络回归算法
2018/01/09 Python
Python pandas常用函数详解
2018/02/07 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
2018/04/19 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
python基于Selenium的web自动化框架
2019/07/14 Python
对python while循环和双重循环的实例详解
2019/08/23 Python
python实现PCA降维的示例详解
2020/02/24 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
Spartoo美国:欧洲排名第一的在线时装零售商
2019/12/12 全球购物
自我鉴定写作要点
2014/01/17 职场文书
2014升学宴答谢词
2014/01/26 职场文书
大学英语专业求职信
2014/06/21 职场文书
岗位职责说明书模板
2014/07/30 职场文书
感恩教师节演讲稿
2014/09/03 职场文书
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
高中校园广播稿3篇
2014/09/29 职场文书
个人求职自荐信范文
2015/03/06 职场文书
观后感的写法
2015/06/19 职场文书
先进基层党组织主要事迹材料
2015/11/03 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript