불타는고굼이 2023. 10. 21. 11:26
반응형

힙(heap)이란?

  • 완전 이진 트리의 일종으로 우선순위 큐를 위하여 만들어진 자료구조이다.
  • 여러 개의 값들 중에서 최댓값이나 최솟값을 빠르게 찾아내도록 만들어진 자료구조이다.
  • 힙은 일종의 반정렬 상태(느슨한 정렬 상태) 를 유지한다.
  • 큰 값이 상위 레벨에 있고 작은 값이 하위 레벨에 있다는 정도
  • 간단히 말하면 부모 노드의 키 값이 자식 노드의 키 값보다 항상 큰(작은) 이진 트리를 말한다.
  • 힙 트리에서는 중복된 값을 허용한다. (이진 탐색 트리에서는 중복된 값을 허용하지 않는다.)

힙 종류

  • 최대 힙(max heap)
    • 부모 노드 값이 자식 노드의 값보다 크거나 같음
    • 루트 값은 저장된 원소 중 가장 큼
  • 최소 힙(min heap)
    • 부모 노드 값이 자식 노드의 값보다 작거나 같음
    • 루트 값은 저장된 원소 중 가장 작음

힙 구현

  • 배열로 구현
  • 인덱스 0 사용하지 않음
  • 부모-자식 사이 인덱스 관계
    • 인덱스 i에서 부모인덱스: i/2
    • 인덱스 i에서 왼쪽 인덱스: i * 2
    • 인덱스 i에서 오른쪽 인덱스: ( i * 2 )+1

힙 연산

  • 삽입 연산
    1) 마지막 위치에 노드 만들어 삽입 -> 구조적 성질 만족
    2-1) 부모 노드보다 값이 작으면 끝
    2-2) 부모 노드보다 값이 크면 부모노드와 스위치
    3) 2번 과정 최대 루트까지 반복 -> 힙의 성질 만족시키기
  • 삭제연산
    1) 루트 노드 값 제거
    2) 마지막 노드 값 루트로 옮기고 노드 삭제 -> 구조적 성질 만족
    3-1) 자식 노드보다 값 크면 끝
    3-2) 자식 노드보다 값 작으면 스위치
    4) 3번 과정 최대 리프까지 반복 -> 힙의 성질 만족시키기

시간복잡도

  • 삽입연산
    • 최악의 경우 교환을 반복하여 리프노드에서 루트노드가 될 수 있음
    • 교환은 O(1)시간에 처리
  • 삭제연산
    • 최악의 경우 교환을 반복하여 루트노드에서 리프노드가 될 수 있음
    • 교환은 O(1)시간에 처리

두 연산 모두 최악의 경우 교환 횟수는 힙의 높이(height)가 된다. 힙은 완전 이진 트리이므로 높이가 log_2 n을 넘지 않는다. 따라서 두 연산의 시간복잡도는 O(log n)이다.

 

연산시간복잡도

삽입 O(log n)
삭제 O(log n)

힙 응용 1 - 우선순위 큐

  • 큐의 선입선출와 달리 우선순위가 높은 데이터가 먼저 나옴
  • 힙을 통해 우선순위 큐 구현

힙 응용 2 - 힙 정렬

  • 힙 정렬
    1) 정렬할 데이터 n개 하나씩 힙에 삽입 -> O(n) * O(logn)
    2) 최댓값 차례로 하나씩 삭제하여 보관 -> O(n)
  • 시간복잡도: O(nlogn) + O(n) = O(nlogn)

Referece

https://velog.io/@suk13574/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0Java-%ED%9E%99heap

 

[자료구조/Java] 힙(heap)

✔ 목차 힙(heap)이란? 힙 종류 힙 구현 힙 연산 시간복잡도 힙 응용 - 우선순위 큐 힙 응용 - 힙 정렬 🔎 힙(heap)이란? 완전 이진트리 중복값 허용 흽의 왼쪽 부트리와 오른쪽 부트리 모두 힙 최댓

velog.io

https://gmlwjd9405.github.io/2018/05/10/data-structure-heap.html

 

[자료구조] 힙(heap)이란 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

728x90
반응형