CS
[μλ£κ΅¬μ‘°] ν (Heap)
moaoh
2024. 11. 8. 02:11
ν (Heap) λ?
- νΉμν νΈλ¦¬ κΈ°λ° λ°μ΄ν° ꡬ쑰
- νμ μ°μ μμ νλ₯Ό ꡬννκΈ° μν μμ μ΄μ§ νΈλ¦¬ ννμ μλ£κ΅¬μ‘°
- μ΅λ ν (Max Heap)κ³Ό μ΅μ ν(Min Heap) μ΄ 2κ°μ§κ° μ‘΄μ¬νλ€.
μ΅λ ν (Max Heap)
- λΆλͺ¨μ λ Έλκ° νμ μμμ λ Έλλ³΄λ€ ν° κ΅¬μ‘°
- νμͺ½ λ Έλλ§ κ³μ μ§νλμλ μλλ€.
- μΌμͺ½κ³Ό μ€λ₯Έμͺ½ νμ νΈλ¦¬μλ κ°μ μμ μ μνν΄μΌνλ€.
- λΆλͺ¨μ κ°λ³΄λ€ μμμ κ°μ΄ ν¬λ©΄ μλλ€.
μ΅μ ν(Min Heap)
- λΆλͺ¨μ λ Έλκ° νμ μμμ λ Έλλ³΄λ€ μμ ꡬ쑰
- νμͺ½ λ Έλλ§ κ³μ μ§νλμλ μλλ€.
- μΌμͺ½κ³Ό μ€λ₯Έμͺ½ νμ νΈλ¦¬μλ κ°μ μμ μ μνν΄μΌνλ€.
- λΆλͺ¨μ κ°λ³΄λ€ μμμ κ°μ΄ μμΌλ©΄ μλλ€.
μ₯λ¨μ
μ₯μ
- μ΅λκ° λλ μ΅μκ°μ λΉ λ₯΄κ² μ°Ύκ³ μ½μ ν μ μμ.
- μ°μ μμ νλ μμ μ€μΌμ€λ§μμ νμ©νκΈ° μ’μ.
λ¨μ
- μ€κ° μμμ μ κ·ΌνκΈ° μ΄λ ΅κ³ , μ½μ /μμ μ κ· νμ λ§μΆκΈ° μν μΆκ° μμ νμ.
- λ©λͺ¨λ¦¬ μ¬μ©μ΄ λΉν¨μ¨μ μΌ μ μμ.
ꡬν
#include <iostream>
#include <vector>
#include <algorithm>
class MaxHeap {
private:
std::vector<int> heap;
// λΆλͺ¨-μμ κ΄κ³λ₯Ό μ μ§νλ©° νμ μ¬μ λ ¬ (heapify-down)
void heapifyDown(int index) {
int left = 2 * index + 1;
int right = 2 * index + 2;
int largest = index;
// μΌμͺ½ μμμ΄ λ ν¬λ©΄ largestλ₯Ό μΌμͺ½ μμ μΈλ±μ€λ‘ κ°±μ
if (left < heap.size() && heap[left] > heap[largest]) {
largest = left;
}
// μ€λ₯Έμͺ½ μμμ΄ λ ν¬λ©΄ largestλ₯Ό μ€λ₯Έμͺ½ μμ μΈλ±μ€λ‘ κ°±μ
if (right < heap.size() && heap[right] > heap[largest]) {
largest = right;
}
// largestκ° λ³κ²½λμμΌλ©΄ swapνκ³ , μ¬κ·μ μΌλ‘ heapify
if (largest != index) {
std::swap(heap[index], heap[largest]);
heapifyDown(largest);
}
}
// νμ μλ‘ μ¬μ λ ¬ (heapify-up)
void heapifyUp(int index) {
while (index > 0 && heap[(index - 1) / 2] < heap[index]) {
std::swap(heap[index], heap[(index - 1) / 2]);
index = (index - 1) / 2;
}
}
public:
// μ½μ
μ°μ°
void insert(int value) {
heap.push_back(value); // μλ‘μ΄ κ° μ½μ
heapifyUp(heap.size() - 1); // μλ‘μ΄ κ°μ΄ ν μμ±μ λ§μ‘±νλλ‘ μλ‘ μ¬λ¦¬κΈ°
}
// λ£¨νΈ μμ μ°μ° (μ΅λκ° μμ )
void removeMax() {
if (heap.empty()) return;
// 루νΈμ λ§μ§λ§ κ°μ κ΅ν
heap[0] = heap.back();
heap.pop_back();
// 루νΈλΆν° μλλ‘ heapify-down
heapifyDown(0);
}
// λ£¨νΈ κ°μ λ°ν (μ΅λκ°)
int getMax() {
if (!heap.empty()) {
return heap[0];
}
throw std::out_of_range("Heap is empty");
}
// νμ μΆλ ₯
void printHeap() {
for (int val : heap) {
std::cout << val << " ";
}
std::cout << std::endl;
}
bool isEmpty() {
return heap.empty();
}
};
int main() {
MaxHeap maxHeap;
// μ½μ
maxHeap.insert(10);
maxHeap.insert(20);
maxHeap.insert(15);
maxHeap.insert(30);
maxHeap.insert(40);
std::cout << "Max Heap: ";
maxHeap.printHeap(); // 40 30 15 10 20
// μ΅λκ° μ»κΈ°
std::cout << "Max Value: " << maxHeap.getMax() << std::endl; // 40
// μ΅λκ° μ κ±°
maxHeap.removeMax();
std::cout << "Max Heap after removing max: ";
maxHeap.printHeap(); // 30 20 15 10
return 0;
}