μ°μ μμνλ
νλ λ¨Όμ λ€μ΄μ€λ λ°μ΄ν°κ° λ¨Όμ λκ°λ FIFO νμμ μλ£κ΅¬μ‘°μ΄λ€. νμ§λ§ μ°μ μμνλ λ¨Όμ λ€μ΄μ€λ λ°μ΄ν°κ° μλλΌ μ°μ μμκ° λμ λ°μ΄ν°κ° λ¨Όμ λκ°λ ννμ μλ£κ΅¬μ‘°μ΄λ€.
μ°μ μμν ꡬνλ°©λ²
- λ°°μ΄μ μ΄μ©ν μ°μ μμ ν
- μ°κ²°λ¦¬μ€νΈλ₯Ό μ΄μ©ν μ°μ μμ ν
- νμ μ΄μ©ν μ°μ μμ ν
λ°°μ΄κ³Ό μ°κ²°λ¦¬μ€νΈλ μ ν ꡬ쑰μ μλ£κ΅¬μ‘°μ΄λ―λ‘ μ½μ
λλ μμ μ°μ°μ μν μκ°λ³΅μ‘λλ O(n)μ΄λ€.
λ°λ©΄ ννΈλ¦¬λ μμ μ΄μ§νΈλ¦¬ ꡬ쑰μ΄λ―λ‘ ννΈλ¦¬μ λμ΄λ logβ(n+1) μ΄λ©°, νμ μκ°λ³΅μ‘λλ O(logβn)μ΄λ€. μ΄ κΈμμλ νμ μ΄μ©νμ¬ μ°μ μμ νλ₯Ό ꡬνν΄λ³΄κ² λ€. νμ κ΄ν λ΄μ©μ μλ κΈμ μ°Έκ³ νμ.
[μλ£κ΅¬μ‘°] ν(Heap)μ΄λ?
νμ΄λ? μμ μ΄μ§νΈλ¦¬μ μΌμ’ μ΄λ€. νμ μ€λ³΅λ κ°μ νμ©νλ€. μ¬λ¬ κ°λ€ μ€ μ΅λκ° νΉμ μ΅μκ°μ λΉ λ₯΄κ² μ°Ύμλ΄κΈ° μν μλ£κ΅¬μ‘°μ΄λ€. Max heapμ κ°μ₯ ν° κ°μ λΉ λ₯΄κ² μ°ΎκΈ° μν κ²μ΄κ³ Min Heap
linerate.tistory.com
μ°μ μμν ADT
- create(): μ°μ μμνλ₯Ό μμ±νλ€.
- init(q): μ°μ μμν qλ₯Ό μ΄κΈ°ννλ€.
- is_empty(): μ°μ μμν qκ° λΉμλμ§ κ²μ¬νλ€.
- is_full(): μ°μ μμν qκ° κ°λ μ°Όλμ§ κ²μ¬νλ€.
- insert(q, x): μ°μ μμν qμ μμ xλ₯Ό μΆκ°νλ€.
- delete(q): μ°μ μμνλ‘λΆν° κ°μ₯ μ°μ μμκ° λμ μμλ₯Ό μμ νκ³ λ°ννλ€.
- find(q): μ°μ μμκ° κ°μ₯ λμ μμλ₯Ό λ°ννλ€.
κ°μ₯ μ€μν μ°μ°μ insertμ°μ°κ³Ό deleteμ°μ°μ΄λ€. μ°μ μμνλ μ΅μμ μ΅λ 2κ°μ§λ‘ μ΄λ£¨μ΄μ§λ€.
μ°μ μμν ν
- λ°°μ΄μ μ΄μ©ν λ°©λ²μ λͺ¨λ μ΄μ§ νΈλ¦¬λ₯Ό ν¬ν μ΄μ§ νΈλ¦¬λΌκ³ κ°μ νκ³ κ° λ Έλμ λ²νΈλ₯Ό λΆμ¬μ κ·Έ λ²νΈλ₯Ό λ°°μ΄μ μΈλ±μ€λ‘ μΌμ λ Έλμ λ°μ΄ν°λ₯Ό λ°°μ΄μ μ μ₯νλ λ°©λ²μ΄λ€.
- nμ λΆλͺ¨ λ
Έλμ μΈλ±μ€(index)λ
n/2 - nμ μΌμͺ½ μμ λ
Έλμ μΈλ±μ€λ
2n - nμ μ€λ₯Έμͺ½ μμ λ
Έλμ μΈλ±μ€λ
2n + 1
μ°μ μμν μ½μ
νμ μ½μ μ νκΈ° μν΄μλ ν νΈλ¦¬μ μ±μ§μ λ§μ‘±μν€λ©΄μ μλ‘μ΄ μμλ₯Ό μΆκ°ν΄μΌ νλ€.
- μ°μ μμ μ΄μ§νΈλ¦¬μ λ§μ§λ§ λ Έλμ μ΄μ΄μ μλ‘μ΄ λ Έλλ₯Ό μΆκ°νλ€.
- μΆκ°λ μλ‘μ΄ λ Έλλ₯Ό λΆλͺ¨μ λ Έλμ λΉκ΅νμ¬ κ΅ννλ€.
- μ μμ μΈ ννΈλ¦¬κ° λ λ κΉμ§ (λμ΄μ λΆλͺ¨λ Έλμ κ΅νν νμκ° μμ λκΉμ§) 2λ²μ λ°λ³΅νλ€.
μ΅μ
μ κ²½μ° μλ‘ μΆκ°λ λ
Έλκ° λ£¨νΈλ
ΈνΈκΉμ§ λΉκ΅νλ©° μ¬λΌκ°μΌ νλ―λ‘ μκ°λ³΅μ‘λκ° O(logβn)μ΄λ€.
μ°μ μμν μμ
ν νΈλ¦¬μμ 루νΈλ Έλκ° κ°μ₯ μ°μ μμκ° λμΌλ―λ‘ λ£¨νΈ λ Έλλ₯Ό μμ ν΄μΌ νλ€.
μμ κ° μ΄λ€μ§ ν ν νΈλ¦¬μ μ±μ§μ΄ μ μ§λΌμΌ νλ―λ‘ μλμ κ°μ λ°©λ²μΌλ‘ μμ λ₯Ό μ§ννλ€.
- λ£¨νΈ λ Έλλ₯Ό μμ νλ€.
- λ£¨νΈ λ Έλκ° μμ λ λΉμ리μ μμ μ΄μ§νΈλ¦¬μ λ§μ§λ§ λ Έλλ₯Ό κ°μ Έμ¨λ€.
- λ£¨νΈ μ리μ μμΉν μλ‘μ΄ λ
Έλλ₯Ό μμ λ
Έλμ λΉκ΅νμ¬ κ΅ννλ€.
μ΄λ μ΅λ νμΈ κ²½μ° μμλ Έλ μ€ λ ν° κ°κ³Ό κ΅νμ νλ©°, μ΅μ νμΈ κ²½μ° λ μμ κ°κ³Ό κ΅νμ νλ€. - μ μμ μΈ ννΈλ¦¬κ° λ λκΉμ§ (λ μ΄μ μμλ Έλμ κ΅νν νμκ° μμ λκΉμ§) 3λ²μ λ°λ³΅νλ€.
μμ μ°μ° λν μ΅μ
μ κ²½μ° λ£¨νΈλ
ΈνΈλΆν° κ°μ₯ μλκΉμ§ λ΄λ €κ°μΌ νλ―λ‘ μκ°λ³΅μ‘λκ° O(logβn)μ΄λ€.
μ 체 μ½λ
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define MAX_SIZE 200
typedef struct {
int key;
} element;
typedef struct {
element heap[MAX_SIZE];
int heap_size = 0;
}HeapType;
HeapType *create(){
return(HeapType*) malloc(sizeof(HeapType));
}
void init(HeapType* h) {
h->heap_size = 0;
}
void insert_max_heap(HeapType *h, element item){
int i;
i = ++(h->heap_size);
//νΈλ¦¬λ₯Ό κ±°μ¬λ¬ μ¬λΌκ°λ©΄μ λΆλͺ¨ λ
Έλμ λΉκ΅νλ κ³Όμ
while((i!=1) && (item.key > h->heap[i/2].key)){
h->heap[i] = h->heap[i/2];
i /= 2;
}
h->heap[i] = item;
}
element delete_max_heap(HeapType *h){
int parent, child;
element item, temp;
item = h->heap[1];
temp = h->heap[(h->heap_size)--];
parent = 1;
child = 2;
while(child <= h->heap_size){
if((child < h->heap_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];
child *= 2;
}
h->heap[parent] = temp;
return item;
}
int main(void){
element e1 = {40}, e2 = { 5}, e3 = {30};
element e4,e5,e6;
HeapType* heap;
heap = create();
init(heap);
insert_max_heap(heap, e1);
insert_max_heap(heap, e2);
insert_max_heap(heap, e3);
e4 = delete_max_heap(heap);
printf("<%d>", e4.key);
e5 = delete_max_heap(heap);
printf("<%d>", e5.key);
e6 = delete_max_heap(heap);
printf("<%d>", e6.key);
free(heap);
return 0;
}