๐ข๋ณธ ํฌ์คํธ์ ์ ์๊ถ์ ์ธํ๋ฐ ์ฝ๋ฉํ
์คํธ [ ALL IN ONE ] ๊ฐ์์ ์์ต๋๋ค.
https://www.inflearn.com/course/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%85%EB%AC%B8-%ED%8C%8C%EC%9D%B4%EC%8D%AC/dashboard
์ง๋ ์๊ฐ์ ๋ฐฐ์ด queue๋ FIFO(First-in-First-out)๊ตฌ์กฐ์๋ค.

์ฆ, ์์ ๊ฐ์ queue๊ฐ ์์ ๋, popleft()๋ฅผ ํ๋ฉด, 5->3->9->...->6 ์์ผ๋ก ์์๋ค์ด ๋์จ๋ค.
ํ์ง๋ง, priority queue๋ ๋ค์ด์จ ์์์ ์๊ด์์ด, ์ผ์ ํ ๊ธฐ์ค(์ฐ์ ์์)์ ๋ฐ๋ผ ์์๋ค์ด ๋์ค๊ฒ ๋ง๋ค ์ ์๋ค.
queue.remove(min(queue))๋ก ์์ ์์๋๋ก ์์๋ค์ ์ถ๋ ฅํ๋ค๊ณ ํด๋ณด์. min()์ผ๋ก ๊ฐ์ฅ ์์ ์์๋ฅผ ์ฐพ๋๋ฐ O(N)์ด ๊ฑธ๋ฆฌ๊ณ , remove()์์ ์์๋ฅผ ์ถ๋ ฅํ ๋ค์์, ์ํํธ๋ฅผ ํด์ค์ผ๋์ O(N)์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ด O(2N)=O(N)์ ์๊ฐ๋ณต์ก๋๊ฐ ๊ฑธ๋ฆฐ๋ค.
queue = sorted(deque([5, 3, 9, 4, 1, 2, 6])) ๋ก ํ์ด์ฌ์ sorted() ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ํต์ํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ O(NlogN)๊ฐ ๊ฑธ๋ฆฐ๋ค.
๐๊ทธ๋ฌ๋, ์๋ก์ด ์์๋ค์ ์ถ๊ฐํ ๋๋ง๋ค ์ ๋ ฌ์ ์ผ์ผ์ด ํด์ค์ผ ํ๋ค๋ ๋จ์ ์กด์ฌ
๐ค๊ทธ๋ ๋ค๋ฉด, ์์๋ฅผ ์ถ๊ฐํ ๋๋ง๋ค, ์ค๋ฆ์ฐจ์์ผ๋ก ์์์ ์ ๋ ฌํด์ฃผ๋ ์๋ฃ๊ตฌ์กฐ๊ฐ ์์ผ๋ฉด ํธ๋ฆฌํ์ง ์์๊น? ๊ทธ.๋.์ heap์ด๋ผ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ํตํด ์ฐ๋ฆฌ๋ priority queue๋ฅผ ๊ตฌํํ ์ ์๋ค.
enqueue(): ๋์ด๋งํผ ์ค์์ ํด์ค์ผ ํ๋ฏ๋ก O(logN)
dequeue(): ๋ฃจํธ ๋
ธ๋๋ฅผ ๋นผ๊ณ , ๋ง์ง๋ง ๋
ธ๋๋ฅผ ๋ฃจํธ๋ก ์ฎ๊ธฐ๊ณ ๋์ด๋งํผ ์ค์ํด์ผํ๋ฏ๋ก O(logN)
๐Complete binary tree: ๋ง์ง๋ง ๋ ๋ฒจ์ ์ ์ธํ๊ณ ๋ชจ๋ ๋
ธ๋๊ฐ ์ฑ์์ ธ ์์ด์ผ ํ๋ฉฐ, ๋ฆฌํ ๋
ธ๋๋ ์ผ์ชฝ๋ถํฐ ์ฑ์์ง ๋ ํ๋์ ๋
ธ๋๋ง ๊ฐ์ง ์ ์์
์์ ๋ ธ๋๊ฐ ์ผ์ชฝ๋ถํฐ ์ฑ์์ ธ์ผ ํ๋ ์ด์ ๋ ์๋์ ํธ๋ฆฌ๋ฅผ ๋ฐฐ์ด๋ก ๋ํ๋์ ๋, ์ค๊ฐ์ ๋น ์์๊ฐ ์๊ธฐ์ง ์๊ธฐ ์ํด์๋ค.
์ ์ฒด ๋ฆฌํ ๋ ธ๋๊ฐ ๊ฐ์ ๋์ด๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.
๐Full binary tree: Complete binary tree์ ๋ฌ๋ฆฌ ์ ์ ํ ์๋ฃ๊ตฌ์กฐ๋ก ์ฐ์ด์ง ๋ชปํ๋ฉฐ, ๋ชจ๋ ๋ ธ๋๊ฐ ๋ฆฌํ ๋ ธ๋๋ฅผ ์ ์ธํ๊ณ 0 ๋๋ 2๊ฐ์ ์์ ๋ ธ๋๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.
์ดํด๋ฅผ ๋๊ธฐ ์ํด, ๊ฐ ์์๋ค์ ๋ณด๋ฉด์ Complete์ธ์ง, Full์ธ์ง ๋ถ๋ณํด๋ณด์.

