๐Ÿ‘‰์ž๋ฃŒ๊ตฌ์กฐ/์•Œ๊ณ ๋ฆฌ์ฆ˜ - 7

ํ•™์Šต๊ธฐ๋ก

์˜ค๋Š˜ ๋“ค์€ ๊ฐ•์˜ ๋ชฉ๋ก

  1. ํŠธ๋ฆฌ - 6
  2. ํŠธ๋ฆฌ - 7
  3. ํŠธ๋ฆฌ - 8
  4. ํž™ - 1
  5. ํž™ - 2

ํŠธ๋ฆฌ ๊ตฌํ˜„ (๋ฃจํŠธ ์‚ญ์ œ ์•ˆ๋จ)

ํŠธ๋ฆฌ ๊ตฌํ˜„์„ ์–ด๋А์ •๋„ ํ•˜๊ธด ํ–ˆ๋Š”๋ฐ ์‚ญ์ œํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. Root ๋…ธ๋“œ ์‚ญ์ œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋˜์ง€ ์•Š์•˜๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋Š” ๋ฃจํŠธ ์‚ญ์ œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋‹ค. ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ตฌํ˜„์„ ํ•ด๋ด์•ผ๊ฒ ๋‹ค.

class Node:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None
class BST:
    def __init__(self, head = None):
        self.head = head
    
    def insert(self, value):
        if self.head == None:
            self.head = Node(value)
            return
        current_node = self.head
        while True:
            if value < current_node.value:
                if current_node.left == None:
                    current_node.left = Node(value)
                    return
                else:
                    current_node = current_node.left
            else:
                if current_node.right == None:
                    current_node.right = Node(value)
                    return
                else:
                    current_node = current_node.right
                    
    def search(self, value):
        current_node = self.head
        while current_node:
            if current_node.value == value:
                return True
            elif value < current_node.value:
                current_node = current_node.left
            else:
                current_node = current_node.right
                
    def delete(self, value):
        current_node = self.head # ์‚ญ์ œํ•˜๋ ค๋Š” ๋…ธ๋“œ
        parent_node = self.head # ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋…ธ๋“œ
        found = False
        while current_node:
            if current_node.value == value:
                found = True
                break
            parent_node = current_node
            if value < current_node.value:
                current_node = current_node.left
            else:
                current_node = current_node.right
        if found:
            if current_node.left and current_node.right:
                if current_node.right.left:
                    #left์˜ ์ขŒ์ธก๊ฐ’
                    change_node_parent = current_node.right # ์‚ญ์ œํ•˜๋ ค๋Š” ๋…ธ๋“œ์˜ ์œ„์น˜์— ์˜ฌ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ
                    change_node = current_node.right # ์‚ญ์ œํ•˜๋ ค๋Š” ๋…ธ๋“œ์˜ ์œ„์น˜์— ์˜ฌ ๋…ธ๋“œ
                    while change_node.left:
                        change_node_parent = change_node
                        change_node = change_node.left
                    if change_node.right:
                        change_node_parent.left = change_node.right
                        change_node.right = None
                    else:
                        change_node_parent.left = None
                    parent_node.right = change_node
                    change_node.right = current_node.right
                    del current_node
                else:
                    current_node.right.left = current_node.left
                    if parent_node.left == current_node:
                        parent_node.left = current_node.right
                    else:
                        parent_node.right = current_node.right
            elif current_node.left: # ์ขŒ์ธก์—๋งŒ ์ž์‹๋…ธ๋“œ ์กด์žฌ
                if parent_node.left == current_node:
                    parent_node.left = current_node.left
                else:
                    parent_node.right = current_node.left
                    
            elif current_node.right: # ์šฐ์ธก์—๋งŒ ์ž์‹๋…ธ๋“œ ์กด์žฌ
                if parent_node.left == current_node:
                    parent_node.left = current_node.right
                else:
                    parent_node.right = current_node.right
                    
            else: # ์ž์‹๋…ธ๋“œ ์—†์Œ
                if parent_node.left == current_node:
                    parent_node.left = None
                else:
                    parent_node.right = None
            del current_node
            
            
                
    def printbfs(self): # ๋„ˆ๋น„ํƒ์ƒ‰์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•
        queue = []
        queue.append(self.head)
        while len(queue):
            cur = queue.pop(0)
            if cur.left:
                queue.append(cur.left)
            if cur.right:
                queue.append(cur.right)
            print(cur.value)
            
                
                
