Python 妙用heapq

简介: 小顶堆求TopK大大顶堆求BtmK小题外话Python有一个内置的模块,heapq标准的封装了最小堆的算法实现。下面看两个不错的应用。小顶堆(求TopK大)话说需求是这样的: 定长的序列,求出TopK大的数据。

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])

题外话

目录
相关文章
|
4月前
|
开发者 Python
Python字符串处理实用技巧
【7月更文挑战第25天】本文汇总了20项Python字符串处理的实用技巧,包括使用`split()`与`join()`方法进行字符串分割与连接,利用`strip()`去除空白字符,借助列表推导式处理字符串列表,以及采用`startswith()`和`endswith()`检查字符串边界。此外,还介绍了`replace()`方法替换子串、`find()`及`index()`定位子串位置、`count()`统计子串出现次数、使用切片操作截取子串、正则表达式进行复杂匹配、字符串类型判断方法如`isalpha()`和`isdigit()`、字符串大小写转换与规范化(`lower()`, `upper(
58 1
|
5月前
|
算法 索引 Python
Python十段经典代码总结
Python十段经典代码总结
32 0
|
Python 容器
【Python基础】Python函数
【Python基础】Python函数
74 0
|
11月前
|
C++ Python
Python(二十四)python函数(2)
四:函数返回值 return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值, ini 复制代码 def sumToNumberReturn(a,b = 10): sum = 2 * a + 2 * b return sum a = 10 b = 20 # 将返回值 赋值给sum sum = sumToNumberReturn(a,b) print("2 * %d + 2 * %d = %d" % (a,b,sum)) 输出: 2 * 10 + 2 * 20 = 60
67 1
|
11月前
|
前端开发 Shell C#
Python(二十三)python字符串比较
Python字符串比较本身是属于python字符串的一部分。 为什么把他拿出来单独说呢,我之前是做web开发,也接触过C#开发,在这两门语言中的字符串比较与python中的字符串比较稍有不同 Python可以使用相等(==)和比较(<,>,!=,<=,> =)运算符执行Python字符串比较。 没有比较两个字符串的特殊方法。 而我目前接触到的其他几门语言 字符串比较好像是只有 == 与 != 两种操作,当然,我也没有在除python的语言中用过 >= 与 <= 来比较字符串。 我们先大概了解下python字符串比较的规则与原理: 比较规则:首先比较两个字符串中的第一个字符,如果相等则继续比较下
135 0
|
11月前
|
存储 前端开发 C++
Python(二十四)python函数(1)
(2):以字典的形式存储已命名的参数(字数可变的关键参数) 加了两个星号 ** 的参数会以字典的形式导入。存放已命名的变量参数。 python
66 0
|
11月前
|
前端开发 Shell 索引
Python(二十二)python切片的相关概念总结
首先,要注意一件事,在python中,字符串,元组,列表的取值都可以使用下标来实现。 其实切片这个用法之前在看列表和元组的时候,提到过。 说白了其实就是根据索引获取元素。只是在python中,给他起了个名字叫切片。 一:切片操作语法 一个完整的切片表达式包含两个“:”,用于分隔三个参数(start_index、end_index、step)。当只有一个“:”时,默认第三个参数step=1;当一个“:”也没有时,start_index=end_index,表示切取start_index指定的那个元素。 切片操作基本表达式: css 复制代码 object[start_index:end_in
148 0
|
Python
Python中的各种装逼语法
Python中的各种装逼语法
164 0
|
Python
重温Python初识函数的基本使用方法
重温Python初识函数的基本使用方法
146 0
下一篇
无影云桌面