1. C์ ๋
ธ๋๊ฐ ์ผ์ชฝ๋ถํฐ ์ฑ์์ง์ง ์์์ผ๋ฏ๋ก Complete์ ์๋
2. C์ ์์ ๋
ธ๋๊ฐ 1๊ฐ๋ง ๊ฐ์ก์ผ๋ฏ๋ก, Full๋ ์๋
-> ๋ฐ๋ผ์ Complete๋ Full๋ ์๋๋ค.

1. B์ ์์ ๋
ธ๋๊ฐ ์ผ์ชฝ๋ถํฐ ์ฑ์์ง์ง ์์์ผ๋ฏ๋ก Complete์ ์๋
2. ๋ชจ๋ ๋
ธ๋๊ฐ 0 ๋๋ 2์ ์์ ๋
ธ๋๋ค์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก Full์ ๋ง์
-> Full์ด์ง๋ง, Complete์ ์๋ ์ด์ง ํธ๋ฆฌ

1. ๋ชจ๋ ๋
ธ๋๊ฐ ์ผ์ชฝ๋ถํฐ ์ฑ์์ก๊ธฐ ๋๋ฌธ์ Complete์ด ๋ง์
2. B์ ์์ ๋
ธ๋๊ฐ 1๊ฐ๋ง ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก Full์ ์๋
-> Complete์ด์ง๋ง, Full์ ์๋ ์ด์ง ํธ๋ฆฌ

1. ๋ชจ๋ ๋
ธ๋๊ฐ ์ผ์ชฝ๋ถํฐ ์ฑ์์ ธ ์์ผ๋ฏ๋ก Complete๊ฐ ๋ง์
2. ๋ชจ๋ ๋
ธ๋๊ฐ 0 ๋๋ 2์ ์์ ๋
ธ๋๋ค์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก Full๋ ๋ง์
-> Complete์ด๋ฉด์ Full์ธ ์ด์ง ํธ๋ฆฌ
๐คฉheap ์๋ฃ๊ตฌ์กฐ๋ ๊ตณ์ด binary tree๋ก ๊ตฌํํ์ง ์๊ณ (๋ ธ๋ ์์ฑํ๊ณ ํฌ์ธํฐ๋ฅผ leftChild, rightChild ๋ ธ๋๋ก ์ฐ๊ฒฐํ๋ค๋ ์ง), ์ธ๋ฑ์ค๋ง ์๋ฉด ๋ฆฌ์คํธ๋ก ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค!
์ฆ, ๋ฆฌ์คํธ์ ๋ถ๋ชจ๋ ธ๋๊ฐ i index๋ผ๊ณ ํ๋ฉด, ์ผ์ชฝ ์์๋ ธ๋๋ 2i+1 index์, ์ค๋ฅธ์ชฝ ์์๋ ธ๋๋ 2i+2 index์ ์์นํ๋ค.


