๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป Computer Science/์ž๋ฃŒ๊ตฌ์กฐ

[์ž๋ฃŒ๊ตฌ์กฐ] ํ Queue & ์Šคํƒ Stack & ์šฐ์„ ์ˆœ์œ„ํ priority queue & ํž™ Heap ์ด๋ž€?

by Jay Din 2023. 5. 25.
728x90
๋ฐ˜์‘ํ˜•

Queue ํ ๋ž€?

queue๋Š” ์„ ์ž…์„ ์ถœ FIFO(First In Frist Out)์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค ์‹œ๊ฐ„๋ณต์žก๋„๋Š” enqueue O(1), dequeue O(1) ์ž…๋‹ˆ๋‹ค.

ํ™œ์šฉ ์˜ˆ์‹œ Cache ๊ตฌํ˜„, ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ, ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰(BFS) ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

FIFO (First In First Out) ์ด๋ž€?

queue๋Š” ์‹œ๊ฐ„ ์ˆœ์„œ์ƒ ๋จผ์ € ์ง‘์–ด ๋„ฃ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜์˜ค๋Š” ์„ ์ž…์„ ์ถœ FIFO(First In First Out) ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

enqueue & dequeue

queue์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ enqueue๋ผ๊ณ  ํ•œ๋‹ค.

queue์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์„ dequeue๋ผ๊ณ  ํ•œ๋‹ค.

enqueue์˜ ๊ฒฝ์šฐ queue์˜ ๋งจ๋’ค์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์™„๋ฃŒ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(1)์ด๋‹ค. 

dequeue์˜ ๊ฒฝ์šฐ ๋งจ ์•ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ์™„๋ฃŒ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•˜๊ฒŒ O(1)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.

๊ตฌํ˜„ ๋ฐฉ์‹

  • Array-Based queue: enqueue์™€ dequeue ๊ณผ์ •์—์„œ ๋‚จ๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ƒ๊ธด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋‚ญ๋น„๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ฃผ๋กœ Circular queueํ˜•์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.
  • List-Based: ์žฌํ• ๋‹น์ด๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„์˜ ๊ฑฑ์ •์„ ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค.

์›ํ˜•ํ (circular queue)

queue์˜ ๊ฐœ๋…์—์„œ ์กฐ๊ธˆ ํ™•์žฅํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋“ค๋กœ๋Š” ์–‘์ชฝ์—์„œ enqueue์™€ dequeue๊ฐ€ ๊ฐ€๋Šฅํ•œ deque(double-ended queue)์™€ ์‹œ๊ฐ„ ์ˆœ์„œ๊ฐ€ ์•„๋‹Œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์ˆœ์„œ๋กœ dequeueํ•  ์ˆ˜ ์žˆ๋Š” priority queue๊ฐ€ ์žˆ๋‹ค.

ํ™œ์šฉ ์˜ˆ์‹œ๋กœ๋Š” ํ•˜๋‚˜์˜ ์ž์›์„ ๊ณต์œ ํ•˜๋Š” ํ”„๋ฆฐํ„ฐ๋‚˜, CPU task scheduling, Cache ๊ตฌํ˜„, ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰(BFS) ๋“ฑ์ด ์žˆ๋‹ค.

 

Array-Base์™€ List-Base ์ฐจ์ด

Array-Base queue๋Š” circular queue๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.
์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ๋˜ํ•œ, enqueue๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ•˜๋ฉด fixed size๋ฅผ ๋„˜์–ด์„œ๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, dynamic array์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ Array์˜ size๋ฅผ ํ™•์žฅ์‹œ์ผœ์•ผ ํ•œ๋‹ค.
๊ทธ๋Ÿผ์—๋„ enqueue์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” (amortized) O(1)๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
List-Base singly-lilnked list๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.
enqueue๋Š” ๋‹จ์ˆœํžˆ singly-lilnked์—์„œ append๋ฅผ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌํ˜„๋˜๊ณ , ์ด ๋•Œ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(1)์ด๋‹ค.
dequeue๋Š” ๋งจ ์•ž์˜ ์›์†Œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  first head๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—์ด ์—ฐ์‚ฐ๋„ O(1)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค. 

์š”์•ฝํ•˜์ž๋ฉด, ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ queue๋ฅผ ๊ตฌํ˜„์„ ํ•˜๋”๋ผ๋„ enqueue์™€ dequeue๋Š” ๋ชจ๋‘ O(1)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.

