ํž™(priority queue)

Icarus<Wing>ยท2024๋…„ 9์›” 3์ผ

๐Ÿ“ข๋ณธ ํฌ์ŠคํŠธ์˜ ์ €์ž‘๊ถŒ์€ ์ธํ”„๋Ÿฐ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ [ 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

ํž™ (Heap - priority queue)

์ง€๋‚œ ์‹œ๊ฐ„์— ๋ฐฐ์šด queue๋Š” FIFO(First-in-First-out)๊ตฌ์กฐ์˜€๋‹ค.

์ฆ‰, ์œ„์™€ ๊ฐ™์€ queue๊ฐ€ ์žˆ์„ ๋•Œ, popleft()๋ฅผ ํ•˜๋ฉด, 5->3->9->...->6 ์ˆœ์œผ๋กœ ์š”์†Œ๋“ค์ด ๋‚˜์˜จ๋‹ค.

ํ•˜์ง€๋งŒ, priority queue๋Š” ๋“ค์–ด์˜จ ์ˆœ์„œ์— ์ƒ๊ด€์—†์ด, ์ผ์ •ํ•œ ๊ธฐ์ค€(์šฐ์„  ์ˆœ์œ„)์— ๋”ฐ๋ผ ์š”์†Œ๋“ค์ด ๋‚˜์˜ค๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๊ตฌํ˜„ 1. ๋ฆฌ์ŠคํŠธ๋กœ priority queue ๊ตฌํ˜„

queue.remove(min(queue))๋กœ ์ž‘์€ ์ˆœ์„œ๋Œ€๋กœ ์›์†Œ๋“ค์„ ์ถœ๋ ฅํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž. min()์œผ๋กœ ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ๋ฅผ ์ฐพ๋Š”๋ฐ O(N)์ด ๊ฑธ๋ฆฌ๊ณ , remove()์—์„œ ์›์†Œ๋ฅผ ์ถœ๋ ฅํ•œ ๋‹ค์Œ์—, ์‹œํ”„ํŠธ๋ฅผ ํ•ด์ค˜์•ผ๋˜์„œ O(N)์ด ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ด O(2N)=O(N)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค.

๊ตฌํ˜„ 2. sorted() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„

queue = sorted(deque([5, 3, 9, 4, 1, 2, 6])) ๋กœ ํŒŒ์ด์ฌ์˜ sorted() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ€ต์†ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(NlogN)๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค.
๐Ÿ™๊ทธ๋Ÿฌ๋‚˜, ์ƒˆ๋กœ์šด ์›์†Œ๋“ค์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ์ •๋ ฌ์„ ์ผ์ผ์ด ํ•ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ๋‹จ์  ์กด์žฌ

๐Ÿค”๊ทธ๋ ‡๋‹ค๋ฉด, ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค, ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์•Œ์•„์„œ ์ •๋ ฌํ•ด์ฃผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ์žˆ์œผ๋ฉด ํŽธ๋ฆฌํ•˜์ง€ ์•Š์„๊นŒ? ๊ทธ.๋ž˜.์„œ heap์ด๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” priority queue๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ตฌํ˜„ 3. heap(Complete binary tree๋กœ ๊ตฌํ˜„๋œ ์ž๋ฃŒ๊ตฌ์กฐ)

enqueue(): ๋†’์ด๋งŒํผ ์Šค์™‘์„ ํ•ด์ค˜์•ผ ํ•˜๋ฏ€๋กœ O(logN)
dequeue(): ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๋นผ๊ณ , ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋กœ ์˜ฎ๊ธฐ๊ณ  ๋†’์ด๋งŒํผ ์Šค์™‘ํ•ด์•ผํ•˜๋ฏ€๋กœ O(logN)
๐Ÿ”–Complete binary tree: ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์„ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์ฑ„์›Œ์ ธ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ๋ฆฌํ”„ ๋…ธ๋“œ๋Š” ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฑ„์›Œ์งˆ ๋•Œ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ

  • ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฑ„์›Œ์ ธ์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ์•„๋ž˜์˜ ํŠธ๋ฆฌ๋ฅผ ๋ฐฐ์—ด๋กœ ๋‚˜ํƒ€๋ƒˆ์„ ๋•Œ, ์ค‘๊ฐ„์— ๋นˆ ์›์†Œ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ๋‹ค.

  • ์ „์ฒด ๋ฆฌํ”„ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ๋†’์ด๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.

๐Ÿ”–Full binary tree: Complete binary tree์™€ ๋‹ฌ๋ฆฌ ์ ์ ˆํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ์“ฐ์ด์ง€ ๋ชปํ•˜๋ฉฐ, ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋ฆฌํ”„ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•˜๊ณ  0 ๋˜๋Š” 2๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.

  • ๋ฆฌํ”„ ๋…ธ๋“œ๋Š” ๊ฐ™์€ ๋†’์ด๋ฅผ ๊ฐ€์งˆ ํ•„์š” ์—†์Œ

์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด, ๊ฐ ์˜ˆ์‹œ๋“ค์„ ๋ณด๋ฉด์„œ Complete์ธ์ง€, Full์ธ์ง€ ๋ถ„๋ณ„ํ•ด๋ณด์ž.

์˜ˆ์‹œ1


1. C์˜ ๋…ธ๋“œ๊ฐ€ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฑ„์›Œ์ง€์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ Complete์€ ์•„๋‹˜
2. C์˜ ์ž์‹ ๋…ธ๋“œ๊ฐ€ 1๊ฐœ๋งŒ ๊ฐ€์กŒ์œผ๋ฏ€๋กœ, Full๋„ ์•„๋‹˜
-> ๋”ฐ๋ผ์„œ Complete๋„ Full๋„ ์•„๋‹ˆ๋‹ค.

์˜ˆ์‹œ2


1. B์˜ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฑ„์›Œ์ง€์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ Complete์€ ์•„๋‹˜
2. ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ 0 ๋˜๋Š” 2์˜ ์ž์‹ ๋…ธ๋“œ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ Full์€ ๋งž์Œ
-> Full์ด์ง€๋งŒ, Complete์€ ์•„๋‹Œ ์ด์ง„ ํŠธ๋ฆฌ

์˜ˆ์‹œ3


1. ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฑ„์›Œ์กŒ๊ธฐ ๋•Œ๋ฌธ์— Complete์ด ๋งž์Œ
2. B์˜ ์ž์‹ ๋…ธ๋“œ๊ฐ€ 1๊ฐœ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ Full์€ ์•„๋‹˜
-> Complete์ด์ง€๋งŒ, Full์€ ์•„๋‹Œ ์ด์ง„ ํŠธ๋ฆฌ

์˜ˆ์‹œ4


1. ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฑ„์›Œ์ ธ ์žˆ์œผ๋ฏ€๋กœ Complete๊ฐ€ ๋งž์Œ
2. ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ 0 ๋˜๋Š” 2์˜ ์ž์‹ ๋…ธ๋“œ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ Full๋„ ๋งž์Œ
-> Complete์ด๋ฉด์„œ Full์ธ ์ด์ง„ ํŠธ๋ฆฌ

๐Ÿคฉheap ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๊ตณ์ด binary tree๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ (๋…ธ๋“œ ์ƒ์„ฑํ•˜๊ณ  ํฌ์ธํ„ฐ๋ฅผ leftChild, rightChild ๋…ธ๋“œ๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค๋“ ์ง€), ์ธ๋ฑ์Šค๋งŒ ์•Œ๋ฉด ๋ฆฌ์ŠคํŠธ๋กœ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค!

์ฆ‰, ๋ฆฌ์ŠคํŠธ์˜ ๋ถ€๋ชจ๋…ธ๋“œ๊ฐ€ i index๋ผ๊ณ  ํ•˜๋ฉด, ์™ผ์ชฝ ์ž์‹๋…ธ๋“œ๋Š” 2i+1 index์—, ์˜ค๋ฅธ์ชฝ ์ž์‹๋…ธ๋“œ๋Š” 2i+2 index์— ์œ„์น˜ํ•œ๋‹ค.

  • ์ด๋Ÿฌํ•œ ๊ณต์‹์ด ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š”, heap ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ Complete binary tree๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ
  • ๋ฐ˜๋Œ€๋กœ, ๋ถ€๋ชจ๋…ธ๋“œ์˜ index๋ฅผ ์•Œ๊ณ  ์‹ถ์œผ๋ฉด, ์ž์‹๋…ธ๋“œ index์—์„œ (i-1)/2๋ฅผ ํ•˜๋ฉด ๋œ๋‹ค.

min heap vs max heap

  1. min heap: ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๊ฐ’์ด ์ž์‹ ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ์ž‘์€ ํŠธ๋ฆฌ ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ
  • value๊ฐ€ ์ž‘์„์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์Œ
  1. max heap: ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๊ฐ’์ด ์ž์‹ ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ํฐ ํŠธ๋ฆฌ ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ
  • value๊ฐ€ ํด์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์Œ

๐Ÿ“ข๋‹จ, min heap, max heap ๋‘˜๋‹ค ํ˜•์ œ ๋…ธ๋“œ ๊ฐ„์—๋Š” ๋Œ€์†Œ ๊ด€๊ณ„๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š๋Š”๋‹ค.

heappop(min_heap) ๊ณผ์ •

  1. ๋จผ์ €, heapify๋œ heap ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ถ”์ถœํ•œ๋‹ค.
    ๐Ÿ”–heapify: ๋ฐฐ์—ด(๋˜๋Š” ๋ฆฌ์ŠคํŠธ)๋ฅผ heap ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•˜๋Š”๋ฐ, ์ด๋•Œ ๊ธฐ๋ณธ๊ฐ’์€ ๋ฐฐ์—ด์— ์žˆ๋Š” element๋“ค์ด min heap์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ์ด ๋œ๋‹ค.
  1. ๊ทธ ๋‹ค์Œ, ์•„๋ฌป๋”ฐ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋กœ ๋„ฃ์–ด์ค€๋‹ค.
  • Complete binary tree๋Š” ๋ฌด์กฐ๊ฑด ์™ผ์ชฝ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ฑ„์›Œ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์„ค๋ น ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ 1๊ฐœ๋งŒ ์žˆ๋Š”๋ฐ ๊ทธ๊ฒƒ์„ ์ถ”์ถœํ•ด๋„(์•„๋ž˜ ๊ทธ๋ฆผ์˜ 9๋ฒˆ ๋…ธ๋“œ) Complete binary tree์˜ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•œ๋‹ค.
  1. ์ž์‹ ๋…ธ๋“œ๋“ค ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๋ฃจํŠธ ๋…ธ๋“œ์™€ ๋น„๊ต ํ›„, ์ž์‹ ๋…ธ๋“œ์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์œผ๋ฉด ์Šค์™‘์„ ํ•จ

  2. ๊ทธ ๋‹ค์Œ ์žฌ๊ท€์ ์œผ๋กœ ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰

โฐ์‹œ๊ฐ„๋ณต์žก๋„: H=O(logN)๋งŒํผ Sift down์„ ์ˆ˜ํ–‰
๐Ÿ”ŽComplete binary tree์˜ ๋†’์ด๊ฐ€ ํ•ญ์ƒ logN์ธ ์ด์œ ๋Š”, ๋…ธ๋“œ์˜ ์ด ๊ฐœ์ˆ˜๋ฅผ S๋ผ๊ณ  ํ•  ๋•Œ:

S=20+21+22+23+...+2H=1(2H+1โˆ’1)2โˆ’1=2H+1โˆ’1S = 2^{0} + 2^{1} + 2^{2} + 2^{3} + ... + 2^{H} = \frac{1(2^{H+1} - 1)}{2-1} = 2^{H+1}-1
H+1=log2(1+S)=log2(1+S)โˆ’1โ‰ˆlogNH+1 = log_{2}(1+S) = log_2(1+S) - 1 \approx logN

์œ„์˜ ์ˆ˜์‹์— ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๐Ÿ’ป์ฝ”๋“œ ๊ตฌํ˜„

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]

