ㅇTL

Heapsort 본문

2-2/알고리즘

Heapsort

정노르레기 2021. 10. 12. 01:14

Heap

0. concepts

  • 완전 이진트리의 일종 ( 완전 이진 트리란 마지막 레벨을 제외한 모든 레벨의 node가 완전히 채워져 있으며 마지막 레벨의 node들은 가능한 한 왼쪽부터 채워져 있는 구조를 말한다. )
  • 반 정렬 상태(느슨한 정렬 상태) 를 유지함. 큰 값이 상위 레벨에 있고 작은 값이 하위 레벨에 있다는 정도! 걍 부모가 더 크다

  • 종류 2개 ; max-heaps(부모가 자식보다 같거나 큰 것. root가 젤 큰애^^) , min-heaps(수업에서 x)

 ->array 저장 가능

  • array에 저장될 수 있다 레벨 순서대로 저장~
  • root = A[1]
  • i 노드의 parent 인덱스 = i/2의 정수 (언더) (3/2 = 1)
  • i 노드의 left 인덱스 = 2i
  • i 노드의 right 인덱스 = 2i+1

  • height of a node : 해당 노드서부터 리프까지 노드개수 (걍 아래에잇는 노드 개수) 위 그림에서 14의 height=2
  • height of a heap : 루트노드의 height. Θ(lgn)이다 (n=element 개수. 힙은 complete binary라서 Θ(lgn)이 보장됨)

1. algorithm

a. max-heapify

- 계속 힙 성질 유지하도록 한다 (부모가 큰거)

  • float down - 해당 노드가 자식보다 작으면, 자식중에서 더 큰 애랑 자리를 바꾼다 ~.~ 그렇게 계속 내려간다 ^^

- running time ?

T(n) ( n=서브트리 노드의 개수 )

- 값 교환하는데에는 Θ(1)

- 최대 h번 함 (lgn)

-> O(lgn)

 

 

b. building a heap (걍 a를 모든 힙 구성요소에 적용되도록 하는 것)

- 슈도코드

- 러닝타임

1. upper bound

: O(lgn)*n/2(의 다운바운드) = O(nlgn)

2. tight bound

: 한 노드에서 실행되는 max-heapify연산 횟수는 모두 다르다 ! (height의 차이도 중요!! height작은애들이 훨씬 많으니까 일괄적으로 해버리면 부정확)

각 층에서의 노드 개수는

나머지 구하는 과정은 복잡

답만적으면 tight bound는 O(n)

 

c. extract-max

: 젤 큰 친구를 뺍니다

- 빼는 연산 연산: O(1). 걍 부모 빼면 됨

- 맨 마지막(인덱스. 걍 리프중 가장 오른쪽) 애를 부모에 넣음

- 복구하기 : O(lgn) (부모에서 max-heapify연산함)

-> O(lgn)

 

d. heapsort

: 힙으로 정렬해서 최댓값 차례로 빼내서 배열을 정렬하는 것

1.  A[1...n]에 대해 max-heap을 만든다 => O(n)

2. extract-max를 n번 한다 => O(nlgn)

- 수도코드

 

2. priority queues

* 큐 = first in first out. (high priority 가진애(=먼저 들어간 애)가 먼저 나온다)

(우선순위가 높다=더앞에 있다. 더 먼저나온다)

우선순위 큐 = 들어간 순서에 상관없이 우선순위가 높은 데이터가 먼저 나오는 것 , 먼저 처리 되는 것. 힙으로 구현가능! heap-based

(여기선 우선순위가 크다 = 숫자가 더 크다!)

 

-> 우선순위 큐 연산들

1. INSERT(S,key) : set S에 key를 넣는다

-사이즈를 하나 늘리고, 맨 마지막요소에 -무한대를 둔다 (그럼 젤 작은값이 되겟지요)

그리고 해당 값을 key로 증가시켜준다!(바꿔준다) = INCREASE-KEY(S,x,key)를 한다

-> O(lg n )

(수도코드)

2. MAXIMUM(S) : largest key를 가진 element 리턴한다 (걍젤큰거리턴. =우선순위가젤큰거 리턴)

- 걍 맨뒤꺼 읽으면 되서 O(1)

3. EXTRACT-MAX(S) : 가장 큰친구를 삭제하고 리턴한다 (=deque)

-맨위꺼 삭제하고 max-heapify를 한다 (그리고 머 마지막꺼 지워주겟지, 그리고 삭ㅈㅔ햇던 젤큰거 리턴하겟지 모)

-> O(lg n) (=max-heapify)

4. INCREASE-KEY(S,x,k) : S에서 x의 키를 k로 증가시킨다 (x=인덱스. x의 키를 k로 바꿔줌)

- 걍 해당 엘리먼트값을 k로 바꿔준담에 max-heapify

-> O(lg n)

 

 

'2-2 > 알고리즘' 카테고리의 다른 글

Sorting in linear time  (0) 2021.10.16
quick sort  (0) 2021.10.15
Solving recurrences  (0) 2021.10.10
Asymptotic notation  (0) 2021.10.10
Sorting 알고리즘  (0) 2021.10.08