[Data_Structer] Queue & Stack

Queue & Stack


Queue

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

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

๐Ÿ’ก ๊ธฐ์ดˆ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๋ฉด์ ‘์—์„œ ๊ฐ„๋‹จํ•œ ์งˆ๋ฌธ์œผ๋กœ ์ข…์ข… ๋‚˜์˜ค๋Š” ๋ฌธ์ œ. LIFO์ธ stack๊ณผ ๋‹ค๋ฅด๊ฒŒ FIFO์ž๋ฃŒ๊ตฌ์กฐ์ž„์„ ๊ธฐ์–ต ๋˜ํ•œ ํ™œ์šฉ ์˜ˆ์‹œ๋“ค๊ณผ Circular Queue ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ž˜ ์•Œ์•„์•ผํ•œ๋‹ค.

FIFO

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)

Stack

stack์€ ํ›„์ž…์„ ์ถœ LIFO(Last In First Out)์˜ ์ž๋ฃŒ๊ตฌ์กฐ. ์‹œ๊ฐ„๋ณต์žก๋„๋Š” push O(1) , pop O(1)

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

๐Ÿ’ก stack์ด ๊ต‰์žฅํžˆ ์ค‘์š”ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด์ง€๋งŒ, ๋ฉด์ ‘์—์„œ๋Š” stack์„ ๋‹จ๋…์œผ๋กœ ์งˆ๋ฌธํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋งŽ์ด ์—†๋‹ค. ๋”ฐ๋ผ์„œ Queue์˜ FIFO์™€ ๋Œ€์กฐ๋˜๋Š” LIFO๋ผ๋Š” ํŠน์„ฑ๊ณผ, ํ™œ์šฉ์˜ˆ์‹œ ๊ธฐ์–ตํ•˜์ž.

LIFO

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

push & pop

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

ํ™œ์šฉ

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


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

๐Ÿ’ก stack ๋‘ ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ enqueue์™€ dequeue๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์— ์ดˆ์ ์„ ๋งž์ถฐ์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ

์‚ฌ์‹ค ์ด๋Ÿฐ ๋ฌธ์ œ๋Š” ๋‹ต์ด ๋‹ค์–‘ํ•˜๊ณ , ๋‹ต ์ž์ฒด๊ฐ€ ์ค‘์š”ํ•˜๊ธฐ ๋ณด๋‹จ ๋‹ต์„ ์ฐพ์•„๊ฐ€๋Š” ๊ณผ์ •์„ ๋” ์ค‘์š”ํ•˜๊ฒŒ ๋ณด๊ธฐ ๋•Œ๋ฌธ์—, ํ’€์ด๋ฅผ ์™ธ์šฐ๊ธฐ๋ณด๋‹จ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ฃผ์˜๊นŠ๊ฒŒ ์ƒ๊ฐํ•˜์ž

[Answer]

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๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์— ์ดˆ์ ์„ ๋งž์ถฐ์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด ๋œ๋‹ค. ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์™ธ์šฐ๊ธฐ๋ณด๋‹จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋‚˜๊ฐ€๋Š” ๊ณผ์ •์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

[Answer]

ํŽธ์˜์ƒ 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()

โญย Queue vs priority queue๋ฅผ ๋น„๊ต

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

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

Priority queue๋Š” push O(logn) , pop O(logn)

[ ๐Ÿฏย TIP] ๐Ÿ’ก ์šฐ์„ ์ˆœ์œ„ํ๋ฅผ ์ž˜ ๋‹ตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ตฌํ˜„ ๋ฐฉ๋ฒ•๊ณผ 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)

Heap pop - $O(logn)$

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

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

    โ‡’ root node์— ์ €์žฅ๋œ ๊ฐ’์ด ๊ฐ€์žฅ ํฐ ๊ฐ’์ด ๋œ๋‹ค.


Hash table & BST(Binary Search Tree)


โญโญBST

[ํ•ต์‹ฌ]

์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ(Binary Search Tree; BST)๋Š” ์ •๋ ฌ๋œ tree.

์–ด๋А node๋ฅผ ์„ ํƒํ•˜๋“  ํ•ด๋‹น node์˜ left subtree์—๋Š” ๊ทธ node์˜ ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค์„ ์ง€๋‹Œ node๋“ค๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , node์˜ right subtree์—๋Š” ๊ทธ node์˜ ๊ฐ’๋ณด๋‹ค ํฐ ๊ฐ’๋“ค์„ ์ง€๋‹Œ node๋“ค๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š” binary tree

๊ฒ€์ƒ‰๊ณผ ์ €์žฅ, ์‚ญ์ œ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๋ชจ๋‘ O(logn)์ด๊ณ , worst case๋Š” ํ•œ์ชฝ์œผ๋กœ ์น˜์šฐ์นœ tree๊ฐ€ ๋์„ ๋•Œ $O(n)$

[ ๐Ÿฏย TIP]

๐Ÿ’ก BST๋Š” ์ €์žฅ๊ณผ ๋™์‹œ์— ์ •๋ ฌ์„ ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ์ผ์ •ํ•œ ๊ทœ์น™์— ๋”ฐ๋ผ ์ €์žฅ.

BST

image

image

BST ์กฐ๊ฑด

  1. root node์˜ ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’์€ left subtree์—, ํฐ ๊ฐ’์€ right subtree์— ์žˆ๋‹ค.
  2. subtree๋„ 1๋ฒˆ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ๋‹ค.(Recursive)

image

image

search O(logn)

์ฐธ์กฐ : ๊ฐœ๋ฐœ๋‚จ๋…ธ์”จ ์ž๋ฃŒ๊ตฌ์กฐ

Leave a comment