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 相关文章推荐
在类Unix系统上开始Python3编程入门
Aug 20 Python
python开发之list操作实例分析
Feb 22 Python
Python处理XML格式数据的方法详解
Mar 21 Python
python pandas修改列属性的方法详解
Jun 09 Python
itchat-python搭建微信机器人(附示例)
Jun 11 Python
使用pandas读取文件的实现
Jul 31 Python
python利用JMeter测试Tornado的多线程
Jan 12 Python
python代码如何注释
Jun 01 Python
利用python绘制中国地图(含省界、河流等)
Sep 21 Python
Python 列表推导式需要注意的地方
Oct 23 Python
python 定义函数 返回值只取其中一个的实现
May 21 Python
python 爬取京东指定商品评论并进行情感分析
May 27 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&amp;mysql(一)
2006/10/09 PHP
深入php socket的讲解与实例分析
2013/06/13 PHP
解析php安全性问题中的:Null 字符问题
2013/06/21 PHP
PHP Laravel 上传图片、文件等类封装
2017/08/16 PHP
PHP异步进程助手async-helper
2018/02/05 PHP
PHP中localeconv()函数的用法
2019/03/26 PHP
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
js实现飞入星星特效代码
2014/10/17 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
ECMAScript6函数默认参数
2015/06/12 Javascript
jQuery AjaxUpload 上传图片代码
2016/02/02 Javascript
Document.body.scrollTop的值总为零的快速解决办法
2016/06/09 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
jquery实现点击页面回到顶部
2016/11/23 Javascript
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
vue不通过路由直接获取url中参数的方法示例
2017/08/24 Javascript
JavaScript事件委托原理与用法实例分析
2018/06/07 Javascript
JS使用Prim算法和Kruskal算法实现最小生成树
2019/01/17 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
跟老齐学Python之不要红头文件(2)
2014/09/28 Python
Python 多线程抓取图片效率对比
2016/02/27 Python
python将unicode转为str的方法
2017/06/21 Python
在Django中URL正则表达式匹配的方法
2018/12/20 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
使用python实现多维数据降维操作
2020/02/24 Python
Python基础之字符串常见操作经典实例详解
2020/02/26 Python
巴黎卡诗美国官方网站:始于1964年的头发头皮护理专家
2017/07/10 全球购物
如何转换一个字符串到enum值
2014/04/12 面试题
设计部经理的岗位职责
2013/11/16 职场文书
创业计划书如何编写
2014/02/06 职场文书
辅导员评语
2014/05/04 职场文书
新农村建设汇报材料
2014/08/15 职场文书
工作作风懒散检讨书
2014/10/29 职场文书
迟到检讨书
2015/01/26 职场文书