最小的k個數(最大堆,海量資料)

2021-09-27 16:13:43 字數 1299 閱讀 4167

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。

思路:維護乙個大小為k的最大堆,先初始化前k個數,然後滑動視窗,如果比堆頂大,直接拋棄,比堆頂小交換再調整堆。

# -*- coding:utf-8 -*-

class solution:

def getleastnumbers_solution(self, tinput, k):

# write code here

heap = self.build_heap(tinput[:k])

for i in range(k, len(tinput)):

if tinput[i] >= heap[0]:

continue

else:

heap[0] = tinput[i]

for i in range(k-1,-1,-1):

self.adjust_heap(heap, 0, k)

print heap

return heap

def adjust_heap(self, tinput, root, heap_size):

left = 2*root+1

right = left + 1

larger = root

if left < heap_size and tinput[left] > tinput[root]:

larger = left

if right < heap_size and tinput[right] > tinput[root]:

larger = right

if larger != root:

tinput[root], tinput[larger] = tinput[larger], tinput[root]

self.adjust_heap(tinput, larger, heap_size)

def build_heap(self, heap):

heapsize = len(heap)

for i in range((heapsize-1)//2, -1, -1):

self.adjust_heap(heap,i, heapsize)

return heap

s = [4,5,1,6,2,7,3,8,435,32,13,5,2,99,0,-67,-7,56,35,637,73,2]

m = solution()

m.getleastnumbers_solution(s, 8)

查詢最大的K個數 查詢最小的K個數

使用乙個容器,大小為k 用這個容器來儲存這最大的或者最小的k個數。如果是找最大的k個數,那麼,每次和容器中的最小元素比較,如果最小的元素小於當前元素,那麼刪除這個最小的元素,同時將當前元素插入 如果是找最小的k個數,那麼就和容器中最大的元素比較。同理。容器用哪個呢?容器選擇用set,set本身就是排...

在海量資料中找到最大的前K個數(top K問題)

問題分析 資料是海量的,可能達到10億或者100億以上,只需要找最大的前100個數。所以將資料一次性排序然後取前100個是不太可取的操作。做了很多無用功,並且記憶體一次性也載入不了海量資料。解決方案 方案一 堆。一般說在很多資料中取前多少個資料,我們都會想到堆,這裡我們使用堆來解決問題。首先取k個數...

用堆排序的思想求最小的k個數,處理海量資料

最小的k個數 輸入n個整數,輸出其中最小的k個數 解答 雖然利用快排的思想很好的解決了問題,但是也有限制,首先我們需要一次性讀入所以的資料,其次,需要修改輸入的陣列 利用堆排序來解決此問題,此種方法適合處理海量資料 首先我們先讀入k個元素建立乙個大小為k的大根堆,然後我們依次讀入剩下的資料,如果當前...