πŸ‘‰μžλ£Œκ΅¬μ‘°/μ•Œκ³ λ¦¬μ¦˜ - 8

ν•™μŠ΅κΈ°λ‘

였늘 듀은 κ°•μ˜ λͺ©λ‘

  1. νž™ - 2
  2. νž™ - 3

였늘 포슀트의 주된 λ‚΄μš©μ€ νž™ κ΅¬ν˜„μΌ κ±°μ—μ˜€

배열을 ν†΅ν•œ νž™ κ΅¬ν˜„

일반적으둜 배열을 μ‚¬μš©ν•΄μ„œ 많이 κ΅¬ν˜„ν•œλ‹€.
0번 μΈλ±μŠ€λŠ” 버리고, 1번 μΈλ±μŠ€λΆ€ν„° κ΅¬ν˜„ν•˜λ©΄ νŽΈν•¨

λ°°μ—΄ νž™
μœ„ κ·Έλ¦Όμ—μ„œ 처럼 μ΅œμƒμœ„ λ…Έλ“œλ₯Ό 1,
μ™Όμͺ½λΆ€ν„° 였λ₯Έμͺ½μœΌλ‘œ +1μ”© 인덱슀λ₯Ό 작으면,
1의 μžμ‹ 2, 3
2의 μžμ‹ 4, 5
3의 μžμ‹ 6, 7
4의 μžμ‹ 8, 9
n의 μžμ‹ 2n, 2n+1둜 정리 ν•  수 μžˆλ‹€.

μ–΄λ–€ λ…Έλ“œμ˜ λ°°μ—΄μ—μ„œ 인덱슀λ₯Ό n이라 ν• λ•Œ,
λΆ€λͺ¨λ…Έλ“œμ˜ μΈλ±μŠ€λŠ” $mod(n, 2)$이고,
μ™Όμͺ½ μžμ‹λ…Έλ“œμ˜ μΈλ±μŠ€λŠ” 2n,
였λ₯Έμͺ½ μžμ‹λ…Έλ“œμ˜ μΈλ±μŠ€λŠ” 2n + 1이 λœλ‹€.

class MaxHeap():
    def __init__(self, data):
        self.heap = [None, data]
    def push(self, data):
        cur_idx = len(self.heap)
        next = cur_idx // 2
        self.heap.append(data)
        while self.heap[next] and self.heap[next] < self.heap[cur_idx]:
            self.heap[cur_idx], self.heap[next] = self.heap[next], self.heap[cur_idx]
            cur_idx = next
            next = next // 2
    def pop(self):
        if len(self.heap) > 1:
            data = self.heap[1]
            self.heap[1] = self.heap[-1]
            del self.heap[-1]
            
            if len(self.heap) > 1:
                cur = 1
                if cur * 2 + 1 < len(self.heap): # μ–‘μͺ½ λ‹€ μžμ‹λ…Έλ“œ 쑴재
                    next = cur * 2 if self.heap[cur * 2] > self.heap[cur * 2 + 1] else cur * 2 + 1
                elif cur * 2 < len(self.heap): # μ™Όμͺ½λ§Œ μžμ‹λ…Έλ“œ 쑴재
                    next = cur * 2
                else: # μžμ‹λ…Έλ“œ μ—†μŒ, 반볡문 μ‹€ν–‰μ•ˆν•¨
                    next = cur
                while next < len(self.heap) and self.heap[cur] < self.heap[next]:
                    print("swap", self.heap[cur], self.heap[next])
                    self.heap[cur], self.heap[next] = self.heap[next], self.heap[cur]
                    cur = next
                    if cur * 2 + 1 < len(self.heap): # μ–‘μͺ½ λ‹€ μžμ‹λ…Έλ“œ 쑴재
                        next = cur * 2 if self.heap[cur * 2] > self.heap[cur * 2 + 1] else cur * 2 + 1
                    elif cur * 2 < len(self.heap): # μ™Όμͺ½λ§Œ μžμ‹λ…Έλ“œ 쑴재
                        next = cur * 2
                    else: # μžμ‹λ…Έλ“œ μ—†μŒ, 반볡문 μ‹€ν–‰μ•ˆν•¨
                        next = cur
            return data

mh = MaxHeap(100)
mh.push(1000)
mh.push(500)
mh.push(300)
mh.push(700)

data = mh.pop()
while data:
    print(data)
    print(mh.heap)
    print()
    data = mh.pop()

