-
[자료구조] 우선순위 큐와 힙 / 최소 힙 / 최대 힙 / heap /algorithm/개념 2023. 3. 31. 00:21반응형
우선순위 큐
Queue 자료구조는 먼저 집어 넣은 데이터가 먼저 나오는 선입선출 FIFO(First In First Out) 구조로 저장
우선순위큐(priority queue)는 들어간 순서에 상관없이 우선순위가 높은 데이터 먼저 나온다.
힙 (Heap) 이란?
- Heap은 우선순위큐(priority queue)의 구현과 일치
- Heap은 완전이진트리 구조
- 최소 힙 : 각 node에 저장된 값은 child node들에 저장된 값보다 작거나 같다
- 최대 힙 : 각 node에 저장된 값은 child node들에 저장된 값보다 크거나 같다
파이썬 힙 함수
- heapq.heappush(heap, item) : item을 heap에 추가
- heapq.heappop(heap) : heap에서 가장 작은 원소를 pop + 리턴. 비어 있는 경우 IndexError
1. 최소 힙
import heapq # 오름차순 힙 정렬 def heapsort(iterable): h = [] result = [] # 모든 원소를 차례대로 힙에 삽입 for value in iterable: heapq.heappush(h, value) # 힙에 삽입된 모든 원소를 차례대로 꺼내어 result 에 추가 for i in range(len(h)): result.append(heapq.heappop(h)) return result array = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0] res = heapsort(array) for i in range(len(array)): print(res[i],end=' ') # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
2. 최대 힙
import heapq # 내림차순 힙 정렬 def heapsort(iterable): h = [] result = [] # 모든 원소를 차례대로 힙에 삽입 for value in iterable: heapq.heappush(h, -value) # 힙에 삽입된 모든 원소를 차례대로 꺼내어 result 에 추가 for i in range(len(h)): result.append(-heapq.heappop(h)) return result array = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0] res = heapsort(array) for i in range(len(array)): print(res[i],end=' ') # 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
시간복잡도
push pop O(logN) O(logN) heap tree의 높이는 logN
push 할 때 swap 하는 과정이 최대 logN 반복되서 O(logN)heap tree의 높이는 logN
pop 할 때 swap 하는 과정이 최대 logN 반복되서 O(logN)반응형'algorithm > 개념' 카테고리의 다른 글
[Python] 위상정렬 (0) 2023.06.16 [Python] 크루스칼 알고리즘 / MST / 최소 신장 트리 (0) 2023.06.16 [Python] Union - Find 유니온 파인드/서로소 집합 (0) 2023.06.16 [알고리즘] 이분탐색 (0) 2022.03.14 [알고리즘] 완전탐색 / itertools / 순열 중복순열 조합 중복조합 (0) 2022.03.12