tree = BST()
tree.insert(10)
tree.insert(5)
tree.insert(7)
tree.insert(3)
tree.insert(14)
tree.insert(12)
tree.insert(15)
print(tree.search(10))
print(tree.search(5))
print(tree.search(7))
print(tree.search(3))
print(tree.search(14))
print(tree.search(12))
print(tree.search(15))
#tree.delete(10) ๋ฃจํŠธ์‚ญ์ œ ์•ˆ๋จ
tree.delete(5)
tree.delete(3)
tree.delete(7)
tree.delete(14)
tree.printbfs()

BST์—์„œ ์‹œ๊ฐ„ ๋ณต์žก๋„ (ํ‰๊ท , ์ตœ์„ )

ํƒ์ƒ‰ํ• ๋•Œ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” depth์— ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.
์–ด๋–ค ํŠธ๋ฆฌ์˜ depth๋ฅผ d๋ผ๊ณ ํ• ๋•Œ, $O(d)$๊ฐ€ ๋œ๋‹ค.

ํŠธ๋ฆฌ์— ๋…ธ๋“œ๊ฐ€ n๊ฐœ ์žˆ์„๋•Œ ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ์ƒํ™ฉ์€ ๋†’์ด๊ฐ€ $log_2 n$์ธ๋ฐ,
์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด์„œ ํ‰๊ท  ์‹œ๊ฐ„๋ณต์žก๋„๋Š” $O(log n)$์ด๋ผ๊ณ  ํ•œ๋‹ค.
(TMI : ๋น…์˜ค ํ‘œ๊ธฐ๋ฒ•์—์„œ log์˜ ๋ฐ‘์€ 2์ด๋‹ค.)
์ด๋ ‡๊ฒŒ ํŠธ๋ฆฌ๊ฐ€ ๊ท ํ˜•์„ ์ด๋ฃจ๋Š” ์ƒํƒœ๋ฅผ ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ, ๊ท ํ˜• ํŠธ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค.

bst์• ๋‹ˆ๋ฉ”์ด์…˜
์œ„ ๊ทธ๋ฆผ์—์„œ ์ฒ˜๋Ÿผ ๋†’์ด์— ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.

BST์—์„œ ์‹œ๊ฐ„ ๋ณต์žก๋„ (์ตœ์•…)

์ตœ์•…
๋ฐ”๋กœ ์ž…๋ ฅ๋˜๋Š” ๊ฐ’์ด ํ•ญ์ƒ ๊ฐ€์žฅ ํฌ๊ฑฐ๋‚˜ ์ž‘์€ ๊ฐ’์ด ์ž…๋ ฅ๋ ๋•Œ์ด๋‹ค.
์œ„ ๊ทธ๋ฆผ์€ ๊ณ„์†ํ•ด์„œ ํฐ ๊ฐ’์ด ์ž…๋ ฅ๋˜์–ด ๊นŠ์ด๊ฐ€ n์ด ๋œ ์ผ€์ด์Šค์ด๋‹ค.
์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ $O(n)$์ด ๋œ๋‹ค.
๊ท ํ˜•์„ ์ด๋ฃจ์ง€ ์•Š๋Š” ์ƒํƒœ๋ฅผ ๋ถˆ๊ท ํ˜• ์ด์ง„ ํŠธ๋ฆฌํ•˜๊ณ , ํ•œ์ชฝ์— ์น˜์šฐ์นœ ํŠธ๋ฆฌ๋ฅผ ํŽธํ–ฅ ํŠธ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค.
์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์ด ์กด์žฌํ•˜๋ฉฐ AVLํŠธ๋ฆฌ, BํŠธ๋ฆฌ ๋“ฑ์ด ์žˆ๋‹ค.

ํž™(Heap)

ํŠธ๋ฆฌ์—์„œ ๋ณ€ํ˜•(ํ™•์žฅ)๋œ ๊ตฌ์กฐ ๋ฐ์ดํ„ฐ์—์„œ ์ตœ๋Œ€๊ฐ’๊ณผ ์ตœ์†Œ๊ฐ’์„ ์ง€์šฐ๊ธฐ ์œ„ํ•œ ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ
์™„์ „ ์ด์ง„ํŠธ๋ฆฌ : ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ ์ตœํ•˜๋‹จ ์™ผ์ชฝ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์‚ฝ์ž…ํ•˜๋Š” ํŠธ๋ฆฌ
(์ฐจ๋ก€๋Œ€๋กœ ์‚ฝ์ž…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•œ์ชฝ์œผ๋กœ ์น˜์šฐ์น˜๊ฑฐ๋‚˜ ํ•˜์ง€ ์•Š๊ณ  ๊ท ํ˜•์ ์ธ ํ˜•ํƒœ๋ฅผ ๋ˆ๋‹ค.)

ํž™์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

