우선순위 큐
우선순위가 가장 높은 데이터를 가장 먼저 삭제하는 자료구조이다. 예를 들어 어러 개의 물건 데이터를 자료구조에 넣었다가 가치가 높은 물건 데이터부터 꺼내서 확인해야 하는 경우에 우선순위 큐를 이용할 수 있다. 우선순위 값을 표현할 때는 일반적으로 정수형 자료형의 변수가 사용된다.
예를 들어, 물건 정보가 있고, 이 물건 정보는 물건의 가치와 물건의 무게로만 구성된다고 가정해보자. 그러면 모든 물건 데이터를 (가치, 물건)으로 묶어서 우선순위 큐 자료구조에 넣을 수 있다. 이후에 우선순위 큐에서 물건을 꺼내게 되면, 항상 가치가 높은 물건이 먼저 나오게 된다.(최대 힙 기준) 대부분의 프로그래밍 언어에서는 우선순위 큐 라이브러리에 데이터의 묶음을 넣으면, 첫 번째 원소를 기준으로 우선순위를 설정한다.
Python, C++, Java를 포함한 대부분의 프로그래밍 언어에서 표준 라이브러리 형태로 지원한다.
힙(Heap)
우선순위 큐를 구현하기 위해 사용하는 자료구조 중 하나이다. 최소 힙(Min Heap)과 최대 힙(Max Heap)이 있다. 최소 힙은 '값이 낮은 데이터가 먼저 삭제'되며 최대 힙은 '값이 큰 데이터가 먼저 삭제'된다. 파이썬 라이브러리에서는 기본적으로 최소 힙 구조를 이용한다.
우선순위 큐를 단순히 리스트를 이용해서 구현할 수도 있지만, 삭제할 때마다 모든 원소를 확인해서 우선순위가 가장 높은 것을 찾아야 하므로 최악의 경우 O(N)의 시간이 소요된다.
최소 힙
힙 라이브러리 사용 예제를 알아보자. 파이썬은 기본적으로 최소 힙을 제공한다.
import heapq
# 오름차순 힙 정렬(Heap Sort)
def heapsort(iterable):
h=[]
result=[]
# 모든 원소를 차례대로 힙에 삽입
for value in iterable:
heapq.heappush(h,value)
# 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
for i in range(len(h)):
result.append(heapq.heappop(h))
return result
result=heapsort([1,3,5,7,9,2,4,6,8,0])
print(result)
최대 힙
파이썬에서 최대 힙은 라이브러리로 제공하지 않기 때문에 삽입, 삭제할 때 '-'를 붙인다.
import heapq
# 내림차순 힙 정렬(Heap Sort)
def heapsort(iterable):
h=[]
result=[]
# 모든 원소를 차례대로 힙에 삽입
for value in iterable:
heapq.heappush(h,-value)
# 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
for i in range(len(h)):
result.append(-heapq.heappop(h))
return result
result=heapsort([1,3,5,7,9,2,4,6,8,0])
print(result)
'python > python' 카테고리의 다른 글
[Python] datetime - fromtimestamp() (타임스탬프를 날짜로 변환하기) (0) | 2021.08.26 |
---|---|
cmp_to_key 정렬 (0) | 2021.03.09 |
이진 탐색 트리 (0) | 2021.02.09 |
그래프 (0) | 2021.02.09 |
재귀함수 (0) | 2021.02.09 |