heappush(min_heap, val) ๊ณผ์ •

  1. ๋จผ์ € ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

  2. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋น„๊ตํ•œ๋‹ค.

  3. ์žฌ๊ท€์ ์œผ๋กœ ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋น„๊ต

โฐ์‹œ๊ฐ„๋ณต์žก๋„: 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)์ด๋‹ค. (๊ทธ๋ƒฅ ์•Œ์•„๋‘๊ธฐ๋งŒ ํ•˜์ž.)

  • ๋˜ํ•œ, min heap์€ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ๊ฐ™์€ ๊ฐ’์˜ ์›์†Œ๋“ค์ด ์ถ”๊ฐ€๋œ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋Š” stableํ•œ ํŠน์ง•์ด ์žˆ๋‹ค.
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(), heappush() ํ•จ์ˆ˜๋Š” ๋ชจ๋‘ Min Heap(์ตœ์†Œ ํž™)์„ ๊ธฐ์ค€์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
    ->๊ทธ๋ž˜์„œ, max heap์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•ฝ๊ฐ„์˜ ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.

max heap์˜ ๊ณผ์ •

๐Ÿ“ขheapify()์™€ heappop()์€ ๋ชจ๋‘ min heap์„ ์œ„ํ•œ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ๋ฆฌ๋Š” ์•ฝ๊ฐ„์˜ ํŠธ๋ฆญ์„ ์ด์šฉํ•ด์„œ max heap์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

  1. ๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ์— ๊ฐ๊ฐ -1์„ ๊ณฑํ•œ ํ›„, heapify()๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ผ๋‹จ min heap์ฒ˜๋Ÿผ ์ •๋ ฌ์ด ๋œ๋‹ค.

  2. 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๋ฅผ ๋‹จ๋…์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์ œ๋Š” ์—†๊ณ , ์ข…์ข… ๋‚˜์˜ค๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ํ™œ์šฉ๋˜๋‹ˆ ์ž˜ ์ˆ™์ง€ํ•˜์ž.