๐ข๋จ, min heap, max heap ๋๋ค ํ์ ๋ ธ๋ ๊ฐ์๋ ๋์ ๊ด๊ณ๊ฐ ์ ํด์ง์ง ์๋๋ค.


์์ ๋
ธ๋๋ค ์ค์์ ๊ฐ์ฅ ์์ ๊ฐ์ ๋ฃจํธ ๋
ธ๋์ ๋น๊ต ํ, ์์ ๋
ธ๋์ ์ฐ์ ์์๊ฐ ๋์ผ๋ฉด ์ค์์ ํจ

๊ทธ ๋ค์ ์ฌ๊ท์ ์ผ๋ก ๋ถ๋ชจ ๋ ธ๋์ ๋น๊ต๋ฅผ ์ํ
โฐ์๊ฐ๋ณต์ก๋: H=O(logN)๋งํผ Sift down์ ์ํ
๐Complete binary tree์ ๋์ด๊ฐ ํญ์ logN์ธ ์ด์ ๋, ๋
ธ๋์ ์ด ๊ฐ์๋ฅผ S๋ผ๊ณ ํ ๋:
์์ ์์์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
import heapq
min_heap = [5, 3, 9, 4, 1, 2, 6]
heapq.heapify(min_heap) # [1, 3, 2, 4, 5, 9, 6]
heapq.heappop(min_heap)
print("--- After heappop --- ")
print(min_heap) # [2, 3, 6, 4, 5, 9]
๋จผ์ ๋ง์ง๋ง ์ธ๋ฑ์ค์ ๋
ธ๋๋ฅผ ์ถ๊ฐํ๋ค.

๋ง์ฐฌ๊ฐ์ง๋ก, ๋ถ๋ชจ ๋
ธ๋์ ์ฐ์ ์์๋ฅผ ๋น๊ตํ๋ค.

์ฌ๊ท์ ์ผ๋ก ๋ถ๋ชจ ๋
ธ๋์ ์ฐ์ ์์๋ฅผ ๋น๊ต

โฐ์๊ฐ๋ณต์ก๋: H=O(logN)๋งํผ Sift up์ ์ํ
heapq.heappush(min_heap, 1)
print("--- After heappush --- ")
print(min_heap) # [1, 3, 2, 4, 5, 9, 6]
๐ง์ฐธ๊ณ ๋ก, heapify()์ ์๊ฐ๋ณต์ก๋๋ O(N)์ด๋ค. (๊ทธ๋ฅ ์์๋๊ธฐ๋ง ํ์.)
import heapq
min_heap = [9, 4, 6, 3, 1, 2, 5]
heapq.heapify(min_heap) # ์ต์ ํ์ผ๋ก ๋ณํ
print("Before heappush:", min_heap) # [1, 3, 2, 4, 9, 6, 5]
heapq.heappush(min_heap, 5)
print("After heappush:", min_heap) # [1, 3, 2, 4, 9, 6, 5, 5]
๐ขheapify()์ heappop()์ ๋ชจ๋ min heap์ ์ํ ํจ์์ด๊ธฐ ๋๋ฌธ์, ์ฐ๋ฆฌ๋ ์ฝ๊ฐ์ ํธ๋ฆญ์ ์ด์ฉํด์ max heap์ ๊ตฌํํ๋ ค๊ณ ํ๋ค.
๋ฆฌ์คํธ์ ์์์ ๊ฐ๊ฐ -1์ ๊ณฑํ ํ, heapify()๋ฅผ ์คํํ๋ค. ๊ทธ๋ฌ๋ฉด ์ผ๋จ min heap์ฒ๋ผ ์ ๋ ฌ์ด ๋๋ค.

