: ์ด์ง ํ์ ํธ๋ฆฌ(BST
)์ ์ ์ฌํ์ง๋ง ๋ค๋ฅธ ๊ท์น์ด ์๋ค.
Max Binary Heap
: ๋ถ๋ชจ ๋
ธ๋๋ค์ด ํญ์ ์์ ๋
ธ๋๋ค ๋ณด๋ค ํฌ๋ค.Min Binary Heap
: ๋ถ๋ชจ ๋
ธ๋๋ค์ด ํญ์ ์์ ๋
ธ๋๋ค ๋ณด๋ค ์๋ค.์ฐธ๊ณ | ํ์ ํธ๋ฆฌ์ ํ ์ข ๋ฅ์ด๋ค.
โญ๏ธ ์ด์ง ํ์ ํธ๋ฆฌ์ ์ด์ง ํ ๊ตฌ๋ณํ๊ธฐ
์๋๋
์ด์ง ํ์ ํธ๋ฆฌ
๋ก, ์ด์ง ํ์ด ๋ ์ ์๋ค.
๋ถ๋ชจ ๋ ธ๋๋ค๋ณด๋ค ์์ ๋ ธ๋๋ค์ด ๋ ํฐ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ max binary heap์ด ๋ ์ ์๊ณ , ๋ถ๋ชจ ๋ ธ๋๋ค๋ณด๋ค ์์๋ ธ๋๋ค์ด ๋ ์์ ๊ฒฝ์ฐ๋ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ min binary heap๋ ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฐ์ ์์ ํ
๋ผ๋ ๊ฒ์ ๋ง๋ค๋ ์ฌ์ฉ๋๋ค.ํธ๋ฆฌ ์ํ ์๊ณ ๋ฆฌ์ฆ
์ ์ข
์ข
์ฐ์ธ๋ค.๋ฐฐ์ด/๋ฆฌ์คํธ๋ฅผ ์ด์ฉํด ๊ตฌํํ ์ ์๋ค.
์๋ฆฌ : ๋งจ ๋์ ์๋ก์ด ๊ฐ์ pushํ๊ณ ๋ถ๋ชจ๋ณด๋ค ํฌ๊ธฐ๊ฐ ํด ๊ฒฝ์ฐ bubble up ํด์ ์๋ฆฌ๋ฅผ ๋ฐ๊พผ๋ค.
โญ๏ธ ๋ถ๋ชจ์ ์์น๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ ์ฐพ๊ธฐ
: ๋ถ๋ชจ ์์น๊ฐ n ์ผ ๋ ์์์ ์์น๋ 2n+1, 2n+2, ์์ ์์น๊ฐ n ์ผ ๋๋ ๋ถ๋ชจ ์์น๊ฐ (n-1)/2 ์ ๋ด๋ฆผํ ๊ฐ
class MaxBinaryHeap {
constructor(){
this.values = [];
}
insert(element){
this.values.push(element);
this.bubbleUp();
}
bubbleUp(){
let idx = this.values.length - 1;
const element = this.values[idx];
while(idx > 0){
let parentIdx = Math.floor((idx - 1)/2);
let parent = this.values[parentIdx];
if(element <= parent) break;
this.values[parentIdx] = element;
this.values[idx] = parent;
idx = parentIdx;
}
}
}
let heap = new MaxBinaryHeap();
heap.insert(41);
heap.insert(39);
heap.insert(33);
heap.insert(18);
heap.insert(27);
heap.insert(12);
heap.insert(55);
๋ฉ์๋๋ช ์ remove, extractMax ํน์ extractMaximum ๋ฑ์ผ๋ก ๋ถ๋ฆฐ๋ค.
max binary heap
์์๋ ์ต๋๊ฐ(root)์ ์ ๊ฑฐํด ๋ฐํํ๊ณ , min binary heap
์์๋ ์ต์๊ฐ(root)์ ์ ๊ฑฐํด ๋ฐํํ๋ค. bubble down
(sink down ๋ฑ ๋ค์ํ ์ด๋ฆ์ผ๋ก ๋ถ๋ฆผ) ํด์ค๋ค.(์๋ก์ด root๋ฅผ ์์์ ๋ง๊ฒ ์ ๋ฆฌ)class MaxBinaryHeap {
constructor(){
this.values = [];
}
insert(element){
this.values.push(element);
this.bubbleUp();
}
bubbleUp(){
let idx = this.values.length - 1;
const element = this.values[idx];
while(idx > 0){
let parentIdx = Math.floor((idx - 1)/2);
let parent = this.values[parentIdx];
if(element <= parent) break;
this.values[parentIdx] = element;
this.values[idx] = parent;
idx = parentIdx;
}
}
extractMax(){
const max = this.values[0];
const end = this.values.pop();
if(this.values.length > 0){
this.values[0] = end;
this.sinkDown();
}
return max;
}
bubbleDown(){
let idx = 0;
const length = this.values.length;
const element = this.values[0];
while(true){
let leftChildIdx = 2 * idx + 1;
let rightChildIdx = 2 * idx + 2;
let leftChild,rightChild;
let swap = null;
if(leftChildIdx < length){
leftChild = this.values[leftChildIdx];
if(leftChild > element){
swap = leftChildIdx;
}
}
if(rightChildIdx < length){
rightChild = this.values[rightChildIdx];
if(
(swap === null && rightChild > element) ||
(swap !== null && rightChild > leftChild)
){
swap = rightChildIdx;
}
}
if(swap === null) break;
this.values[idx] = this.values[swap];
this.values[swap] = element;
idx = swap;
}
}
}
let heap = new MaxBinaryHeap();
heap.insert(41);
heap.insert(39);
heap.insert(33);
heap.insert(18);
heap.insert(27);
heap.insert(12);
heap.insert(55);
์ฝ์ ,์ญ์ : O(log n)
ํ์ : O(n)
์ฝ์
๊ณผ ์ญ์ ์ ์์ด ์ฑ๋ฅ์ด ๋งค์ฐ ์ข๋ค.
๊ฐ ๋ ๋ฒจ๋ง๋ค ํ ๋ฒ์ฉ๋ง ๋น๊ต๋ฅผ ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ log n
์ด๋ค.
ํ์์ BST
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข๋ค. ํ์ ์ข/์ฐ๋ก ๋์ ๊ด๊ณ์ ๋ฐ๋ฅธ ์ ๋ ฌ์ด ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.