輸入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的大根堆,然後我們依次讀入剩下的資料,如果當前...