Heap
ν(heap)μ μ΅λκ° λ° μ΅μκ°μ μ°Ύμλ΄λ μ°μ°μ λΉ λ₯΄κ² νκΈ° μν΄ κ³ μλ μμ μ΄μ§νΈλ¦¬(Complete binary tree)λ₯Ό κΈ°λ³ΈμΌλ‘ ν μλ£κ΅¬μ‘°(tree-based structure)μ΄λ€. (μν€λ°±κ³Ό )

μμ©
Graph Algorithm : Dijkstra, Prim's Minimum Spanning Tree(νλ¦Ό μ΅μ μ μ₯ νΈλ¦¬)
κ·Έλ¦¬κ³ λ€μν λ¬Έμ λ₯Ό νΈλλ°μμ μ¬μ©λλ€.
κ·μΉ

μ΅μ ν(min heap)
λΆλͺ¨λ
Έλμ ν€κ°μ΄ μμλ
Έλμ ν€κ°λ³΄λ€ νμ μκ±°λ κ°λ€. key(λΆλͺ¨λ
Έλ) < key(μμλ
Έλ)
μ΅λ ν(max heap)
λΆλͺ¨λ
Έλμ ν€κ°μ΄ μμλ
Έλμ ν€κ°λ³΄λ€ νμ ν¬κ±°λ κ°λ€. key(λΆλͺ¨λ
Έλ) > key(μμλ
Έλ)
λ°λΌμ 루νΈλ Έλμλ νμ κ°μ₯ ν° κ°μ΄λ κ°μ₯ μμ κ°μ΄ μ μ₯λμ΄ μκΈ°λλ¬Έμ μ΅λκ° λλ μ΅μκ°μ O(1)λ§μ μ°Ύμ μ μλ€. μ¬κΈ°μ ν€κ°μ μ€λ‘μ§ λΆλͺ¨ μμλ Έλκ°μλ§ μ±λ¦½νλ€.
Height/Depth
nκ°μ λ Έλλ₯Ό κ°μ§κ³ μλ heapμ λμ΄λ O(logn)μ΄λ€. νμ μμ μ΄μ§νΈλ¦¬μ΄λ―λ‘ λ Έλμ κ°μλ‘ κΉμ΄μ λμ΄λ₯Ό κ³μ°ν μ μλ€.
λ§μ§λ§ levelμ μ μΈνκ³ λ κ° λ 벨 iμ 2^iκ°μ λ Έλκ° μ‘΄μ¬νλ€.
ꡬν
λ°°μ΄

νμ μμ μ΄μ§νΈλ¦¬μ΄λ―λ‘ κ° λ Έλμ λ²νΈλ₯Ό λΆμΌ μ μλ€. λ°°μ΄μ μμ μ΄μ§νΈλ¦¬λ₯Ό νννκΈ°μ λ§€μ° ν¨μ¨μ μ΄λ€.
λ°°μ΄λ‘ ννν¨μΌλ‘μ¨ λΆλͺ¨λ Έλμ μμλ Έλλ₯Ό μ°ΎκΈ°κ° μ¬μμ§λ€.
μΌμͺ½ μμλ Έλ μΈλ±μ€ :
2*(λΆλͺ¨λ Έλ μΈλ±μ€)
μ€λ₯Έμͺ½ μμλ Έλ
2*(λΆλͺ¨λ Έλ μΈλ±μ€)+1
λ Έλ xμ λΆλͺ¨ λ Έλ μΈλ±μ€λ
(μμλ Έλ μΈλ±μ€)/2
λ‘ μ μ μλ€.
μ£Όμμ¬ν indexλ 1λΆν° μμ!νλ€λ μ μ μ£Όμν΄μΌνλ€.
μ½μ
(upheap)

κ°μ₯ λμ μ리μ λ Έλλ₯Ό μ½μ νλ€.
κ·Έ λ Έλμ λΆλͺ¨ λ Έλλ₯Ό μλ‘ λΉκ΅νλ€.
κ·μΉ(μ΅μν, μ΅λν)μ λ§μΌλ©΄ κ·Έλλ‘ λκ³ , κ·Έλ μ§ μμΌλ©΄ λΆλͺ¨μ κ΅ννλ€.
κ·μΉμ λ§μ λκΉμ§ 1~3λ² κ³Όμ μ λ°λ³΅νλ€.
μκ°λ³΅μ‘λ
O(logn)
μμ (downheap)

