ㅇTL

Heap 본문

2-1/자료구조 (c)

Heap

정노르레기 2022. 5. 30. 15:56

Concepts ; Heap 이란

정의 : 여러개의 값들 중에서 가장 큰 값 / 가장 작은 값을 빠르게 탐색하도록 만들어진 binary tree 자료구조

• complete binary tree (완전  이진 트리) 임 ; 맨 아래 레벨 빼고 다 채워져있고, 맨 아래 레벨애들은 왼쪽부터 채워저 있는 것

-> 높이가 h일때 총 노드 개수는 2^h ~ 2^(h+1) -1 가 존재한당 (h-1 높이에서는  2^(h-1) -1 )

( full : 자식이 0개 또는 2개인 것 )

부모노드의 키가 자식보다 같거나 크다 (MAX heap) - root 가 젤 큼

( MIN heap은 자식이 더 크겠지용 )

 

기능

• push 

: 해당 값을 완전 이진트리가 되도록 젤 왼쪽 자식 노드에 넣는다

그리고 부모값과 비교해서 계속 바꿔가다가 부모가 더 크거나 같으면 끝~

 

 

• pop

: 루트를 리턴한다 (arr[1])

그리고 자식중 젤 오른쪽에 있는 애를 루트로 데려온다 (완전 이진 트리 만족하기 위함)

자식이 더 크면(둘중암거나) 더 큰애!!랑 바꿔준다 이거 반복

 


Priority Queue (우선순위 큐)

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

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

우선순위 큐 = 들어간 순서에 상관없이 우선순위가 높은 데이터가 먼저 나오는 자료구조 , 먼저 처리 되는 것 (delete. pop)

힙으로 구현가능! heap-based

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

 

맥스 힙 구조 = 우선순위가 높은(숫자 큰)애를 부모에 위치함 -> pop하면 우선순위 젤 높은 루트에 있는 애가 나옴

그래서 우선순위 큐는 힙으로 구현되는 것!

-> O(log n)의 복잡도를 갖게 됨 !

 

* 다른 자료구조를 사용하면

- unordered linear list

맨 뒤 삽입: O(1) (그냥 넣기만 하면되니까) / 가장큰키 가진애 삭제: O(n) (모두 탐색해야됨)

- ordered linear list

삽입: O(n) (다 탐색해서 넣어야 하므로) / 삭제 : O(1) (맨뒤에 있는거 삭제하면 되니까)

 

복잡도 : O(n log n) !!

 


Selection tree - Winner tree

- 트리 초기화

 

 

• 이걸 이용한 정렬

: 승자 = 젤 작은 값. 이걸 순서대로 리턴함 

그리고 그 루트 노드는 트리에서 제거함

이걸 n번 반복하면 정렬된 숫자 배열을 얻을 수 ㅇ

- 복잡도:

트리 초기화 O(n), 승자 찾는 과정 O(log n) (=트리의 height) 이 승자찾기를 n번 -> O(nlogn)

=> O(n*log n) !

위너삭제하고replay : O(log n) , remove/replace 위너 and replay: O(log n)

위너 get : O(1)

 

이런식으로 1 삭제^^ (루트 삭제^^)

 

Loser tree

이기는애 = 더 작은애

패자(더큰애)를 부모에 기록하고

승자를 대결시켜 그 부모에 기록함

굳굳

 

total 초기화 복잡도

-> O(n)

 

replay 복잡도 (요소 하나 바뀔 때)

-> O(log n)

'2-1 > 자료구조 (c)' 카테고리의 다른 글

Hash  (0) 2022.05.31
AVL tree  (0) 2022.05.30
Stack, queue  (0) 2022.04.17
Binary tree  (0) 2022.04.13
Skip List  (0) 2022.04.11