๐Ÿง์šฐ์„ ์ˆœ์œ„ ํ๊ฐ€ ์ ์šฉ๋œ ์†Œํ”„ํŠธ์›จ์–ด

1. ๋„คํŠธ์›Œํฌ์˜ HOL(Head-Of-Line) blocking

์•„๋ž˜์™€ ๊ฐ™์ด, O1, O2, O3, O4 ์ˆœ์œผ๋กœ request ์š”์ฒญ์„ ํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, Http 1.1 ์„œ๋ฒ„๋Š” FCFS ์ˆœ์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด๋•Œ, O1์˜ data volume์ด ์ƒ๋‹นํžˆ ํฌ๊ธฐ ๋•Œ๋ฌธ์—, ์ดํ›„์—๋Š” ์„œ๋น„์Šค ์ฒ˜๋ฆฌ๊ฐ€ ์•ˆ๋˜์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. (๋ฏธ๋””์–ด ํŒŒ์ผ ๋•Œ๋ฌธ์— htmlํŒŒ์ผ ๋ฐ ์ด๋ฏธ์ง€ ํŒŒ์ผ์ด ๋ Œ๋”๋ง์ด ์•ˆ๋œ๋‹ค๊ฑฐ๋‚˜)

๐Ÿ’ก์ด์™€ ๋‹ค๋ฅด๊ฒŒ, HTTP/2 ๋ฐฉ์‹์€ FCFS๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š๊ณ , based-HTML ํŒŒ์ผ์„ ์ฐธ๊ณ ํ•˜๋Š” object๋ฅผ pushํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋จผ์ € ์ฒ˜๋ฆฌํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ช…์‹œํ•œ object ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ object๋“ค์„ ์„œ๋ฒ„ํ•œํ…Œ ์š”์ฒญํ•œ๋‹ค.

