본문 바로가기
자료구조

힙(Heap) 자료구조란?

by 까망 하르방 2021. 2. 27.
반응형

Heap

- 최대값 또는 최소값을 빠르게 구하기 위한 자료구조

- 완전 이진 트리를 기본으로 한 자료구조

- 마지막 레벨을 제외한 모든 레벨에 노드가 꽉 차 있어야 한다.

- 트리가 한쪽으로 기울어진 편향적인 상태를 방지하여 트리의 높이를 항상 일정.

- 부모 노드가 가진 원소는 항상 자식 노드가 가진 원소 이상.

  부모 자식간의 관계만 중요하기 때문에 왼쪽 자식과 오른쪽 자식에 대해서는 크기 제한 X

- 최대값 or 최솟값이 Root에 위치하기에 해당 값을 찾을 시 연산이 효율적.

    - 최대 힙(Max Heap): 부모노드 값  자식 노드 값

    - 최소 힙(Min Heap): 부모노드 값  자식 노드 값

 

완선된 Heap은 아래와 같습니다. 

- Max Heap이므로 Root Node에 위치한 값은 최대값입니다.

- 부모 노드 자식 노드 관계 입니다.

 

[그래프] 힙(Heap) 시뮬레이션 

 

힙(Heap) 시뮬레이션

※ [그래프] 힙(Heap) 자료구조란? 힙(Heap) 자료구조란? Heap - 최대값 또는 최소값을 빠르게 구하기 위한 자료구조 - 완전 이진 트리를 기본으로 한 자료구조 - 마지막 레벨을 제외한 모든 레벨에 노

zoosso.tistory.com

 

Heap 구조 활용

- 우선순위 큐 (Priority Queue)  

 

우선순위 큐 (Priority Queue)

우선순위 큐 큐는 선입선출(First In First Out) 자료구조이지만 우선순위 큐는 들어온 순서가 아닌 정의된 우선순위에 따라 먼저 처리되는 구조이다. ex) 수행할 작업이 여러개 있고 시간이 제한되

zoosso.tistory.com

- 힙 정렬 (Heap Sort)

 

힙 정렬 (Heap Sort)

힙 정렬 (Heap Sort) - O(N logN) - [그래프] 힙(Heap)를 이용한 정렬 입니다. 힙(Heap) 자료구조란? Heap - 최대값 또는 최소값을 빠르게 구하기 위한 자료구조 - 완전 이진 트리를 기본으로 한 자료구조 -

zoosso.tistory.com

[예제] 힙 정렬 

 

[예제] 힙 정렬 구현

Heap Sort ▶ Heap 구조가 궁금한 경우  [그래프] 힙(Heap) 힙(Heap) 자료구조란? Heap - 최대값 또는 최소값을 빠르게 구하기 위한 자료구조 - 완전 이진 트리를 기본으로 한 자료구조 - 마지막 레벨을

zoosso.tistory.com

구현

#include <stdio.h>

int swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

void heapify(int array[], int n, int i) {
    int parentNode = i;
    int leftChildNode = i * 2 + 1;
    int rightChildNode = i * 2 + 2;


    // 왼쪽 자식 노드가 존재하면서 부모노드와 값 비교.
    if (leftChildNode < n && array[parentNode] < array[leftChildNode]) {
        parentNode = leftChildNode;
    }
    // 오른쪽 자식 노드가 존재하면서 부모노드와 값 비교.
    if (rightChildNode < n && array[parentNode] < array[rightChildNode]) {
        parentNode = rightChildNode;
    }


    // 왼쪽 or 오른쪽 자식 노드 중 부모 노드보다 큰 값이 존재한 경우
    if (i != parentNode) {
        swap(&array[parentNode], &array[i]);
        // 초기 부모노드가 제자지를 찾을 때까지 내려갑니다.
        heapify(array, n, parentNode);
    }
}

void main(void) {
    int n = 9;
    int array[9] = { 7, 6, 5, 8, 3, 5, 9, 1, 6 };


    // 최대 힙(Max Heap) 구성
    for (int i = (n / 2) - 1; i >= 0; i--) {
        heapify(array, n, i);
    }


    for (int i = 0; i < n; i++) {
        printf("%d ", array[i]);
    }
}

 

관련 문제

[BOJ] 1927 최소 힙

[BOJ] 11279 최대 힙

[BOJ] 17612 쇼핑몰

[BOJ] 2696 중앙값 구하기

[BOJ] 1655 가운데를 말해요

[Jungol] 2082 힙정렬2 (Heap_Sort)

[Jungol] 1190 모두 더하기

[Jungol] 1318 못생긴 수

[Jungol] 1929 책꽂이 만들기

[Jungol] 1570 중앙값

[Algospot] RUNNINGMEDIAN 변화하는 중간값 

 

 

반응형

댓글