๋ฐฐ์—ด์—์„œ ๋ฐ์ดํ„ฐ์—์„œ ์ตœ์†Œ๊ฐ’๊ณผ ์ตœ๋Œ€๊ฐ’์„ ์ฐพ์œผ๋ ค๋ฉด $O(n)$์ด ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ
ํž™์€ $O(log n)$์ด๋ฉด ๋จ.
์šฐ์„ ์ˆœ์œ„ ํ์ฒ˜๋Ÿผ ์ตœ๋Œ€๊ฐ’ ๋˜๋Š” ์ตœ์†Œ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„์•ผ ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋งŽ์ด ํ™œ์šฉ๋จ

ํž™์˜ ๊ตฌ์กฐ

์ตœ๋Œ€ ํž™(Max Heap)๊ณผ ์ตœ์†Œ ํž™(Min Heap)์œผ๋กœ ๋ถ„๋ฅ˜๋จ.

  • ์ตœ๋Œ€ ํž™
    ๊ฐ ๋…ธ๋“œ๋Š” ์ž์‹๋…ธ๋“œ๋“ค๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.
    ๋”ฐ๋ผ์„œ ๋ฃจํŠธ๋…ธ๋“œ๊ฐ€ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.
  • ์ตœ์†Œ ํž™
    ๊ฐ ๋…ธ๋“œ๋Š” ์ž์‹๋…ธ๋“œ๋“ค๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.
    ๋”ฐ๋ผ์„œ ๋ฃจํŠธ๋…ธ๋“œ๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.

ํž™ ๋ฐ์ดํ„ฐ ์‚ฝ์ž…

  1. ์ตœํ•˜๋‹จ ์™ผ์ชฝ์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.
  2. ๋ถ€๋ชจ๋…ธ๋“œ์™€ ๋น„๊ตํ•ด์„œ ํ˜„์žฌ ๊ฐ’์ด ๋” ํฌ๋‹ค๋ฉด ์„œ๋กœ ๋ฐ”๊พผ๋‹ค.(swap)
  3. ๋ถ€๋ชจ๋…ธ๋“œ์˜ ๊ฐ’์ด ํ˜„์žฌ ๊ฐ’๋ณด๋‹ค ๋” ํด๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

ํž™์‚ฝ์ž…
๊ทธ๋ฆผ์—์„œ 20์„ ์‚ฝ์ž…ํ•œ ๊ณผ์ •์„ ๋ณด๋ฉด,

  1. 20์„ ์ตœํ•˜๋‹จ ์™ผ์ชฝ์— ์‚ฝ์ž…ํ•œ๋‹ค.
  2. ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ถ€๋ชจ(8)์™€ ๋น„๊ตํ•ด์„œ 20์ด ๋” ํฌ๋ฏ€๋กœ ์„œ๋กœ ๋ฐ”๊พผ๋‹ค.
  3. ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ถ€๋ชจ(15)์™€ ๋น„๊ตํ•ด์„œ 20์ด ๋” ํฌ๋ฏ€๋กœ ์„œ๋กœ ๋ฐ”๊พผ๋‹ค.
  4. ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ข…๋ฃŒํ•œ๋‹ค.

ํž™ ๋ฐ์ดํ„ฐ ์‚ญ์ œ

ํž™์˜ ๋ฐ์ดํ„ฐ ์‚ญ์ œ๋Š” ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.
(ํž™์˜ ๋ณธ๋ž˜ ์šฉ๋„๊ฐ€ ์ตœ์†Œ๊ฐ’๊ณผ ์ตœ๋Œ€๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ)
์‚ญ์ œ ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.
  2. ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ถ”๊ฐ€ํ•œ ๋…ธ๋“œ(์ตœํ•˜๋‹จ ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ)๋ฅผ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋กœ ์˜ฎ๊ธด๋‹ค.
  3. ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์™€ ์ž์‹ ๋…ธ๋“œ์™€ ๋น„๊ตํ•ด์„œ ์ž์‹๋…ธ๋“œ ์ค‘ ๋” ํฐ ๋…ธ๋“œ์™€ swapํ•œ๋‹ค.
  4. ์•„๋ž˜๋กœ ์ด๋™ํ•œ ๋…ธ๋“œ(์ด์ „ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ)์™€ ์ž์‹๋…ธ๋“œ ์ค‘ ํฐ ๋…ธ๋“œ์™€ swapํ•œ๋‹ค.
  5. ๋” ์ด์ƒ ์ด๋™ํ•  ์ˆ˜ ์—†์„๋•Œ๊นŒ์ง€ 4๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค.

ํž™์‚ญ์ œ

๋งˆ์ง€๋ง‰

๊ตฌํ˜„์€ ๋‚ด์ผํ•˜๊ธฐ๋กœ~

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