欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

堆(heap):从海量数据中寻找最大的k个值

程序员文章站 2024-03-15 21:13:06
...

                                     从海量数据中寻找最大的k个值

 

1、目的:获取大量元素 topk 大个元素,固定内存

2、思路:

    (1) 先放入元素前 k 个建立一个最小堆;

    (2) 迭代剩余元素:

        a、如果当前元素小于堆顶元素,跳过该元素(肯定不是前 k 大);

        b、否则替换堆顶元素为当前元素,并重新调整。

3、代码示例:

import heapq


class TopK():
    """
    获取大量元素 topk 大个元素,固定内存
    思路:
        1、先放入元素前 k 个建立一个最小堆;
        2、迭代剩余元素:
            如果当前元素小于堆顶元素,跳过该元素(肯定不是前 k 大)
            否则替换堆顶元素为当前元素,并重新调整堆
    """

    def __init__(self, iterable, k):
        self.minheap = []
        self.capacity = k
        self.iterable = iterable

    def push(self, value):
        if len(self.minheap) >= self.capacity:
            min_value = self.minheap[0]
            if value > min_value:
                # 返回并且pop堆顶最小值,推入新的 value 值并调整堆
                heapq.heapreplace(self.minheap, value)
        else:
            # 前 k 个元素直接放入 minheap
            heapq.heappush(self.minheap, value)

    def get_topk(self):
        for value in self.iterable:
            self.push(value)
        return self.minheap


if __name__ == "__main__":
    import random
    data_list = list(range(1000))
    random.shuffle(data_list)
    top_k = TopK(data_list, 10)
    print(top_k.get_topk())

4、运行结果:

    堆(heap):从海量数据中寻找最大的k个值

相关标签: python