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实现的Kmeans++算法实例
Apr 26 Python
Python的垃圾回收机制深入分析
Jul 16 Python
Python代码的打包与发布详解
Jul 30 Python
python开发之字符串string操作方法实例详解
Nov 12 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
Jul 25 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
Mar 04 Python
windows中安装Python3.8.0的实现方法
Nov 19 Python
深入浅析python变量加逗号,的含义
Feb 22 Python
python 两个一样的字符串用==结果为false问题的解决
Mar 12 Python
Pytorch实验常用代码段汇总
Nov 19 Python
关于python中模块和重载的问题
Nov 02 Python
python字符串的一些常见实用操作
Apr 06 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
一个取得文件扩展名的函数
2006/10/09 PHP
PHP之autoload运行机制实例分析
2014/08/28 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
2015/05/12 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
2016/05/13 PHP
[JS]点出统计器
2020/10/11 Javascript
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
javascript实现div浮动在网页最顶上并带关闭按钮效果实例
2013/08/13 Javascript
window.location.href = window.location.href 跳转无反应 a超链接onclick事件写法
2013/08/21 Javascript
用js的document.write输出的广告无阻塞加载的方法
2014/06/05 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
Javascript数据结构与算法之列表详解
2015/03/12 Javascript
JavaScript控制网页层收起和展开效果的方法
2015/04/15 Javascript
Node.js刷新session过期时间的实现方法推荐
2016/05/18 Javascript
基于javaScript的this指向总结
2017/07/22 Javascript
laravel5.4+vue+element简单搭建的示例代码
2017/08/29 Javascript
微信小程序支付及退款流程详解
2017/11/30 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
2018/11/05 Javascript
利用React高阶组件实现一个面包屑导航的示例
2020/08/23 Javascript
快速解决vue2+vue-cli3项目ie兼容的问题
2020/11/17 Vue.js
Vue实现图书管理案例
2021/01/20 Vue.js
Python读取ini文件、操作mysql、发送邮件实例
2015/01/01 Python
在Python的while循环中使用else以及循环嵌套的用法
2015/10/14 Python
浅谈python函数之作用域(python3.5)
2017/10/27 Python
基于DataFrame改变列类型的方法
2018/07/25 Python
Python最小二乘法矩阵
2019/01/02 Python
Python3.5 Pandas模块之Series用法实例分析
2019/04/23 Python
Python closure闭包解释及其注意点详解
2019/08/28 Python
python 制作本地应用搜索工具
2021/02/27 Python
animation和transition的区别
2020/10/12 HTML / CSS
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
美国保健品专家:Life Extension
2018/05/04 全球购物
如何进行有效的自我评价
2013/09/27 职场文书
建设幸福中国演讲稿
2014/09/11 职场文书
第一书记观后感
2015/06/08 职场文书
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS