ํ์ด๋?
์์ ์ด์งํธ๋ฆฌ์ ์ผ์ข ์ด๋ค.- ํ์
์ค๋ณต๋ ๊ฐ์ ํ์ฉํ๋ค. - ์ฌ๋ฌ ๊ฐ๋ค ์ค
์ต๋๊ฐ ํน์ ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ์๋ด๊ธฐ ์ํ์๋ฃ๊ตฌ์กฐ์ด๋ค. - Max heap์ ๊ฐ์ฅ ํฐ ๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ๊ธฐ ์ํ ๊ฒ์ด๊ณ Min Heap์ ๊ฐ์ฅ ์์ ๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ๊ธฐ ์ํ ๊ฒ์ด๋ค.
์ต๋ํ
- Max Heap์ ๋ถ๋ชจ ๋ ธ๋์ ํค ๊ฐ์ด ์์ ๋ ธ๋์ ํค ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์์ ์ด์ง ํธ๋ฆฌ์ด๋ค.
- ๋ถ๋ชจ๋ ธ๋์ key ≥ ์์ ๋ ธ๋์ key
์ต์ํ
- Min Heap ์ ๋ถ๋ชจ ๋ ธ๋์ ํค ๊ฐ์ด ์์ ๋ ธ๋์ ํค ๊ฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ ์ด์ง ํธ๋ฆฌ์ด๋ค.
- ๋ถ๋ชจ๋ ธ๋์ key ≤ ์์ ๋ ธ๋์ key
ํ ๊ตฌํ
Heap์ ๋ฐฐ์ด์ ํตํด ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค. ์ด์ง ํ์ ํธ๋ฆฌ์ ๊ฒฝ์ฐ์๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ตฌํํ์๋๋ฐ
Heap์ ๋ฐฐ์ด๋ก ๊ตฌํํ๋ ์ด์ ๊ฐ ๋ฌด์์ผ๊น? ๊ทธ ์ด์ ๋ Heap์ด ์์ ์ด์ง ํธ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์์ ์ด์งํธ๋ฆฌ์ ํน์ฑ์
์ผ์ชฝ๋ถํฐ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฐจ๊ณก์ฐจ๊ณก ๋ ธ๋๊ฐ ์ ์ฅ๋๋ฏ๋ก ๋ฐฐ์ด์ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
์ ๊ทธ๋ฆผ์ Max Heap์ ๋ฐฐ์ด๋ก ํํํ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ ํน์ดํ ์ ์ 0๋ฒ index๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒ์ธ๋ฐ
์ด๋ ๊ตฌํ์ ์ฝ๊ฒ ํ๊ธฐ ์ํด์์ด๋ค. index๋ฅผ ํตํด ๋ ธ๋์ ์ ๊ทผํ ์ ์๋๋ฐ, ๋ค์๊ณผ ๊ฐ๋ค.
๋ถ๋ชจ๋ ธ๋์ index = ์์๋ ธ๋์ index ÷ 2
์ผ์ชฝ ์์ ๋ ธ๋์ index = ๋ถ๋ชจ๋ ธ๋์ index × 2
์ค๋ฅธ์ชฝ ์์ ๋ ธ๋์ index = ๋ถ๋ชจ๋ ธ๋์ index × 2 + 1
ํ ์ฝ์
1. ์๋ก์ด ๋ ธ๋๋ฅผ ํ์ ๋ง์ง๋ง ๋ ธ๋์ ์ด์ด์ ์ฝ์ ํ๋ค. ( ๋ฐฐ์ด์ ๋ง์ง๋ง์ ์์๋ฅผ ์ถ๊ฐํ๋ค.)
2. ์๋ก์ด ๋ ธ๋๋ฅผ ๋ถ๋ชจ ๋ ธ๋์ ๋น๊ตํด์ ๊ตํํด์ผ ํ๋ค๋ฉด ํ์ ์ฑ์ง์ ๋ง์กฑํ ๋ ๊น์ง ๊ตํํ๋ค.
์๋ฅผ ๋ค์ด ์์ Max Heap์ ์๋ก์ด ๋
ธ๋(key=8)๋ฅผ ์ถ๊ฐํ๋ค๊ณ ํ์.
์ฒซ ๋ฒ์งธ๋ก ๋ฐฐ์ด์ ๊ฐ์ฅ ๋ง์ง๋ง ์์น์ ์๋ก์ด ์์ 8์ ์ถ๊ฐํฉ๋๋ค.
๋ ๋ฒ์งธ๋ก ๋ถ๋ชจ๋ ธ๋์ธ index 4๋ฒ ๋ ธ๋์ ํค ๊ฐ์ ๋น๊ตํ๋ค. ์ด ๋ ์์ ๋ ธ๋์ธ index 8๋ฒ ๋ ธ๋๊ฐ ํค๊ฐ์ด ๋ ํฌ๋ฏ๋ก (8>4) ๋ถ๋ชจ๋ ธ๋์ ์์น๋ฅผ ๊ตํํ๋ค.
๋ง์ง๋ง์ผ๋ก ๋ถ๋ชจ๋ ธ๋์ธ index 2๋ฒ ๋ ธ๋์ ํค ๊ฐ์ ๋น๊ตํ๋ค. ์ด ๋ ์์ ๋ ธ๋์ธ index 4๋ฒ ๋ ธ๋๊ฐ ํค ๊ฐ์ด ๋ ํฌ๋ฏ๋ก (8>7) ๋ถ๋ชจ๋ ธ๋์ ์์น๋ฅผ ๊ตํํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด Max Heap์ ์ฑ์ง์ ๋ง์กฑํ๊ฒ ๋๊ณ ์ฝ์ ๊ณผ์ ์ด ์ข ๋ฃ๋๋ค.
Max Heap์ ์๋ก ๋ค์์ง๋ง, Min Heap์ ๋ฐ๋๋ก ๋ถ๋ชจ๋ ธ๋๊ฐ ์์ ๋ ธ๋๋ณด๋ค ์๋๋ก ๊ตํํ๋ฉด ๋๋ค.
void max_heap_insert(Heap* h, element item) {
int i;
i = ++(h->size); //๋ง์ง๋ง ์์น(๋ง์ง๋ง ์์์ index+1)
// ๋ฃจํธ ๋
ธ๋๊ฐ ์๋๊ณ , ์ฌ๋นํ ๊ฐ์ด ์ ์ ํ ์์น๋ฅผ ์ฐพ์ ๋๊น์ง
while ((i != 1) && (item.key > h->heap[i / 2].key)) {
h->heap[i] = h->heap[i / 2]; //์์ ๋
ธ๋์ ๋ถ๋ชจ ๋
ธ๋ ๊ตํ
i /= 2; //ํ ๋ ๋ฒจ ์์น
}
h->heap[i] = item;
}
ํ ์ญ์
Heap์์์ ์ญ์ ๋ ๋ฃจํธ ๋ ธ๋๋ฅผ ์ญ์ ํ๊ณ ๋ฐํํ๋ค๋ ๋ป์ด๋ค.
- Max Heap์์์ ์ญ์ ๋ ๊ฐ์ฅ ํฐ ํค ๊ฐ์ ๊ฐ์ง ๋ฃจํธ ๋ ธ๋๋ฅผ ์ญ์ ํ๊ณ ๋ฐํํ๋ค๋ ๋ป์ด๋ค.
- Min Heap์์์ ์ญ์ ๋ ๊ฐ์ฅ ์์ ํค ๊ฐ์ ๊ฐ์ง ๋ฃจํธ ๋ ธ๋๋ฅผ ์ญ์ ํ๊ณ ๋ฐํํ๋ค๋ ๋ป์ด๋ค.
1. ๋ฃจํธ๋ ธ๋๋ฅผ ์ญ์ ํ๋ค ( ๋์ค์ ๊ฐ์ ๋ฐํํด์ผํ๋ฏ๋ก ๋ฐ๋ก ์ ์ฅํ๋ค)
2. ์ญ์ ๋ ๋ฃจํธ ๋ ธ๋์ ์์น์ ํ์ ๊ฐ์ฅ ๋ง์ง๋ง ๋ ธ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.
3. ํ์ ์กฐ๊ฑด์ ๋ง๊ฒ ์์น๋ฅผ ์ฌ์ค์ ํ๋ค. (์ด๊ฒ์ heapify ๋ผ๊ณ ํ๋ค.)
1. ๋ฃจํธ ๋ ธ๋๋ฅผ ์ญ์ ํ๋ค( ๋์ค์ ๊ฐ์ ๋ฐํํด์ผ ํ๋ฏ๋ก ๋ฐ๋ก ์ ์ฅํด๋๋๋ค.)
2. ์ญ์ ๋ ๋ฃจํธ ๋ ธ๋์ ์์น์ ํ์ ๊ฐ์ฅ ๋ง์ง๋ง ๋ ธ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.
3. ํ์ ์กฐ๊ฑด์ ๋ง๊ฒ ์์น๋ฅผ ์ฌ์ค์ ํ๋ค. (Heapify)
์ด๋ ์ฃผ์ํ ์ ์ ๋น๊ตํ ๋ ธ๋๋ณด๋ค ํฐ ์์ ๋ ธ๋๊ฐ 2๊ฐ ์์ ๋, ๋ ํฐ ๊ฐ์ ๊ฐ์ง ์์ ๋ ธ๋์ ๊ตํํด์ผํ๋ค๋ ๊ฒ์ด๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ํ์ ์กฐ๊ฑด์ ๋ง๊ฒ ์์น๋ฅผ ์ฌ์ค์ ํ๋ฉด ๋๋ค.
element max_heap_delete(Heap* h) {
int parent, child;
element item, temp;
item = h->heap[1];
temp = h->heap[(h->size)--];
parent = 1;
child = 2;
while (child <= h->size) {
if ((child < h->size) && ((h->heap[child].key) < h->heap[child + 1].key)) {
child++;
}
if (temp.key >= h->heap[child].key) {
break;
}
h->heap[parent] = h->heap[child];
parent = child;
child *= 2;
}
h->heap[parent] = temp;
return item;
}
์ ์ฒด ์ฝ๋
#include <stdio.h>
#define MAX_SIZE 100
typedef struct { // ํ์ ๋
ธ๋
int key; //ํ์ key
}element;
typedef struct { //ํ ์๋ฃ๊ตฌ์กฐ
element heap[MAX_SIZE];
int size;
}Heap;
void max_heap_insert(Heap* h, element item) {
int i;
i = ++(h->size); //๋ง์ง๋ง ์์น(๋ง์ง๋ง ์์์ index+1)
// ๋ฃจํธ ๋
ธ๋๊ฐ ์๋๊ณ , ์ฌ๋นํ ๊ฐ์ด ์ ์ ํ ์์น๋ฅผ ์ฐพ์ ๋๊น์ง
while ((i != 1) && (item.key > h->heap[i / 2].key)) {
h->heap[i] = h->heap[i / 2]; //์์ ๋
ธ๋์ ๋ถ๋ชจ ๋
ธ๋ ๊ตํ
i /= 2; //ํ ๋ ๋ฒจ ์์น
}
h->heap[i] = item;
}
element max_heap_delete(Heap* h) {
int parent, child;
element item, temp;
item = h->heap[1];
temp = h->heap[(h->size)--];
parent = 1;
child = 2;
while (child <= h->size) {
if ((child < h->size) && ((h->heap[child].key) < h->heap[child + 1].key)) {
child++;
}
if (temp.key >= h->heap[child].key) {
break;
}
h->heap[parent] = h->heap[child];
parent = child;
child *= 2;
}
h->heap[parent] = temp;
return item;
}
int main() {
Heap max_heap;
element item;
item.key = 9;
max_heap_insert(&max_heap, item);
item.key = 7;
max_heap_insert(&max_heap, item);
item.key = 6;
max_heap_insert(&max_heap, item);
item.key = 4;
max_heap_insert(&max_heap, item);
item.key = 5;
max_heap_insert(&max_heap, item);
item.key = 1;
max_heap_insert(&max_heap, item);
item.key = 3;
max_heap_insert(&max_heap, item);
item.key = 8;
max_heap_insert(&max_heap, item);
while (max_heap.size > 0) {
item = max_heap_delete(&max_heap);
printf("%d ", item.key);
}
return 0;
}