2. ๋„คํŠธ์›Œํฌ์˜ QOS(Quality-Of-Service)

์˜ˆ๋ฅผ ๋“ค๋ฉด, tier-service์— ๋”ฐ๋ฅธ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ํ”„๋ฆฌ๋ฏธ์—„ ์š”๊ธˆ์ œ๋ฅผ ์ง€๋ถˆํ•˜๋ฉด bandwidth๋ฅผ ๋‹ค๋ฅธ ์ด์šฉ์ž๋“ค๋ณด๋‹ค ๋†’๊ฒŒ ์ค˜์„œ ๋„คํŠธ์›Œํฌ ์ด์šฉ ์ˆœ์„œ๋ฅผ ์•ž๋‹น๊ธฐ๊ฒŒ ํ•˜๊ฑฐ๋‚˜, policing์„ ์ ์šฉํ•ด์„œ ํŠน์ • ํŠธ๋ž˜ํ”ฝ์— ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๋“ฑ์˜ ์˜ˆ์‹œ๊ฐ€ ์žˆ๋‹ค.


๐Ÿ“š์ฐธ๊ณ  ์ž๋ฃŒ

๐Ÿ”—Complete binary tree vs Full binary tree: https://www.geeksforgeeks.org/difference-between-full-and-complete-binary-tree/

profile
๋ชจ๋“  ์ฝ”๋“œ์—๋Š” ์ด์œ ๊ฐ€ ์žˆ๊ธฐ์— ์›์ธ์„ ํŒŒ์•…ํ•  ๋•Œ๊นŒ์ง€ ์ง‘์š”ํ•˜๊ฒŒ ํƒ๊ตฌํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€