heappop()์ ์คํํ๋ฉด, ๊ฐ์ฅ ์์ ๊ฐ์ธ ๋ฃจํธ ๋
ธ๋๋ฅผ ์ถ์ถํ๋๋ฐ, ์ด๋ weight์ -1์ ๊ณฑํ๋ฉด value๊ฐ ๋๋๊น value๋ฅผ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค.

1) List Comprehension์ ์ฌ์ฉํด์ ๊ตฌํํ๋ ๊ฒฝ์ฐ
import heapq
max_heap = [5, 3, 9, 4, 1, 2, 6]
max_heap = [i * -1 for i in max_heap]
heapq.heapify(max_heap) # [9, 4, 6, 3, 1, 2, 5]
weight = heapq.heappop(max_heap)
value = -1 * weight
2) ํํ์ ์ฌ์ฉํด์ ๊ตฌํํ๋ ๊ฒฝ์ฐ
import heapq
max_heap = [5, 3, 9, 4, 1, 2, 6]
max_heap = [(i * -1, i) for i in max_heap]
heapq.heapify(max_heap) # [(-9, 9), (-4, 4), (-6, 6), (-3, 3), (-1, 1), (-2, 2), (-5, 5)
weight, value = heapq.heappop(max_heap) # (-9, 9)
ํํ์ ์์ ์๋ ๊ฐ์ ๊ธฐ์ค์ผ๋ก heapify() ํด์ค๋ค.

๐priority queue๋ฅผ ๋จ๋ ์ผ๋ก ๊ตฌํํ๋ ๋ฌธ์ ๋ ์๊ณ , ์ข ์ข ๋์ค๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉ๋๋ ์ ์์งํ์.
์๋์ ๊ฐ์ด, O1, O2, O3, O4 ์์ผ๋ก request ์์ฒญ์ ํ๋ค๊ณ ํ์ ๋, Http 1.1 ์๋ฒ๋ FCFS ์์ผ๋ก ์๋น์ค๋ฅผ ์ฒ๋ฆฌํ๋ค. ์ด๋, O1์ data volume์ด ์๋นํ ํฌ๊ธฐ ๋๋ฌธ์, ์ดํ์๋ ์๋น์ค ์ฒ๋ฆฌ๊ฐ ์๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. (๋ฏธ๋์ด ํ์ผ ๋๋ฌธ์ htmlํ์ผ ๋ฐ ์ด๋ฏธ์ง ํ์ผ์ด ๋ ๋๋ง์ด ์๋๋ค๊ฑฐ๋)

๐ก์ด์ ๋ค๋ฅด๊ฒ, HTTP/2 ๋ฐฉ์์ FCFS๋ฅผ ๋ฐ๋ฅด์ง ์๊ณ , based-HTML ํ์ผ์ ์ฐธ๊ณ ํ๋ object๋ฅผ pushํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๋จผ์ ์ฒ๋ฆฌํ๊ณ , ํด๋ผ์ด์ธํธ๊ฐ ๋ช ์ํ object ์ฐ์ ์์์ ๋ฐ๋ผ object๋ค์ ์๋ฒํํ ์์ฒญํ๋ค.
์๋ฅผ ๋ค๋ฉด, tier-service์ ๋ฐ๋ฅธ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ์ ๋, ํ๋ฆฌ๋ฏธ์ ์๊ธ์ ๋ฅผ ์ง๋ถํ๋ฉด bandwidth๋ฅผ ๋ค๋ฅธ ์ด์ฉ์๋ค๋ณด๋ค ๋๊ฒ ์ค์ ๋คํธ์ํฌ ์ด์ฉ ์์๋ฅผ ์๋น๊ธฐ๊ฒ ํ๊ฑฐ๋, policing์ ์ ์ฉํด์ ํน์ ํธ๋ํฝ์ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํ๋ ๋ฑ์ ์์๊ฐ ์๋ค.
๐Complete binary tree vs Full binary tree: https://www.geeksforgeeks.org/difference-between-full-and-complete-binary-tree/