μ΅λκ° νΉμ μ΅μκ°μ΄ μ μ₯λ λ£¨νΈ λ Έλλ§ μ κ±°ν μ μλ€.
λ£¨νΈ λ Έλλ₯Ό μ κ±°νλ€.
λ£¨νΈ μ리μ κ°μ₯ λ§μ§λ§ λ Έλλ₯Ό μ½μ νλ€.
μ¬λΌκ° λ Έλμ κ·Έμ μμ λ Έλ(λ€)μ λΉκ΅νλ€.
쑰건μ λ§μ‘±νλ©΄ κ·Έλλ‘ λκ³ , κ·Έλ μ§ μμΌλ©΄ μμκ³Ό κ΅ννλ€.
μ΅λ ν 1. λΆλͺ¨λ³΄λ€ λ ν° μμμ΄ μμΌλ©΄ κ΅ννμ§ μκ³ λλΈλ€. 2. λΆλͺ¨λ³΄λ€ λ ν° μμμ΄ νλλ§ μμΌλ©΄ κ·Έ μμνκ³ κ΅ννλ©΄ λλ€. 3. λΆλͺ¨λ³΄λ€ λ ν° μμμ΄ λ μμΌλ©΄ μμλ€ μ€ ν° κ°κ³Ό κ΅ννλ€.
μ΅μ ν 1. λΆλͺ¨λ³΄λ€ λ μμ μμμ΄ μμΌλ©΄ κ΅ννμ§ μκ³ λλΈλ€. 2. λΆλͺ¨λ³΄λ€ λ μμ μμμ΄ νλλ§ μμΌλ©΄ κ·Έ μμνκ³ κ΅ννλ©΄ λλ€. 3. λΆλͺ¨λ³΄λ€ λ μμ μμμ΄ λ μμΌλ©΄ μμλ€ μ€ μμ κ°κ³Ό κ΅ννλ€.
쑰건μ λ§μ‘±ν λκΉμ§ 4μ κ³Όμ μ λ°λ³΅νλ€.
μκ°λ³΅μ‘λ
O(logn)
ꡬν
μ΅μν
#include <stdio.h>
#define MAX 1000000
typedef struct{
int heap[MAX];
int hsize;
}Heap;
void init(Heap * h){
h->hsize=0;
}
void insert(Heap * h, int key){
int p; //νμ¬ μμΉ μ μ₯
// λ§μ§λ§ μμΉμ μΆκ°
h->heap[++(h->hsize)]=key;
// μμΉ μ‘°μ
p=h->hsize;
while((h->heap[p/2])>key){
h->heap[p] = h->heap[p/2];
p/=2;
}
h->heap[p]=key;
}
int delete(Heap * h){
int min,last,child,i;
//루νΈλ
Έλκ°μ΄ μ΅μ
min = h->heap[1];
last = h->heap[(h->hsize)--];
for(i=1; i*2<=h->hsize; i=child){
child = i*2;
if(child!=h->hsize && h->heap[child+1]<h->heap[child])child++;
if(last>h->heap[child])h->heap[i]=h->heap[child];
else break;
}
h->heap[i]=last;
return min;
}
int main(int argc, const char * argv[]) {
Heap heap;
int min;
init(&heap);
insert(&heap, 10);
insert(&heap, 5);
insert(&heap, 30);
for(int i=1;i<=heap.hsize;i++){
printf("%d ",heap.heap[i]);
}
min = delete(&heap);
printf("\n%d \n",min);
for(int i=1;i<=heap.hsize;i++){
printf("%d ",heap.heap[i]);
}
min = delete(&heap);
printf("\n%d \n",min);
for(int i=1;i<=heap.hsize;i++){
printf("%d ",heap.heap[i]);
}
return 0;
}
μ΅λν
#include <stdio.h>
#define MAX 100
typedef struct{
int heap[MAX];
int hsize;
}Heap;
void init(Heap * h){
h->hsize=0;
}
void insert_max(Heap * h, int key){
int p; //νμ¬ μμΉ μ μ₯
p=++(h->hsize);
// λ§μ§λ§ μμΉμ μΆκ°
h->heap[p]=key;
// μμΉ μ‘°μ
while((h->heap[p/2])<key){
if(p==1)break;
h->heap[p] = h->heap[p/2];
p/=2;
}
h->heap[p]=key;
}
int delete_max(Heap * h){
int max,last,child,i;
//루νΈλ
Έλκ°μ΄ μ΅μ
max = h->heap[1];
last = h->heap[(h->hsize)--];
for(i=1; i*2<=h->hsize; i=child){
child = i*2;
if(child!=h->hsize && h->heap[child+1]>h->heap[child])child++;
if(last<h->heap[child])h->heap[i]=h->heap[child];
else break;
}
h->heap[i]=last;
return max;
}
int main(int argc, const char * argv[]) {
Heap heap;
int max;
init(&heap);
insert_max(&heap, 10);
insert_max(&heap, 5);
insert_max(&heap, 30);
for(int i=1;i<=heap.hsize;i++){
printf("%d ",heap.heap[i]);
}
max = delete_max(&heap);
printf("\n%d \n",max);
for(int i=1;i<=heap.hsize;i++){
printf("%d ",heap.heap[i]);
}
max = delete_max(&heap);
printf("\n%d \n",max);
for(int i=1;i<=heap.hsize;i++){
printf("%d ",heap.heap[i]);
}
return 0;
}
Last updated
Was this helpful?