์ถ์ฒ
ChatGPT
์ด์ง ํ (Binary Heap)์ ์์ ์ด์ง ํธ๋ฆฌ์ ํ ํํ๋ก, ํ ํน์ฑ์ ๋ง์กฑํ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค. ์ด์ง ํ์ ์ฃผ๋ก ์ต์ ํ(Min Heap)๊ณผ ์ต๋ ํ(Max Heap) ๋ ๊ฐ์ง ์ ํ์ผ๋ก ๋๋๋ค.
์ต์ ํ Min Heap
๋ถ๋ชจ ๋ ธ๋๊ฐ ํญ์ ์์ ๋ ธ๋๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ค. ๋ฐ๋ผ์ ๋ฃจํธ ๋ ธ๋์๋ ํธ๋ฆฌ์์ ๊ฐ์ฅ ์์ ๊ฐ์ด ์์นํ๋ค.
์ต๋ ํ Max Heap
๋ถ๋ชจ ๋ ธ๋๊ฐ ํญ์ ์์ ๋ ธ๋๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ค. ๋ฐ๋ผ์ ๋ฃจํธ ๋ ธ๋์๋ ํธ๋ฆฌ์์ ๊ฐ์ฅ ํฐ ๊ฐ์ด ์์นํ๋ค.
1. ์ด์ง ํ์ ํน์ฑ
์์ ์ด์ง ํธ๋ฆฌ Complete Binary Tree
์ด์ง ํ์ ์์ ์ด์ง ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ ์งํด์ผ ํ๋ค. ์ฆ, ๋ชจ๋ ๋ ๋ฒจ์ ๊ฐ๋ ์ฐจ ์์ผ๋ฉฐ, ๋ง์ง๋ง ๋ ๋ฒจ์ ์ผ์ชฝ๋ถํฐ ์ฐจ๋ก๋๋ก ๋ ธ๋๊ฐ ์ฑ์์ ธ์ผ ํ๋ค.
ํ ์์ฑ Heap Property
์ต๋ ํ์์๋ ๋ถ๋ชจ ๋ ธ๋๊ฐ ์์ ๋ ธ๋๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์์ผ ํ๊ณ , ์ต์ ํ์์๋ ๋ถ๋ชจ ๋ ธ๋๊ฐ ์์ ๋ ธ๋๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์์ผ ํ๋ค. ์ด ์์ฑ์ด ์ ์ง๋์ด์ผ ํ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋ค.
2. ์ด์ง ํ์ ์ฃผ์ ์ฐ์ฐ + 3. ์ด์ง ํ์ ๋ฐฐ์ด ํํ
Heap์ ๋ํด ์์ฑํ ๊ธ์ ๋ด์ฉ(์ฃผ์ ์ฐ์ฐ๊ณผ ๋ฐฐ์ด ํํ)์ ๋์ผํจ.
4. ์ด์ง ํ์ ๊ตฌํ ์์ (์ต์ ํ)
public class MinHeap {
private int[] heap;
private int size;
private int capacity;
public MinHeap(int capacity) {
this.capacity = capacity;
this.size = 0;
this.heap = new int[capacity];
}
// ๋ถ๋ชจ ๋
ธ๋์ ์ธ๋ฑ์ค
private int getParentIndex(int index) { return (index - 1) / 2; }
// ์ผ์ชฝ ์์ ๋
ธ๋์ ์ธ๋ฑ์ค
private int getLeftChildIndex(int index) { return 2 * index + 1; }
// ์ค๋ฅธ์ชฝ ์์ ๋
ธ๋์ ์ธ๋ฑ์ค
private int getRightChildIndex(int index) { return 2 * index + 2; }
// ์์ ์ฝ์
public void insert(int value) {
if (size == capacity) throw new IllegalStateException("Heap is full");
heap[size] = value;
size++;
heapifyUp(size - 1); // ์ฝ์
ํ ํ ์
์คํ
}
// ํ ์
(์ํฅ์ ํ ์ ๋ ฌ)
private void heapifyUp(int index) {
while (index > 0 && heap[index] < heap[getParentIndex(index)]) {
swap(index, getParentIndex(index));
index = getParentIndex(index);
}
}
// ์ต์๊ฐ(๋ฃจํธ) ์ญ์
public int removeMin() {
if (size == 0) throw new IllegalStateException("Heap is empty");
int min = heap[0];
heap[0] = heap[size - 1];
size--;
heapifyDown(0); // ์ญ์ ํ ํ ๋ค์ด ์คํ
return min;
}
// ํ ๋ค์ด(ํํฅ์ ํ ์ ๋ ฌ)
private void heapifyDown(int index) {
int smallest = index;
int left = getLeftChildIndex(index);
int right = getRightChildIndex(index);
if (left < size && heap[left] < heap[smallest]) {
smallest = left;
}
if (right < size && heap[right] < heap[smallest]) {
smallest = right;
}
if (smallest != index) {
swap(index, smallest);
heapifyDown(smallest);
}
}
// ๋ ์์ ๊ตํ
private void swap(int i, int j) {
int temp = heap[i];
heap[i] = heap[j];
heap[j] = temp;
}
// ํ ๋ด์ฉ ์ถ๋ ฅ
public void printHeap() {
for (int i = 0; i < size; i++) {
System.out.print(heap[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
MinHeap minHeap = new MinHeap(10);
minHeap.insert(20);
minHeap.insert(15);
minHeap.insert(30);
minHeap.insert(5);
minHeap.insert(10);
minHeap.printHeap(); // ์ถ๋ ฅ: 5 10 30 20 15
System.out.println("Min value removed: " + minHeap.removeMin()); // ์ถ๋ ฅ: 5
minHeap.printHeap(); // ์ถ๋ ฅ: 10 15 30 20
}
}
5. ์ด์ง ํ์ ์์ฉ
1. ์ฐ์ ์์ ํ Priority Queue
์ด์ง ํ์ ์ฐ์ ์์ ํ๋ฅผ ๊ตฌํํ๋ ๋ฐ ๋ง์ด ์ฌ์ฉ๋๋ค. ์ฐ์ ์์ ํ๋ FIFO ๊ท์น ๋์ , ์ฐ์ ์์๊ฐ ๋์ ์์๊ฐ ๋จผ์ ์ฒ๋ฆฌ๋๋ ํ๋ก, ํ์ ์ด์ฉํ์ฌ ๋น ๋ฅด๊ฒ ์ฝ์ ๋ฐ ์ญ์ ์ฐ์ฐ์ ์ํํ ์ ์๋ค. ์๋ฐ์ PriorityQueue๋ ๋ด๋ถ์ ์ผ๋ก ์ด์ง ์ต์ ํ์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋๋ค.
2. ํ ์ ๋ ฌ Heap Sort
ํ ์ ๋ ฌ์ ์ด์ง ํ์ ์ด์ฉํ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ๋ฐฐ์ด์ ํ์ผ๋ก ๋ณํํ ํ, ์ต๋๊ฐ ๋๋ ์ต์๊ฐ์ ํ๋์ฉ ์ ๊ฑฐํ์ฌ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ์์ฑํ๋ค. ํ ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋๋ O(n log n)์ด๋ฉฐ, ์ ์๋ฆฌ ์ ๋ ฌ(in-place sorting)์ด ๊ฐ๋ฅํ๋ค.
3. ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ Dijkstra's Algorithm
์ต๋จ ๊ฒฝ๋ก ํ์ ์๊ณ ๋ฆฌ์ฆ์ธ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์์, ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฅ ์์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง ์ ์ ์ ์ ํํ๋ ๋ฐ ์ด์ง ํ์ด ์ฌ์ฉehls๋ค. ์ด์ง ํ์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํจ๋ค.
๊ฒฐ๋ก
์ด์ง ํ(Binary Heap)์ ์์ ์ด์ง ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ฉด์, ์ต๋๊ฐ ๋๋ ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ๊ณ ์ฝ์ ๋ฐ ์ญ์ ๋ฅผ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค. ์ด์ง ํ์ ์ฐ์ ์์ ํ, ํ ์ ๋ ฌ, ์ต๋จ ๊ฒฝ๋ก ํ์ ์๊ณ ๋ฆฌ์ฆ ๋ฑ์์ ์ค์ํ ์ญํ ์ ํ๋ฉฐ, ๊ฐ ์ฐ์ฐ์ O(log n) ๋๋ O(n) ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
'๋น ๊ตฌ๋ฉ ์ฑ์ฐ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] Retrofit2์์ Annotation์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์ดํผ๊ธฐ (1) | 2024.09.23 |
---|---|
[Java] PriorityQueue (2) | 2024.09.18 |
[์๋ฃ ๊ตฌ์กฐ][Java] ํ Heap (1) | 2024.09.17 |
[์๊ณ ๋ฆฌ์ฆ] ์์ ์ ์ธ ์ ๋ ฌ Stable Sorting (1) | 2024.09.15 |
[์๊ณ ๋ฆฌ์ฆ] ์ ์๋ฆฌ ์ ๋ ฌ In-Place Sorting (1) | 2024.09.15 |