danuri
오늘의 기록
danuri
전체 방문자
오늘
어제
  • 오늘의 기록 (307)
    • java (150)
      • java (33)
      • spring (63)
      • jpa (36)
      • querydsl (7)
      • intelliJ (9)
    • kotlin (8)
    • python (24)
      • python (10)
      • data analysis (13)
      • crawling (1)
    • ddd (2)
    • chatgpt (2)
    • algorithm (33)
      • theory (9)
      • problems (23)
    • http (8)
    • git (8)
    • database (5)
    • aws (12)
    • devops (10)
      • docker (6)
      • cicd (4)
    • book (44)
      • clean code (9)
      • 도메인 주도 개발 시작하기 (10)
      • 자바 최적화 (11)
      • 마이크로서비스 패턴 (0)
      • 스프링으로 시작하는 리액티브 프로그래밍 (14)
    • tistory (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

태그

  • RDS
  • S3
  • docker
  • 도메인 주도 설계
  • ChatGPT
  • Thymeleaf
  • 등가속도 운동
  • 마이크로서비스패턴
  • Database
  • AWS
  • Security
  • DDD
  • 자바 최적화
  • mockito
  • reactive
  • gitlab
  • Java
  • SWAGGER
  • Jackson
  • CICD
  • Saving Plans
  • Bitmask
  • POSTGIS
  • nuribank
  • JPA
  • Kotlin
  • connection
  • Spring
  • PostgreSQL
  • 트랜잭션

최근 댓글

최근 글

hELLO · Designed By 정상우.
danuri

오늘의 기록

우선순위 큐
python/python

우선순위 큐

2021. 2. 9. 00:42

우선순위 큐


우선순위가 가장 높은 데이터를 가장 먼저 삭제하는 자료구조이다. 예를 들어 어러 개의 물건 데이터를 자료구조에 넣었다가 가치가 높은 물건 데이터부터 꺼내서 확인해야 하는 경우에 우선순위 큐를 이용할 수 있다. 우선순위 값을 표현할 때는 일반적으로 정수형 자료형의 변수가 사용된다.

 

예를 들어, 물건 정보가 있고, 이 물건 정보는 물건의 가치와 물건의 무게로만 구성된다고 가정해보자. 그러면 모든 물건 데이터를 (가치, 물건)으로 묶어서 우선순위 큐 자료구조에 넣을 수 있다. 이후에 우선순위 큐에서 물건을 꺼내게 되면, 항상 가치가 높은 물건이 먼저 나오게 된다.(최대 힙 기준) 대부분의 프로그래밍 언어에서는 우선순위 큐 라이브러리에 데이터의 묶음을 넣으면, 첫 번째 원소를 기준으로 우선순위를 설정한다.

 

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
    'python/python' 카테고리의 다른 글
    • [Python] datetime - fromtimestamp() (타임스탬프를 날짜로 변환하기)
    • cmp_to_key 정렬
    • 이진 탐색 트리
    • 그래프
    danuri
    danuri
    IT 관련 정보(컴퓨터 지식, 개발)를 꾸준히 기록하는 블로그입니다.

    티스토리툴바