μ‹€ν–‰κ²°κ³Ό

μ‹€ν–‰κ²°κ³ΌλŠ” μœ„μ™€ κ°™λ‹€.
λ‹¨μˆœν•˜κ²Œ νž™μ—μ„œ μΆ”κ°€(push)와 μ‚­μ œ(pop)만 κ΅¬ν˜„ν–ˆλ‹€.

데이터 μ‚½μž… κ΅¬ν˜„

μ €λ²ˆμ‹œκ°„μ—λ„ μ μ—ˆμ§€λ§Œ,

맨 λ§ˆμ§€λ§‰μ— 데이터λ₯Ό λ„£κ³  μ‹œμž‘ν•΄μ„œ,
λΆ€λͺ¨λ…Έλ“œλ³΄λ‹€ ν˜„μž¬λ…Έλ“œκ°€ 더 크닀면 μ„œλ‘œ μŠ€μ™‘ν•˜λŠ” 과정을 λ°˜λ³΅ν•œλ‹€.

데이터 μ‚­μ œ κ΅¬ν˜„

μ²˜μŒμ—λŠ” 아무생각없이 λ§ˆμ§€λ§‰ μš”μ†Œμ„ μ‚­μ œν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν–ˆλ‹€.

λ¨Όμ € μ΅œμƒμœ„ λ…Έλ“œμ— λ§ˆμ§€λ§‰ λ…Έλ“œλ₯Ό λ„£κ³ , λ§ˆμ§€λ§‰ λ…Έλ“œλ₯Ό μ‚­μ œν•œλ‹€. λ…Έλ“œκ°€ λ‚¨μ•„μžˆλ‹€λ©΄, ν˜„μž¬ λ…Έλ“œμ™€ μžμ‹ λ…Έλ“œλ₯Ό λΉ„κ΅ν•˜μ—¬ ν•˜μœ„ λ…Έλ“œκ°€ 더 크닀면 μ„œλ‘œ μŠ€μ™‘ν•˜λŠ” 과정을 λ°˜λ³΅ν•œλ‹€.

λ§ˆμ§€λ§‰

μ–΄μ©Œλ‹€ λ³΄λ‹ˆ λ§ˆμ§€λ§‰ 자료ꡬ쑰 κ°•μ˜κΉŒμ§€ λ“€μ—ˆλ‹€.
λ‹€μŒμ— 트리λ₯Ό λ‹€μ‹œ μ œλŒ€λ‘œ κ΅¬ν˜„ν•΄λ΄μ•Όκ² μ§€λ§Œ, ν‰μΌμ—λŠ” μ‹œκ°„μ΄ μ•ˆλ‚˜μ„œ 주말에 해봐야겠닀.
이런 속도면 50일 μ•ˆμ— 이 κ°•μ’Œ 전체λ₯Ό λͺ‡ μ‚¬μ΄ν΄μ΄λ‚˜ 돌릴 수 μžˆμ„κΉŒ?
방금 λŒ€μΆ© μ˜ˆμƒν•΄λ³΄λ €λ‹€κ°€ μ§ˆλ¦΄λ»”ν–ˆλ‹€..γ…‹γ…‹ μ§€κΈˆ μ΄λŒ€λ‘œλ§Œ ν•˜μžγ… γ… 

이건 κ·Έλƒ₯ κΈ°λΆ„μ’‹μ•„μ„œ 찍은 인증샷?
쀑간에 MAC에 μ£Όν”Όν„°μ„€μΉ˜ κ°•μ˜κ°€ λΌμ–΄μžˆμ–΄μ„œ κ±΄λ„ˆλ›°μ–΄μ„œ 체크가 μ•ˆλ˜μžˆλŠ”λ° μ•½κ°„ 뢈-νŽΈν•˜λ‹€.
인증샷

λ‹€μŒ κ°•μ˜λΆ€ν„°λŠ” μ•Œκ³ λ¦¬μ¦˜ 이둠!
κ°€μž₯ μž¬λ―ΈμžˆμœΌλ©΄μ„œ :) , κ°€μž₯ ν™”λ‚  μˆ˜λ„ μžˆλŠ” λΆ€λΆ„ :(

(μ˜€λŠ˜μ€ κΈ€μžλ³΄λ‹€ μ½”λ“œκ°€ 더 λ§Žλ„€?)

λŒ“κΈ€λ‚¨κΈ°κΈ°