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选择排序算法的实现代码
Nov 21 Python
Python实现统计英文单词个数及字符串分割代码
May 28 Python
python字符串连接方法分析
Apr 12 Python
python如何通过twisted实现数据库异步插入
Mar 20 Python
Python中循环引用(import)失败的解决方法
Apr 22 Python
Python 中的range(),以及列表切片方法
Jul 02 Python
python消费kafka数据批量插入到es的方法
Dec 27 Python
python实现三维拟合的方法
Dec 29 Python
Python 读取WAV音频文件 画频谱的实例
Mar 14 Python
解决jupyter notebook显示不全出现框框或者乱码问题
Apr 09 Python
Python+Opencv实现把图片、视频互转的示例
Dec 17 Python
Pycharm 如何设置HTML文件自动补全代码或标签
May 21 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程序的多种方法介绍
2014/11/06 PHP
wamp服务器访问php非常缓慢的解决过程
2015/07/01 PHP
php实现微信扫码支付
2017/03/26 PHP
js onpropertychange输入框 事件获取属性
2009/03/26 Javascript
利用WebBrowser彻底解决Web打印问题(包括后台打印)
2009/06/22 Javascript
js中switch case循环实例代码
2013/12/30 Javascript
Ext GridPanel加载完数据后进行操作示例代码
2014/06/17 Javascript
BootStrap Table对前台页面表格的支持实例讲解
2016/12/22 Javascript
jquery点赞功能实现代码 点个赞吧!
2020/05/29 jQuery
AngularJs实现聊天列表实时刷新功能
2017/06/15 Javascript
JS验证码实现代码
2017/09/14 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
使用Vue.observable()进行状态管理的实例代码详解
2019/05/26 Javascript
js prototype深入理解及应用实例分析
2019/11/25 Javascript
JS事件循环机制event loop宏任务微任务原理解析
2020/08/04 Javascript
[01:45]DOTA2众星出演!DSPL刀塔次级职业联赛宣传片
2014/11/21 DOTA
Python中super的用法实例
2015/05/28 Python
python实现线程池的方法
2015/06/30 Python
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
python中的字典使用分享
2016/07/31 Python
Python应用03 使用PyQT制作视频播放器实例
2016/12/07 Python
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
python3.6使用SMTP协议发送邮件
2020/05/20 Python
财务会计专业推荐信
2013/11/30 职场文书
农村党支部书记司法四风问题对照检查材料
2014/09/26 职场文书
项目转让协议书
2014/10/27 职场文书
老员工辞职信范文
2015/05/12 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
校园开放日新闻稿
2015/07/17 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
详解Python魔法方法之描述符类
2021/05/26 Python
Python多线程实用方法以及共享变量资源竞争问题
2022/04/12 Python
python的html标准库
2022/04/29 Python