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的末尾,然後更新樹以恢復堆的次序。每次插入都是將新資料放在陣列最後。可以發現從這個新資料的父結點到根結點必然為乙個...