nayeoniee
개발공부 노트
nayeoniee
전체 방문자
오늘
어제
  • 분류 전체보기 (53)
    • Deep Learning (16)
      • 개념 정리 (6)
      • 논문 리뷰 (2)
      • 논문 구현 (0)
      • Object Detection (8)
    • Algorithm (16)
      • 개념 정리 (5)
      • 이코테 (1)
      • baekjoon (5)
      • programmers (4)
      • LeetCode (1)
    • Project (4)
      • Boostcamp AI Tech (4)
    • 자격증 (16)
      • AWS (1)
      • 정보처리기사 필기 (15)
    • 기타 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 이코테
  • 서로소 집합
  • 딥러닝
  • 운영체제 #데이터베이스 관리시스템 #웹애플리케이션 #오픈소스 #OS #DBMS #WAS
  • ELECTRA
  • 데이터제작
  • python
  • Anchor box
  • selective search
  • 프로그래머스
  • KLUE
  • aif-c01
  • dp
  • wandb
  • 현행시스템파악
  • spatial pyramid pooling
  • 2-stage
  • 그래프
  • LIS
  • object detection
  • 알고리즘
  • F1 Score
  • boostcamp
  • FLOPs
  • 1-stage
  • 회고
  • re
  • 이진탐색
  • BFS
  • 백준

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
nayeoniee

개발공부 노트

Algorithm/개념 정리

[자료구조] 우선순위 큐 (heapq)

2022. 8. 13. 00:54

우선순위 큐

  • 우선순위 큐(Priority Queue)란 우선순위가 가장 높은 데이터를 가장 먼저 삭제하는 큐이다. 데이터를 우선순위에 따라 처리하고 싶을 때 유용한 자료구조이다.
  • 힙 자료구조는 우선순위 큐를 구현하기 위해 사용되는 자료구조이다.

대부분의 언어에서 표준 라이브러리 형태로 지원한다. 파이썬에는 PriorityQueue 또는 heapq를 사용할 수 있는데, 일반적으로 heapq가 더 빠르게 동작하기 때문에 수행 시간이 제한된 경우에는 heapq 사용을 권장한다.

 

  • 큰 숫자에 우선순위를 부여하는 힙을 최대 힙(Max Heap), 작은 숫자에 우선순위를 부여하는 힙을 최소 힙(Min Heap)이라고 한다.
  • heapq는 내부적으로 트리로 구현되어 있어 데이터를 삽입, 삭제하는데 O(logN) 만큼의 시간이 소요된다.

 

heapq 사용하기

heapq를 임포트한 후에, 우선순위 큐로 사용할 리스트를 하나 선언한다.

데이터 삽입은 heapq.heappush(삽입될 리스트, 삽입할 값)

데이터 삭제는 heapq.heappop(삭제될 리스트)

이렇게 사용할 수 있다.

 

최소 힙을 사용한 오름차순 정렬

이러한 heapq의 특성을 사용해 정렬 알고리즘을 구현할 수 있다.

import heapq

# heapq를 사용한 정렬
def heapsort_asc(nums):
    h = []
    res = []

    for num in nums:
        heapq.heappush(h, num)
    
    for i in range(len(h)):
        res.append(heapq.heappop(h))
    
    return res


nums = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
res = heapsort_asc(nums)
print('res:', res)

 

최대 힙을 사용한 내림차순 정렬

파이썬 heapq 라이브러리에서는 최대 힙을 지원하지 않기 때문에 힙에 값을 삽입, 삭제할 때 음수 부호(-)를 붙여 최대 힙을 구현한다.

def heapsort_desc(nums):
    h = []
    res = []

    for num in nums:
        heapq.heappush(h, -num)
    
    for i in range(len(h)):
        res.append(-heapq.heappop(h))
    
    return res


nums = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
res = heapsort_desc(nums)
print('res:', res)

 

'Algorithm > 개념 정리' 카테고리의 다른 글

[그래프] 서로소 집합으로 사이클 판별하기  (0) 2022.08.19
[그래프] 서로소 집합  (0) 2022.08.19
[최단경로] 다익스트라  (0) 2022.08.13
[DP] 가장 긴 증가하는 부분 수열 (LIS)  (0) 2022.08.12
    'Algorithm/개념 정리' 카테고리의 다른 글
    • [그래프] 서로소 집합으로 사이클 판별하기
    • [그래프] 서로소 집합
    • [최단경로] 다익스트라
    • [DP] 가장 긴 증가하는 부분 수열 (LIS)
    nayeoniee
    nayeoniee

    티스토리툴바