Programming language/Python

[python] heapq(νž™ν, μš°μ„ μˆœμœ„ν)

deo2kim 2020. 8. 26. 20:26
λ°˜μ‘ν˜•

πŸ“—heapqλž€?

κ°„λ‹¨ν•˜κ²Œ λ¦¬μŠ€νŠΈλ‚΄μ—μ„œ κ°€μž₯ μž‘μ€ 값이 λ§¨μ²˜μŒμœ„μΉ˜(인덱슀 0)μ•  였게 ν•΄μ£ΌλŠ” λ‚΄μž₯ λͺ¨λ“ˆ

μš°μ„ μˆœμœ„ 큐라고 μ•Œλ©΄ 쉽닀.

 

πŸ”΅ μ‹œμž‘ν•˜κΈ°

import heapq

 

πŸ”΅ μ„ μ–Έν•˜κΈ°

보톡 리슀트λ₯Ό μ„ μ–Έν•˜λŠ” κ²ƒμ²˜λŸΌ λ§Œλ“ λ‹€.

heap_list = []

 

πŸ”΅ μ›μ†Œ μΆ”κ°€ν•˜κΈ° ( heapq.heappush(리슀트, κ°’ ))

- μ•„λž˜ λ³΄μ΄λŠ” 것 처럼 κ°€μž₯ μž‘μ€ 값이 맨 처음 μœ„μΉ˜μ— μ™”λ‹€.

μ‹œκ°„λ³΅μž‘λ„ O(logn)

heapq.heappush(heap_list, 5)
heapq.heappush(heap_list, 10)
heapq.heappush(heap_list, 99)
heapq.heappush(heap_list, 2)

print(heap_list) # [2, 5, 99, 10]

 

πŸ”΅ μ›μ†Œ μ‚­μ œν•˜κΈ° ( heapq.heappop(리슀트) )

- 제일 μ²˜μŒμ— μžˆλŠ” 값이 μ‚­μ œλ˜λ©΄μ„œ κ·Έ 값을 λ¦¬ν„΄ν•œλ‹€. 값을 μ‚­μ œν•˜κ³  λ‹€μ‹œ 좜λ ₯ν•΄λ³΄λ‹ˆ νž™μ΄ μ •λ ¬ λ˜μ–΄ μžˆλ‹€. 

μ‹œκ°„λ³΅μž‘λ„ O(logn)

print(heapq.heappop(heap_list))  # [2, 5, 99, 10]
print(heap_list)  # [5, 10, 99] 
a = heapq.heappop(heap_list)
print(a)  # 5

 

πŸ”΅ 기쑴의 리슀트λ₯Ό νž™μœΌλ‘œ λ³€ν™˜ν•˜κΈ° ( heapq.heapify(리슀트) )

μ‹œκ°„λ³΅μž‘λ„ O(n)

ano_list = [9, 8, 7, 6, 5, 4, 1, 2, 5]
heapq.heapify(ano_list)
print(ano_list)  # [1, 2, 4, 5, 5, 9, 7, 6, 8]

 

πŸ”΅ μ΅œλŒ€κ°’ κ΅¬ν•˜κΈ°! (μ‘μš©)

- 값듀을 νŠœν”Œ ν˜•νƒœλ‘œ λ„£μ–΄μ€€λ‹€. νŠœν”Œν˜•νƒœλ‘œ λ„£μ–΄μ£Όλ©΄ νŠœν”Œμ˜ 0번째 인덱슀λ₯Ό κΈ°μ€€μœΌλ‘œ νž™μ •λ ¬μ΄ λœλ‹€.

numbers = [1,5,9,3,7,6,4,2,8]
max_list = []
for number in numbers:
    heapq.heappush(max_list, (-number, number)) # ( μš°μ„ μˆœμœ„, -λ₯Ό 뢙이면 κ°€μž₯ 큰 값이 κ°€μž₯ μž‘μ•„μ§„λ‹€. μ‹€μ œ κ°’)

while max_list:
    print(heapq.heappop(max_list)[1])
λ°˜μ‘ν˜•