알고리즘/알고리즘 노트

[자료구조]-힙

산을좋아한라쯔 2016. 8. 5. 01:00
반응형

1. 최대 힙 (백준 11279)


힙에 대한 주요 핵심

- 힙은 complete tree이다. ==> perfect에서 leaf의 오늘쪽 몇 개가 없는 트리

- 배열을 사용해서 구현. 루트 인덱스가 1

- push(x)의 경우, 배열의 가장 끝에 값을 넣은 후, 트리의 위쪽 방향으로 가면서, 선조 노드와의 값을 비교해서 바꿔가면서 루트까지 진행.

- pop()의 경우, 배열의 첫번째(루트)에 값을 넣은 후, 트리의 하위 후손방향으로 값을 비교해가면서 진행   


-----------------------------

1. 최대 힙 (백준 11279)

최대힙 자료구조를 만들어서 다음의 명령어에 대해 수행하게 하시오.

  1)배열에 자연수 x를 넣는다.

  2)배열에서 가장 큰 값을 출력하고, 그 값을 배열에서 제거한다.


핵심

최대힙의 push(), pop()을 구현하면 됨


소스

#include <stdio.h>
 
int h[100001],t=0;
int N;
void swap(int i, int j){
    int tmp=h[i];
    h[i]=h[j];
    h[j]=tmp;
}
 
void push(int x){
    h[++t]=x;
    for(int i=t;i>1;i/=2){ //i>=1이 아님에 주의
        if(h[i]>h[i/2]) swap(i,i/2);
        else break;
    }
}
 
int pop(){
    int top=h[1];
    h[1]=h[t];
    h[t--]=0;  
    int i=1;
    while(i*2<=t){  
        if(h[i]>h[i*2] && h[i]>h[i*2+1]) break;
        else if (h[i*2]>h[i*2+1]){
            swap(i,i*2); i=i*2;
        }
        else {
            swap(i,i*2+1); i=i*2+1;
        }
    }  
    return top;
}
 
int main(){
    int x;
    scanf("%d",&N);
    while(N--){    
        scanf("%d",&x);
        if(x==0) {
            if(t==0) printf("0\n");
            else printf("%d\n",pop());
        }
        else push(x);      
    }
    return 0;
}


-끝-

반응형

'알고리즘 > 알고리즘 노트' 카테고리의 다른 글

[수학]-문제  (0) 2016.08.11
[그래프]-조건 추가된 문제들  (0) 2016.08.07
[자료구조]-[리스트]-문제  (0) 2016.08.05
[자료구조]-[스택]-문제  (0) 2016.08.04
[다이나믹]-문제3  (0) 2016.07.30