堆 求最數大最小前k個sh

2021-08-04 08:07:28 字數 1563 閱讀 8331

用堆在海量資料中找出最大或最小的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的大根堆,然後依次讀入後序的資料,依次與大根堆的堆頂元素比較,若大於堆頂元素...