관리 메뉴

πŸ’»πŸ’­πŸŽ§πŸŒ

μš°μ„ μˆœμœ„ 큐 (Priority Queue) λ³Έλ¬Έ

μ•Œκ³ λ¦¬μ¦˜

μš°μ„ μˆœμœ„ 큐 (Priority Queue)

adorableco 2023. 2. 15. 16:18
λ°˜μ‘ν˜•

μš°μ„ μˆœμœ„ νλž€?

  • μš°μ„  μˆœμœ„κ°€ κ°€μž₯ 높은 데이터λ₯Ό κ°€μž₯ λ¨Όμ € μ‚­μ œν•˜λŠ” 자료ꡬ쑰
  • μš°μ„ μˆœμœ„ νλŠ” 데이터λ₯Ό μš°μ„ μˆœμœ„μ— 따라 μ²˜λ¦¬ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•¨.

 

κ΅¬ν˜„ ν•˜λŠ” 방법 

1) λ‹¨μˆœνžˆ 리슀트λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν˜„

2) νž™(heap)을 μ΄μš©ν•˜μ—¬ κ΅¬ν˜„

 

μš°μ„  μˆœμœ„ 큐 κ΅¬ν˜„ 방식 μ‚½μž… μ‹œκ°„ μ‚­μ œ μ‹œκ°„
리슀트 O(1) O(N)
νž™(Heap) O(logN) O(logN)

 

  • λ‹¨μˆœνžˆ N개의 데이터λ₯Ό νž™μ— λ„£μ—ˆλ‹€κ°€ λͺ¨λ‘ κΊΌλ‚΄λŠ” μž‘μ—…μ€ μ •λ ¬κ³Ό λ™μΌν•˜λ‹€.
    • 이 경우 μ‹œκ°„ λ³΅μž‘λ„λŠ” O(NlogN)

 

νž™(Heap)의 νŠΉμ§•

  • νž™μ€ μ™„μ „ 이진 트리 자료ꡬ쑰의 일쒅이닀.
  • νž™μ—μ„œλŠ” 항상 루트 λ…Έλ“œ(root node)λ₯Ό μ œκ±°ν•œλ‹€.
  • μ΅œμ†Œ νž™(min heap)
    • 루트 λ…Έλ“œκ°€ κ°€μž₯ μž‘μ€ 값을 가진닀
    • λ”°λΌμ„œ 값이 μž‘μ€ 데이터가 μš°μ„ μ μœΌλ‘œ μ œκ±°λœλ‹€.
  • μ΅œλŒ€ νž™(max heap)
    • 루트 λ…Έλ“œκ°€ κ°€μž₯ 큰 값을 가진닀.
    • λ”°λΌμ„œ 값이 큰 데이터가 μš°μ„ μ μœΌλ‘œ μ œκ±°λœλ‹€. 

μ™„μ „ 이진 트리 (Complete Binary Tree)

  • μ™„μ „ 이진 νŠΈλ¦¬λž€ 루트 λ…Έλ“œλΆ€ν„° μ‹œμž‘ν•˜μ—¬ μ™Όμͺ½ μžμ‹ λ…Έλ“œ, 였λ₯Έμͺ½ μžμ‹ λ…Έλ“œ μˆœμ„œλŒ€λ‘œ 데이터가 μ°¨λ‘€λŒ€λ‘œ μ‚½μž…λ˜λŠ” 트리λ₯Ό μ˜λ―Έν•¨.

 

μ΅œμ†Œ νž™ ꡬ성 ν•¨μˆ˜ : Min-Heapify()

  • (상ν–₯식) λΆ€λͺ¨ λ…Έλ“œλ‘œ 거슬러 μ˜¬λΌκ°€λ©°, λΆ€λͺ¨λ³΄λ‹€ μžμ‹ μ˜ 값이 더 μž‘μ€ κ²½μš°μ— μœ„μΉ˜λ₯Ό κ΅μ²΄ν•©λ‹ˆλ‹€.

 

 

μš°μ„  μˆœμœ„ 큐 라이브러리λ₯Ό ν™œμš©ν•œ νž™ μ •λ ¬ κ΅¬ν˜„ 예제

import sys
import heapq
input = sys.stdin.readline

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

n = int(input())
arr = []

for i in range(n):
	arr.append(int(input()))
res = heapsort(arr)

for i in range(n):
	print(res[i])
λ°˜μ‘ν˜•