用堆在海量資料中找出最大或最小的k個數,效率非常高。
1、在一組資料中找出最小的k個數
解題思路:
要找出最小的k個數,我們可以先用這組資料中的k個數構建一棵「最大堆」,然後再將剩下的元素與堆頂元素相比。如果大於堆頂元素,則不做處理,繼續向下比較。如果小於堆頂元素,則將堆頂元素與這個元素交換,然後再恢復堆序,繼續向下比較。這樣的話最後這個堆裡面儲存的就是最小的k個數。
例:在裡面找出最小的4個數
1、用前四個數構造一顆最大堆
(2、用剩下的數與堆頂元素進行比較,如圖:
2、在一組堆中找出最大的前k個數
與找最小的數是相同的道理,不過找最大的數時要建立乙個k個數的最小堆。
時間複雜度分析:
建立乙個k個數的堆:o(k*lgk)
向後比較:o((n-k)*lgk)
時間複雜度為:o(n*lgk)
[cpp]view plain
copy
//**
#pragma once
#include
#include
using
namespace
std;
template
<
typename
t>
struct
smallnum
//求最小的數,建最大堆
};
template
<
typename
t>
struct
greatnum
//求最大的數,建最小堆
};
template
<
typename
t,class
compare=smallnum>
//預設求最小的k個數
class
heapsearch
heapsearch(t* a, int
size,
intk)
for(int
i = (k - 2) / 2; i >= 0; --i)
findknum(a,size,k);
} void
display()
cout <
} protected
: void
adjustdown(
introot,
intk)
else
} } void
findknum(t*a ,
intsize,
intk)
} } private
: vector_a;
};
利用堆求最大或最小的前k個數
用堆在海量資料中找出最大或最小的k個數,效率非常高。1 在一組資料中找出最小的k個數 解題思路 要找出最小的k個數,我們可以先用這組資料中的k個數構建一棵 最大堆 然後再將剩下的元素與堆頂元素相比。如果大於堆頂元素,則不做處理,繼續向下比較。如果小於堆頂元素,則將堆頂元素與這個元素交換,然後再恢復堆...
對頂堆,求第K大的數
對頂堆,顧名思義就是兩個相對的堆。o logn 0即上方是乙個維護最小值的小根堆smheap,下方則維護最大值的大根堆bgheap。利用這樣的性質,我們就可以求中位數 動態維護k大值。優先佇列是用堆來實現的。思路 我們必須保證小根堆裡面的所有值是大於大根堆裡面所有值的 1.如果要插入的值x smhe...
20170927 利用大根堆求出最小的K個數
20170927 利用大根堆求出最小的k個數 當資料量比較大而記憶體一次性裝不下的時候,想要對求出資料中最小的k個數,則可以採用大根堆,維護乙個含有k個數的大根堆,這個堆中的所有元素就是所求。首先,讀入k個數建立乙個大小為k的大根堆,然後依次讀入後序的資料,依次與大根堆的堆頂元素比較,若大於堆頂元素...