zoukankan      html  css  js  c++  java
  • Python 用最小堆获取大量元素 topk 大个元素

    import heapq
    class TopK:
        """
        获取大量元素 topk 大个元素,固定内存
        思路:
        1. 先让入元素前 k 个建立一个最小堆
        2. 迭代剩余元素:
            如果当前元素小于堆顶元素,跳过该元素
            否则替换堆顶元素为当前元素,并重新调整堆
        """
        def __init__(self, iterable, k):
            self.minheap = []
            self.capacity = k
            self.iterable = iterable
    
        def push(self, val):
            if len(self.minheap) >= self.capacity:
                min_val = self.minheap[0]
                if val < min_val:
                    pass
                else:
                    heapq.heapreplace(self.minheap, val)  # 返回并且pop堆顶最小值,推入新的 val 并调整堆
            else:
                heapq.heappush(self.minheap, val)  # 前面 k 个值直接放入minheap
    
        def get_topk(self):
            for val in self.iterable:
                self.push(val)
            return self.minheap
    
    
    def test():
        import random
        i = list(range(1000))
        random.shuffle(i)
        _ = TopK(i, 10)
        res = _.get_topk()
        print(sorted(res))
    
    
    test()
    
  • 相关阅读:
    Gitee + PicGo搭建图床 & Typora上传图片到图床
    算法思维 ---- 双指针法
    Floyd's cycle-finding algorithm
    Boyer-Moore Voting Algorithm
    youtube-dl 使用小记
    算法思维 ---- 滑动窗口
    Memo
    英语
    BZOJ 3270
    BZOJ 3196
  • 原文地址:https://www.cnblogs.com/jiaoran/p/14589864.html
Copyright © 2011-2022 走看看