Array-Base์˜ ๊ฒฝ์šฐ ์ „๋ฐ˜์ ์œผ๋กœ performance๊ฐ€ ๋” ์ข‹์ง€๋งŒ, worst case์˜ ๊ฒฝ์šฐ์—๋Š” ํ›จ์”ฌ ๋” ๋Š๋ฆด ์ˆ˜ ์žˆ๋‹ค(resize).

List-Base์˜ ๊ฒฝ์šฐ์—๋Š” enqueue๋ฅผ ํ•  ๋•Œ๋งˆ๋‹ค memory allocation์„ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „๋ฐ˜์ ์ธ runtime์ด ๋Š๋ฆด ์ˆ˜ ์žˆ๋‹ค.

 

๋ฐ˜์‘ํ˜•

Stack ์Šคํƒ ์ด๋ž€?

 stack์€ ํ›„์ž…์„ ์ถœ LIFO(Last In First Out)์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„๋Š” push O(1), pop O(1) ์ด๋‹ค.

ํ™œ์šฉ ์˜ˆ์‹œ๋Š” ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ• ์—ฐ์‚ฐ, ๊ด„ํ˜ธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ์›น ๋ธŒ๋ผ์šฐ์ € ๋ฐฉ๋ฌธ๊ธฐ๋ก(๋’ค๋กœ ๊ฐ€๊ธฐ), ๊นŠ์ด์šฐ์„ ํƒ์ƒ‰(DFS) ๋“ฑ์ด ์žˆ๋‹ค.

LIFO (Last In First Out)

stack์€ ์‹œ๊ฐ„ ์ˆœ์„œ์ƒ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ถ”๊ฐ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜ค๋Š” ํ›„์ž…์„ ์ถœ LIFO (Last In First Out) ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

push & pop

stack์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ push๋ผ๊ณ  ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์€ pop์ด๋ผ๊ณ  ํ•œ๋‹ค.

push์˜ ๊ฒฝ์šฐ stack์˜ ๋งจ ๋’ค์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์™„๋ฃŒ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(1)์ด๋‹ค.

์ด์™€ ๋™์ผํ•˜๊ฒŒ pop์˜ ๊ฒฝ์šฐ๋„ ๋งจ ๋’ค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ์™„๋ฃŒ๋˜๊ธฐ ๋•Œ๋ฌธ์— O(1)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.

push์™€ pop์€ ๋ชจ๋‘ stack์˜ top์— ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ํ˜•์‹์œผ๋กœ ํ˜•์„ฑ๋œ๋‹ค. 

 

Stack ๋‘ ๊ฐœ๋ฅผ ์ด์šฉํ•˜์—ฌ Queue ๊ตฌํ˜„

queue์˜ enqueue()๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์ฒซ ๋ฒˆ์งธ stack์„ ์‚ฌ์šฉํ•˜๊ณ ,

dequeue()๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋‘ ๋ฒˆ์งธ stack์„ ์‚ฌ์šฉํ•˜๋ฉด queue๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํŽธ์˜์ƒ enqueue()์— ์‚ฌ์šฉํ•  stack์„ instack์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  dequeue()์— ์‚ฌ์šฉํ•  stack์„ outstack์ด๋ผ๊ณ  ์นญํ•˜๊ฒ ๋‹ค.

๋‘ ๊ฐœ์˜ stack์œผ๋กœ queue๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. enqueue() :: instack์— push()๋ฅผ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  2. dequeue() ::
    1. ๋งŒ์•ฝ outstack์ด ๋น„์–ด ์žˆ๋‹ค๋ฉด instack.pop() ์„ ํ•˜๊ณ  outstack.push()๋ฅผํ•˜์—ฌ instack์—์„œ outstack์œผ๋กœ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ฒจ ๋„ฃ๋Š”๋‹ค. ์ด ๊ฒฐ๊ณผ๋กœ ๊ฐ€์žฅ ๋จผ์ € ์™”๋˜ ๋ฐ์ดํ„ฐ๋Š” outstack์˜ top์— ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค.
    2. outstack.pop()์„ ํ•˜๋ฉด ๊ฐ€์žฅ ๋จผ์ € ์™”๋˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์ถ”์ถœ๋œ๋‹ค.(FIFO) 

class Queue(object):
    def __init__(self):
        self.instack=[]
        self.outstack=[]

    def enqueue(self,element):
        self.instack.append(element)

    def dequeue(self):
        if not self.outstack:
            while self.instack:
                self.outstack.append(self.instack.pop())
        return self.outstack.pop()

 

