20170927 利用大根堆求出最小的K個數

2021-08-08 19:46:07 字數 1055 閱讀 6932

20170927_利用大根堆求出最小的k個數

當資料量比較大而記憶體一次性裝不下的時候,想要對求出資料中最小的k個數,

則可以採用大根堆,維護乙個含有k個數的大根堆,這個堆中的所有元素就是所求。

首先,讀入k個數建立乙個大小為k的大根堆,然後依次讀入後序的資料,依次與大根堆的堆頂元素比較,

若大於堆頂元素,則直接拋棄該元素、讀入下乙個元素。

若小於堆頂元素,則該元素屬於最小的k個元素之一,需要用它來替換堆頂元素,然後再從堆頂元素開始維護這個大根堆。

直到所有元素都比較完為止,這個堆中的所有元素就是所求。

//大根堆的應用_陣列中查詢最小的k個數

/*當資料量比較大而記憶體一次性裝不下的時候,想要對求出資料中最小的k個數,

則可以採用大根堆,維護乙個含有k個數的大根堆,這個堆中的所有元素就是所求。

首先,讀入k個數建立乙個大小為k的大根堆,然後依次讀入後序的資料,依次與大根堆的堆頂元素比較,

若大於堆頂元素,則直接拋棄該元素、讀入下乙個元素。

若小於堆頂元素,則該元素屬於最小的k個元素之一,需要用它來替換堆頂元素,然後再從堆頂元素開始維護這個大根堆。

直到所有元素都比較完為止,這個堆中的所有元素就是所求。

*/#include#include#include#include#include#includeusing namespace std;

//建立大根堆——>自上而下的重新調整堆結構

void sift(int r, int k, int m) }}

//建立大根堆——>迴圈建立

void creatbigheap(int r, int n)

//主函式

int main(void)

; int *b=new int(k);

for(int i=0; i=b[i]) //若大於堆頂元素

continue;

else //若小於堆頂元素

}system("pause");

return 0;

}

堆(大根堆 小根堆)

堆又可稱之為完全二叉堆。這是乙個邏輯上基於完全二叉樹 物理上一般基於線性資料結構 如陣列 向量 鍊錶等 的一種資料結構。學習過完全二叉樹的同學們都應該了解,完全二叉樹在物理上可以用線性資料結構進行表示 或者儲存 例如陣列int a 5 就可以用來描述乙個擁有5個結點的完全二叉樹。那麼基於完全二叉樹的...

堆(Heap)大根堆 小根堆

具有以下的特點 1 完全二叉樹 2 heap中儲存的值是偏序 min heap 父節點的值小於或等於子節點的值 max heap 父節點的值大於或等於子節點的值 一般都用陣列來表示堆,i結點的父結點下標就為 i 1 2。它的左右子結點下標分別為2 i 1和2 i 2。如第0個結點左右子結點下標分別為...

堆(Heap)大根堆 小根堆

目錄一般都用陣列來表示堆,i結點的父結點下標就為 i 1 2。它的左右子結點下標分別為2 i 1和2 i 2。如第0個結點左右子結點下標分別為1和2。插入乙個元素 新元素被加入到heap的末尾,然後更新樹以恢復堆的次序。每次插入都是將新資料放在陣列最後。可以發現從這個新資料的父結點到根結點必然為乙個...