最大堆 最小堆 解決TOPK問題

2021-07-09 22:01:59 字數 905 閱讀 6284

堆:實質是一顆完全二叉樹,最大堆的特點:父節點值均大於子節點;最小堆的父節點值均小於子節點;

一般使用連續記憶體儲存堆內的值,因而可以根據當前節點的索引值推斷子節點的索引值:

節點i的父節點為(i-1)/2;

節點j的左子結點:j * 2 + 1;

節點j的右子結點:j * 2 + 2;

以下**實現了最大堆最小堆,當比較函式使用std::greater,得到最大堆,當比較函式使用std::less得到最小堆;

關鍵是考慮清楚小頂堆用於找最大,大頂推用於找最小,其他都簡單。

大最小堆

#pragma once

#include using namespace std;

template void mswap(t &a, t &b)

template >

class maxminheap

; ~maxminheap(void)

;void headadd(t num)

else

};//最大堆排序後得到公升序序列;最小堆排序後得到降序序列

void sort()

}void gethnum(t &n)//獲取最大堆的最小值或者最小堆的最大值

;void heapfixup(int index)

data[index]=tmp;

};//從節點index開始進行向下調整

void heapfixdown(int index, int n)

for (int i = 0 ; i < 20 ; ++i)

test.sort();

for (int i = 0 ; i < 20 ; ++i)

cout

}

最大堆 最小堆Java實現,解決TOP K問題

最大堆,最小堆類似,以下以最小堆為例進行講解。最小堆是滿足以下條件的資料結構 它是一棵完全二叉樹 所有父節點的值小於或等於兩個子節點的值 除了最後一層之外的其他每一層都被完全填充,並且所有結點都保持向左對齊。對於topk問題,解決方法有很多 方法一 對源資料中所有資料進行排序,取出前k個資料,就是t...

最大堆 最小堆

堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於 或不小於 其左孩子和右孩子節點的值。最大堆和最小堆是 二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最...

最大堆 最小堆

堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點分別是節點i的左...