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中list常用操作实例详解
Jun 03 Python
python django事务transaction源码分析详解
Mar 17 Python
利用python实现xml与数据库读取转换的方法
Jun 17 Python
Python实现复杂对象转JSON的方法示例
Jun 22 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
Nov 17 Python
Python爬虫设置代理IP的方法(爬虫技巧)
Mar 04 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
python3的print()函数的用法图文讲解
Jul 16 Python
python利用dlib获取人脸的68个landmark
Nov 27 Python
python opencv实现gif图片分解的示例代码
Dec 13 Python
解决python使用list()时总是报错的问题
May 05 Python
python 如何快速复制序列
Sep 07 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函数in_array()使用详解
2014/08/20 PHP
详解WordPress中简码格式标签编写的基本方法
2015/12/22 PHP
PHP获取文件扩展名的方法实例总结
2017/06/10 PHP
PHP Trait功能与用法实例分析
2020/06/03 PHP
让textarea控件的滚动条怎是位与最下方
2007/04/20 Javascript
JavaScript之Object类型介绍
2015/04/01 Javascript
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
js清除浏览器缓存的几种方法
2017/03/15 Javascript
vue弹窗组件使用方法
2018/04/28 Javascript
vue-cli项目中使用Mockjs详解
2018/05/14 Javascript
如何基于jQuery实现五角星评分
2020/09/02 jQuery
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
五句话帮你轻松搞定js原型链
2020/12/09 Javascript
javascript代码实现简易计算器
2021/01/25 Javascript
Python中动态获取对象的属性和方法的教程
2015/04/09 Python
Python数据类型学习笔记
2016/01/13 Python
Python中元组,列表,字典的区别
2017/05/21 Python
Python+OpenCV实现图像融合的原理及代码
2018/12/03 Python
python图像处理入门(一)
2019/04/04 Python
pandas 缺失值与空值处理的实现方法
2019/10/12 Python
python实现二分类的卡方分箱示例
2019/11/22 Python
python爬虫基础之urllib的使用
2020/12/31 Python
新加坡鲜花速递/新加坡网上花店:Ferns N Petals
2020/08/29 全球购物
财会自我鉴定范文
2013/12/27 职场文书
学生党员思想汇报
2013/12/28 职场文书
行政内勤岗位职责
2014/04/07 职场文书
《莫泊桑拜师》教学反思
2014/04/23 职场文书
大学新学期计划书
2014/04/28 职场文书
大学活动总结格式
2014/04/29 职场文书
考博专家推荐信
2014/05/10 职场文书
设计师求职信
2014/07/01 职场文书
汽车车尾标语大全
2015/08/11 职场文书
市级三好生竞选稿
2015/11/21 职场文书
《兰兰过桥》教学反思
2016/02/20 职场文书
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang
Python如何快速找到多个字典中的公共键(key)
2022/04/29 Python