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

λͺ©μ°¨

    728x90

    파이썬의 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))  # 음수λ₯Ό λ‹€μ‹œ μ–‘μˆ˜λ‘œ λ³€ν™˜ν•˜μ—¬ μ΅œλŒ€κ°’ 좜λ ₯

     

    λŒ“κΈ€