Queue ๋‘ ๊ฐœ๋ฅผ ์ด์šฉํ•˜์—ฌ Stack ๊ตฌํ˜„

queue ๋‘ ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ stack์˜ push์™€ pop์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์— ์ดˆ์ ์„ ๋งž์ถฐ์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด ๋œ๋‹ค.

ํŽธ์˜์ƒ push()์— ์‚ฌ์šฉํ•  queue๋Š” q1์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  pop()์— ์‚ฌ์šฉํ•  queue๋ฅผ q2๋ผ๊ณ  ์นญํ•˜๊ฒ ๋‹ค.

๋‘ ๊ฐœ์˜ queue๋กœ stack์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

  1. push() :: q1์œผ๋กœ enqueue()๋ฅผ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  2. pop() ::
    1. q1์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ 1 ์ดํ•˜๋กœ ๋‚จ์„ ๋•Œ๊นŒ์ง€ dequeue()๋ฅผ ํ•œ ํ›„, ์ถ”์ถœ๋œ ๋ฐ์ดํ„ฐ๋ฅผ q2์— enqueue() ํ•œ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” q2๋กœ ์˜ฎ๊ฒจ์ง„๋‹ค.
    2. q1์— ๋‚จ์•„ ์žˆ๋Š” ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ dequeue()ํ•ด์„œ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค(LIFO)
    3. ๋‹ค์Œ์— ์ง„ํ–‰๋  pop()์„ ์œ„์™€ ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด q1๊ณผ q2์˜ ์ด๋ฆ„์„ swap ํ•œ๋‹ค.

import queue

class Stack(object):
    def __init__(self):
        self.q1 = queue.Queue()
        self.q2 = queue.Queue()

    def push(self, element):
        self.q1.put(element)

    def pop(self):
        while self.q1.qsize() > 1:
            self.q2.put(self.q1.get())

        temp = self.q1
        self.q1 = self.q2
        self.q2 = temp

        return self.q2.get()

์‹œ๊ฐ„๋ณต์žก๋„

push() q1.enqueue()๋ฅผ ํ•œ๋ฒˆ๋งŒ ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—  O(1)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค. 
pop() q1์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” n๊ฐœ์˜ ์›์†Œ ์ค‘์— n-1๊ฐœ๋ฅผ q2๋กœ ์˜ฎ๊ฒจ์•ผํ•˜๋ฏ€๋กœ O(n)์ด ๋œ๋‹ค.  

 

Queue์™€ priority queue ๋น„๊ต ์„ค๋ช…

Queue ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์‹œ๊ฐ„ ์ˆœ์„œ์ƒ ๋จผ์ € ์ง‘์–ด ๋„ฃ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜์˜ค๋Š” ์„ ์ž…์„ ์ถœ FIFO(First In First Out) ๊ตฌ์กฐ๋กœ ์ €์žฅํ•˜๋Š” ํ˜•์‹์ด๋‹ค. ์ด์™€ ๋‹ค๋ฅด๊ฒŒ ์šฐ์„ ์ˆœ์œ„ ํ(priority queue)๋Š” ๋“ค์–ด๊ฐ„ ์ˆœ์„œ์— ์ƒ๊ด€์—†์ด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜์˜จ๋‹ค.

Queue์˜ operation ์‹œ๊ฐ„๋ณต์žก๋„๋Š” enqueue O(1), dequeue O(1)์ด๊ณ ,

Priority queue๋Š” push O(logn), pop(logn)์ด๋‹ค.

์šฐ์„ ์ˆœ์œ„ ํ๋Š” ๊ตฌํ˜„ ๋ฐฉ๋ฒ•๊ณผ operation์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๊ตฌํ˜„ํ•˜๋ผ๋Š” ๊ฒƒ์€ Heap์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

Heap ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์ด์ง„์™„์ „ํŠธ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๊ณ , ๋Œ€ํ‘œ์ ์ธ operation์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” push O(logn), pop O(logn)์ด๋‹ค.

์ด ๋‘๊ฐ€์ง€ ํŠน์ง•์„ ์ค‘์‹ฌ์œผ๋กœ ๊ณต๋ถ€ํ•˜๋ฉด ๋œ๋‹ค. ๋˜ํ•œ tree๊ฐ€ ๊ทธ๋ ค์ ธ ์žˆ๋Š” ์ƒํƒœ์—์„œ ์ตœ๋Œ€ํž™, ์ตœ์†Œํž™์˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ์‹œ์— ์–ด๋–ป๊ฒŒ node๊ฐ€ ์‚ญ์ œ๋˜๊ณ  ์—ฐ๊ฒฐ์ด ๋ณ€๊ฒฝ๋˜๋Š”์ง€์˜ ๊ณผ์ •์„ ๊ทธ๋ ค์„œ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ์ข‹๋‹ค.

