堆 heap 從海量資料中尋找最大的k個值

2021-10-05 07:52:03 字數 1171 閱讀 4108

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

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、執行結果:

從海量資料中找出中位數

題目 在乙個檔案中有 10g 個整數,亂序排列,要求找出中位數。記憶體限制為 2g。只寫出思路即可 記憶體限制為 2g的意思就是,可以使用2g的空間來執行程式,而不考慮這台機器上的其他軟體的占用記憶體 關於中位數 資料排序後,位置在最中間的數值。即將資料分成兩部分,一部分大於該數值,一部分小於該數值...

從海量資料中找出中位數

題目 在乙個檔案中有 10g 個整數,亂序排列,要求找出中位數。記憶體限制為 2g。只寫出思路即可 記憶體限制為 2g的意思就是,可以使用2g的空間來執行程式,而不考慮這台機器上的其他軟體的占用記憶體 關於中位數 資料排序後,位置在最中間的數值。即將資料分成兩部分,一部分大於該數值,一部分小於該數值...

如何從海量資料中迅速找到想要的資料?

今時今日,眾多企業在資料管理中所面臨的主要挑戰之一是如何從海量資料中獲得更多的價值,尤其是從企業自身一點一滴辛苦積累起來的資料中獲取價值。為了應對這個問題,近年來,很多公司都在資訊科技系統上進行了鉅額投資。但是,很多情況下種瓜未必得瓜,不菲的投入並未能給企業客戶帶來應有的回報 一些企業隨著業務量和資...