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字符串和文件操作常用函数分析
Apr 08 Python
使用python检测主机存活端口及检查存活主机
Oct 12 Python
用Python写冒泡排序代码
Apr 12 Python
python win32 简单操作方法
May 25 Python
python实现在IDLE中输入多行的方法
Apr 19 Python
python绘制简单彩虹图
Nov 19 Python
使用 Supervisor 监控 Python3 进程方式
Dec 05 Python
详解Python中的分支和循环结构
Feb 11 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
Feb 26 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
Oct 19 Python
python 递归相关知识总结
Mar 03 Python
Python编写nmap扫描工具
Jul 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
dedecms集成财付通支付接口
2014/12/28 PHP
php设置页面超时时间解决方法
2015/09/22 PHP
Codeigniter中集成smarty和adodb的方法
2016/03/04 PHP
PHP实现RTX发送消息提醒的实例代码
2017/01/03 PHP
Laravel 模型关联基础教程详解
2019/09/17 PHP
使用js显示当前时间示例
2014/03/02 Javascript
javascript读写json示例
2014/04/11 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
2014/06/06 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
Bootstrap每天必学之附加导航(Affix)插件
2016/04/25 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
2016/05/19 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
js返回顶部实例分享
2016/12/21 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
关于vue单文件中引用路径的处理方法
2018/01/08 Javascript
基于vue中keep-alive缓存问题的解决方法
2018/09/21 Javascript
React项目动态设置title标题的方法示例
2018/09/26 Javascript
使用JS获取页面上的所有标签
2018/10/18 Javascript
vue组件之间通信方式实例总结【8种方式】
2019/02/22 Javascript
浅析Angular 实现一个repeat指令的方法
2019/07/21 Javascript
layUI实现前端分页和后端分页
2019/07/27 Javascript
Vue使用自定义指令实现拖拽行为实例分析
2020/06/06 Javascript
Python抽象类的新写法
2015/06/18 Python
python 利用文件锁单例执行脚本的方法
2019/02/19 Python
Python 读取串口数据,动态绘图的示例
2019/07/02 Python
python matplotlib拟合直线的实现
2019/11/19 Python
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
学生实习介绍信
2014/01/15 职场文书
工程专业求职自荐书范文
2014/02/08 职场文书
核心价值观演讲稿
2014/05/13 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
2015年度党员自我评价范文
2015/03/03 职场文书
老人院义工活动感想
2015/08/07 职场文书
宝宝满月祝酒词
2015/08/10 职场文书
2016中秋节广告语
2016/01/28 职场文书
导游词之寿县报恩寺
2020/01/19 职场文书