Heap

Heap์€ ๊ทธ ์ž์ฒด๋กœ ์šฐ์„ ์ˆœ์œ„ํ (priority queue)์˜ ๊ตฌํ˜„๊ณผ ์ผ์น˜ํ•œ๋‹ค.

Heap์€ ์™„์ „์ด์ง„ํŠธ๋ฆฌ ๊ตฌ์กฐ์ด๋‹ค. Heap์ด ๋˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๊ฐ node์— ์ €์žฅ๋œ ๊ฐ’์€ child node๋“ค์— ์ €์žฅ๋œ ๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.(min heap)
    root node์— ์ €์žฅ๋œ ๊ฐ’์ด ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์ด ๋œ๋‹ค.

๋ฐ˜์‘ํ˜•

 

Heap ๊ตฌํ˜„

ํŠธ๋ฆฌ๋Š” ๋ณดํ†ต Linked list๋กœ ๊ตฌํ˜„ํ•œ๋‹ค. ํ•˜์ง€๋งŒ Heap์€ tree์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  array๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ ์ด์œ ๋Š” ์ƒˆ๋กœ์šด node๋ฅผ ํž™์˜ '๋งˆ์ง€๋ง‰ ์œ„์น˜'์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๋•Œ array๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ์ด ๊ณผ์ •์ด ์ˆ˜์›”ํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ๊ตฌํ˜„์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด array์˜ 0๋ฒˆ ์งธ index๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์™„์ „์ด์ง„ํŠธ๋ฆฌ์˜ ํŠน์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ array์˜ index๋งŒ์œผ๋กœ ๋ถ€๋ชจ ์ž์‹๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•œ๋‹ค.
    • n๋ฒˆ ์งธ node์˜ left child node = 2n
    • n๋ฒˆ ์งธ node์˜ right child node = 2n + 1
    • n๋ฒˆ ์งธ node์˜ parent node = n/2

Heap push - O(logn)

heap tree์˜ ๋†’์ด๋Š” logN์ด๋‹ค.

push()๋ฅผ ํ–ˆ์„ ๋•Œ, swapํ•˜๋Š” ๊ณผ์ •์ด ์ตœ๋Œ€ logN๋ฒˆ ๋ฐ˜๋ณต๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(logn)์ด๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์€ 2๊ฐ€ push() ๋˜๊ณ  min heap ์กฐ๊ฑด์— ๋งž์ถฐ ์žฌ๊ตฌ์„ฑ๋˜๋Š” ๊ณผ์ •์ด๋‹ค.

min heap

Heap pop - O(logn)

pop()์„ ํ–ˆ์„ ๋•Œ, swapํ•˜๋Š” ๊ณผ์ •์ด ์ตœ๋Œ€ logN๋ฒˆ ๋ฐ˜๋ณต๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(logn)์ด๋‹ค

  • ๊ฐ node์— ์ €์žฅ๋œ ๊ฐ’์€ child node๋“ค์— ์ €์žฅ๋œ ๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜  ๊ฐ™๋‹ค.(mix heap)
    root node์— ์ €์žฅ๋œ ๊ฐ’์ด ๊ฐ€์žฅ ํฐ ๊ฐ’์ด ๋œ๋‹ค. 

์•„๋ž˜ ๊ทธ๋ฆผ์€ 2๊ฐ€ pop()๋˜๊ณ  ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊ฐ€ root node์— ์˜ฌ๋ผ์˜ค๊ณ  Min heap ์กฐ๊ฑด์— ๋งž๊ฒŒ ์žฌ๊ตฌ์„ฑํ•œ๋‹ค.

 


์ฐธ๊ณ 

https://lamarr.dev/images/algorithm/queue.jpg

https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS3EliS7H7AdMinqJ17goQtOBS7C27nRjK9cA&usqp=CAU 

https://i.stack.imgur.com/LQJBQ.png

https://leetcode.com/media/original_images/225_stack_using_queues_pushB.png

https://i.imgur.com/1mghTRv.png

https://www.techiedelight.com/wp-content/uploads/2016/11/Pop-min-heap.png

https://www.nossi.dev/

 

728x90
๋ฐ˜์‘ํ˜•