[DA] Heap
Priority Queue
FIFO ๊ตฌ์กฐ๊ฐ ์๋ ์ฐ์ ์์๊ฐ ๋์ ์์๊ฐ ๋จผ์ ๋๊ฐ๋ Queue
Heap ์ผ๋ก ๊ตฌํ ์ ํฉ
Heap
์ด์ง ํธ๋ฆฌ ํํ
์ฐ์ ์์๊ฐ ๋์ ์์๊ฐ ๋จผ์ ๋๊ฐ๊ธฐ ์ํด ์์๊ฐ ์ฝ์ , ์ญ์ ๋ ๋ ๋ฐ๋ก ์ ๋ ฌ
Max Heap(๋ฃจํธ๊ฐ ๊ฐ์ฅ ํฐ ๊ฐ), Min Heap(๋ฃจํธ๊ฐ ๊ฐ์ฅ ์์ ๊ฐ)
Heap ์์ ์ถ๊ฐ
- ์์๊ฐ ์ถ๊ฐ๋ ๋๋ ํธ๋ฆฌ์ ๊ฐ์ฅ ๋ง์ง๋ง ์ ์ ์ ์์น
- ์ถ๊ฐ ํ ๋ถ๋ชจ ์ ์ ๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๋ค๋ฉด ๋ถ๋ชจ์ ์ ๊ณผ ์์๋ฅผ ๊ต์ฒด
Heap ์์ ์ ๊ฑฐ
- ์์ ์ ๊ฑฐ๋ ๋ฃจํธ ์ ์ ๋ง ๊ฐ๋ฅ
- ๋ฃจํธ ์ ์ ์ด ์ ๊ฑฐ๋ ํ ๊ฐ์ฅ ๋ง์ง๋ง ์ ์ ์ด ๋ฃจํธ์ ์์น
- ๋ฃจํธ ์ ์ ์ ๋ ์์ ์ ์ ์ค ๋ ์ฐ์ ์์๊ฐ ๋์ ์ ์ ๊ณผ ๊ต์ฒด
- ๋ ์์ ์ ์ ์ด ์ฐ์ ์์๊ฐ ๋ ๋ฎ์ ๋ ๊น์ง ๋ฐ๋ณต
class MaxHeap {
constructor() {
this.heap = [null];
}
push(value) {
this.heap.push(value);
let currentIndex = this.heap.length - 1;
let parentIndex = Math.floor(currentIndex / 2);
while (parentIndex !== 0 && this.heap[parentIndex] < value) {
const temp = this.heap[parentIndex];
this.heap[parentIndex] = value;
this.heap[currentIndex] = temp;
currentIndex = parentIndex;
parentIndex = Math.floor(currentIndex / 2);
}
}
pop() {
const returnValue = this.heap[1];
this.heap[1] = this.heap.pop();
let currentIndex = 1;
let leftIndex = 2;
let rightIndex = 3;
while (
this.heap[currentIndex] < this.heap[leftIndex] ||
this.heap[currentIndex] < this.heap[rightIndex]
) {
if (this.heap[leftIndex] < this.heap[rightIndex]) {
const temp = this.heap[currentIndex];
this.heap[currentIndex] = this.heap[rightIndex];
this.heap[rightIndex] = temp;
currentIndex = rightIndex;
} else {
const temp = this.heap[currentIndex];
this.heap[currentIndex] = this.heap[leftIndex];
this.heap[leftIndex] = temp;
currentIndex = leftIndex;
}
leftIndex = currentIndex * 2;
rightIndex = currentIndex * 2 + 1;
}
return returnValue;
}
}
Leave a comment