λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

파이썬의 heapq λΌμ΄λΈŒλŸ¬λ¦¬μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž!

 

1. μ†Œκ°œ

heap 자료ꡬ쑰λ₯Ό κ΅¬ν˜„ν•˜λŠ” λ‚΄μž₯ λͺ¨λ“ˆμ΄κ³  μ΅œμ†Œ νž™μ„ 기본으둜 μ œκ³΅ν•œλ‹€.

λ”°λΌμ„œ κ°€μž₯ μž‘μ€ μ›μ†Œκ°€ 루트 λ…Έλ“œκ°€ λœλ‹€.

 

2. μ£Όμš” ν•¨μˆ˜λ“€

  • heapify(리슀트) : 리슀트λ₯Ό νž™μœΌλ‘œ λ³€ν™˜
  • heappush(νž™, μ›μ†Œ) : μƒˆλ‘œμš΄ μ›μ†Œ μΆ”κ°€
  • heappop(νž™) : νž™μ—μ„œ 루트 λ…Έλ“œ 제거 및 λ°˜ν™˜
  • heapreplace(νž™, μ›μ†Œ) : νž™μ—μ„œ 루트 λ…Έλ“œλ₯Ό μ œκ±°ν•˜κ³  μƒˆλ‘œμš΄ μ›μ†Œ μΆ”κ°€ ( pop&push ν•œ λ²ˆμ—! )
  • nlargeset(n, iterable, key=None) : iterable κ°μ²΄μ—μ„œ n개의 κ°€μž₯ 큰 μ›μ†Œ λ°˜ν™˜(리슀트 ν˜•νƒœ)
  • nsamllest(n, iterable, key=None) : iterable κ°μ²΄μ—μ„œ n개의 κ°€μž₯ μž‘μ€ μ›μ†Œ λ°˜ν™˜(리슀트 ν˜•νƒœ) 

 

3. μ˜ˆμ‹œ

0) λͺ¨λ“ˆ import 및 리슀트 μ„ μ–Έ

import heapq

li = [9, 4, 2, 8, 5, 1, 7 ,6, 3]

 

1) heapify(리슀트)

heapq.heapify(li)

print(li)

>>> [1, 3, 2, 4, 5, 9, 7, 6, 8]

리슀트λ₯Ό μ΅œμ†Œνž™μœΌλ‘œ λ³€ν™˜ν•˜μ˜€λ‹€.

κ°€μž₯ μž‘μ€ μ›μ†Œκ°€ 루트 λ…Έλ“œ 자리인 κ°€μž₯ μ•žμ— μœ„μΉ˜ν•˜κ³ , λΆ€λͺ¨λ…Έλ“œκ°€ 항상 μžμ‹ λ…Έλ“œλ³΄λ‹€ μž‘μ€ 값을 κ°€μ§„λ‹€.

λΆ€λͺ¨λ…Έλ“œ 인덱슀 = (μžμ‹λ…Έλ“œ 인덱슀- 1) // 2 (2둜 λ‚˜λˆˆ λͺ«)

 

 

2) heappush(νž™, μ›μ†Œ)

heapq.heappush(li, 10)
print(li)

>>> [1, 3, 2, 4, 5, 9, 7, 6, 8, 10]

μ›μ†Œλ₯Ό pushν•œλ‹€. μ΄λ•Œ heap의 μ„±μ§ˆμ„ μœ μ§€ν•˜λ©° push λœλ‹€.

 

 

3) heappop(νž™)

sItem = heapq.heappop(li)
print(sItem)
print(li)

>>> 1
>>> [2, 3, 7, 4, 5, 9, 10, 6, 8]

νž™μ˜ λ£¨νŠΈλ…Έλ“œλ₯Ό μ‚­μ œν•˜κ³  λ°˜ν™˜ν•œλ‹€.

 

 

4) heapreplace(νž™, μ›μ†Œ) pop&push ν•œλ²ˆμ—

heapq.heapreplace(li, 11)
print(li)

>>> [3, 4, 7, 6, 5, 9, 10, 11, 8] # 2κ°€ pop 되고 11 push

루트 λ…Έλ“œλ₯Ό popν•˜κ³  인자둜 μ „λ‹¬ν•œ μ›μ†Œλ₯Ό pushν•œλ‹€.

 

 

5) nlargeset(n, iterable, key=None)

largestItems = heapq.nlargest(3, li)

>>> [11, 10, 9]

인자둜 μ „λ‹¬ν•œ iterable의 κ°€μž₯ 큰 n개λ₯Ό  λ°°μ—΄μ˜ ν˜•νƒœλ‘œ λ°˜ν™˜ν•œλ‹€.

 

print(heapq.nlargest(3,[0,4,3,2,1]))

>>> [4, 3, 2]

 

 

 

6) nsamllest(n, iterable, key=None)

smallestItems = heapq.nsmallest(3, li)

>>> [3, 4, 5]

인자둜 μ „λ‹¬ν•œ iterable의 κ°€μž₯ μž‘μ€ n개λ₯Ό  λ°°μ—΄μ˜ ν˜•νƒœλ‘œ λ°˜ν™˜ν•œλ‹€.

 

 


4. μ΅œλŒ€νž™μœΌλ‘œ λ³€ν™˜ν•˜κΈ°

heapq λͺ¨λ“ˆμ€ 기본적으둜 μ΅œμ†Œνž™μ„ μ§€μ›ν•œλ‹€.

ν•˜μ§€λ§Œ 'μ›μ†Œμ— -λ₯Ό λΆ™μ—¬μ„œ νž™μ„ ꡬ성'ν•œ ν›„

λ‹€μ‹œ ν•œ 번 λͺ¨λ“  μ›μ†Œλ₯Ό μ–‘μˆ˜λ‘œ λ°”κΎΌλ‹€λ©΄ μ΅œλŒ€νž™μ„ ꡬ성할 수 μžˆλ‹€.

import heapq

li = [4, 1, 7, 3, 8, 5]
heap = [-num for num in lst]  # λͺ¨λ“  μ›μ†Œλ₯Ό 음수둜 λ³€ν™˜
heapq.heapify(heap)  # νž™μœΌλ‘œ λ³€ν™˜

print(-heapq.heappop(heap))  # 음수λ₯Ό λ‹€μ‹œ μ–‘μˆ˜λ‘œ λ³€ν™˜ν•˜μ—¬ μ΅œλŒ€κ°’ 좜λ ₯

 

λŒ“κΈ€