Coding Test/algorithm

[컴퓨터 알고리즘 기초] 6. 힙 정렬 알고리즘

조용장 2022. 6. 4. 15:16

힙(heap) 정렬 알고리즘

힙 구조

- 힙의 형태

  • 완전 이진 트리에 가까운 형태
  • 이진트리는 각 노드의 자식수가 2이하인 경우
  • 완전 이진트리는 Root 노드 부터 Leaf 노드까지 빠짐없이 채워져 있는 트리

 

- 최대힙 특성

  • A[PARENT(i)]>=A[i]
    • 부모 노드의 값은 항상 자식 노드의 값보다 크다.
    • 따라서 전체 트리의 Root 노드값이 가장 크다.
    • 또한 각 하위 트리 구조의 Root 노드가 가장 큰 값을 가진다.

 

- 최소힙 특성

  • A[PARENT(i)]<=A[i]
    • 자식 노드의 값은 항상 부모 노드의 값보다 크다.
    • 따라서 전체 트리의 Root 노드 값이 가장 잓다.
    • 또한 각 하위 트리 구조의 Root 노드가 가장 작은 값을 가진다.

 

- 힙의 배열 저장 방식

Root 노드는 배열의 첫 번째 A[1] 에 저장

각각의 노드들은 레벨별로 저장

 

* 힙을 배열에 저장하면 다음과 같이 검색이 가능하다.

  • Parent(i) = i/2
  • left(i) = 2i
  • right(i) = 2i+1

 

- 노드의 높이

노드의 높이는 현재 노드에서 left노드까지 내려갈 때 가장 단순하게 내려가는 가장 긴 경로에서 거져야하는 간선의 수이다.

Root 노드로 부터 트리의 높이

  • O(logn)
  •  Heap은 완전 이진 트리 구조를 가지기 때문에 각 레벨 마다 노드의 수가 2배씩 증가하므로 높이는 O(logn)

 

힙 특성 관리

- Max-Heapify

노드가 입력으로 주어졌을때, 노드의 좌우 하위 트리들은 max-heap 특성을 유지하지만 노드의 값이 하위 트리 값보다 작거나 같아서 max-heap 특성을 만족하지 않을 때 max-heap 특성이 유지 되도록 바꾸는 연산

주어진 노드의 값을 "흘러내리게"해서 주어진 노드와 하위 트리가 max-heap 특성을 가질 수 있도록 변경

 

- Max-Heapify의 수행시간

  • n을 하위 트리의 노드의 개수라고 할때
  • 힙의 높이 O(h) =O(logn)
  • 따라서 전체 수행기산은 O(logn) 시간

 

힙 구조 만들기

- Build-Max-Heap

build_max_heap(A)
    A.heap_size = A.length
    for i=[A.length/2] downto 1
        max_heapify(A,i)

 

- 힙 구조 만들기 수행 시간

수행 시간 분석

  • Max-Heapify를 한번 호출 할 때 마다 O(logn)
  • Max-Heapify의 호출 횟수는 O(n)
  • 따라서 전체 수행 시간은 O(nlogn) 이 된다.

 

최대값 추출

- 최대값 추출(Extract-Max)

heap에서 가장 큰 값을 제거하고 Max-heap 구조를 복원하는 연산

 - 제일 큰 값(첫번째)을 뽑고 마지막에 있는 값을 첫번째 값으로 옮겨준다

 - 이후 heapify를 진행한다.

 

힙 소트

- 힙 소트(heap sort)의 Pseude code

heaposort(A)
    build_max_heap(A)
    for i=[A.length/2] downto 2
        exchange A[1] with A[i]
        A.heap_size = A.length - 1
        max_heapify(A,1)

 

- 힙 소트의 수행 시간

수행 시간 분석

  • A[1...n]에 대해 Build_max_heap를 수행하는 시간 O(nlogn)
  • extract-Max를 n번 반복
  • 전체 수행시간 O(nlogn)