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爬虫包 BeautifulSoup  递归抓取实例详解
Jan 28 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
May 18 Python
Python装饰器知识点补充
May 28 Python
python3解析库BeautifulSoup4的安装配置与基本用法
Jun 26 Python
Python错误处理操作示例
Jul 18 Python
Django文件存储 默认存储系统解析
Aug 02 Python
Python PyPDF2模块安装使用解析
Jan 19 Python
python实现飞机大战项目
Mar 11 Python
使用keras和tensorflow保存为可部署的pb格式
May 25 Python
python如何使用腾讯云发送短信
Sep 17 Python
python自动打开浏览器下载zip并提取内容写入excel
Jan 04 Python
Python 流媒体播放器的实现(基于VLC)
Apr 28 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 图片文件上传实现代码
2010/12/29 PHP
php多文件上传功能实现原理及代码
2013/04/18 PHP
解决PHP超大文件下载,断点续传下载的方法详解
2013/06/06 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
2015/09/22 PHP
yii2中添加验证码的实现方法
2016/01/09 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
2016/10/21 PHP
PHP设计模式之委托模式定义与用法简单示例
2018/08/13 PHP
Javascript 获取滚动条位置等信息的函数
2009/09/08 Javascript
Bookmarklet实现启动jQuery(模仿 云输入法)
2010/09/15 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
早该知道的7个JavaScript技巧
2016/06/21 Javascript
NodeJs读取JSON文件格式化时的注意事项
2016/09/25 NodeJs
详解springmvc 接收json对象的两种方式
2016/12/06 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
2017/01/13 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
React中jquery引用的实现方法
2017/09/12 jQuery
浅谈函数调用的不同方式,以及this的指向
2017/09/17 Javascript
详解JavaScript事件循环机制
2018/09/07 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
微信小程序自定义yPicker组件实现省市区三级联动功能
2020/10/29 Javascript
原生js实现移动小球(碰撞检测)
2020/12/17 Javascript
python 布尔操作实现代码
2013/03/23 Python
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
用Django写天气预报查询网站
2018/10/21 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
2019/04/18 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
django ajax发送post请求的两种方法
2020/01/05 Python
Python常用模块函数代码汇总解析
2020/08/31 Python
SNIDEL官网:日本VIVI杂志人气少女第一品牌
2020/03/12 全球购物
机械绘图员岗位职责
2013/11/19 职场文书
拓展培训心得体会
2014/01/04 职场文书
个人简历自我评价
2014/02/02 职场文书
大学感恩节活动总结
2015/05/05 职场文书
vue 实现上传组件
2021/05/31 Vue.js
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技