๐์๋ฃ๊ตฌ์กฐ/์๊ณ ๋ฆฌ์ฆ - 7
ํ์ต๊ธฐ๋ก
์ค๋ ๋ค์ ๊ฐ์ ๋ชฉ๋ก
- ํธ๋ฆฌ - 6
- ํธ๋ฆฌ - 7
- ํธ๋ฆฌ - 8
- ํ - 1
- ํ - 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์์ ์๊ฐ ๋ณต์ก๋ (์ต์ )
๋ฐ๋ก ์
๋ ฅ๋๋ ๊ฐ์ด ํญ์ ๊ฐ์ฅ ํฌ๊ฑฐ๋ ์์ ๊ฐ์ด ์
๋ ฅ๋ ๋์ด๋ค.
์ ๊ทธ๋ฆผ์ ๊ณ์ํด์ ํฐ ๊ฐ์ด ์
๋ ฅ๋์ด ๊น์ด๊ฐ n์ด ๋ ์ผ์ด์ค์ด๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ ์๊ฐ๋ณต์ก๋๊ฐ $O(n)$์ด ๋๋ค.
๊ท ํ์ ์ด๋ฃจ์ง ์๋ ์ํ๋ฅผ ๋ถ๊ท ํ ์ด์ง ํธ๋ฆฌํ๊ณ , ํ์ชฝ์ ์น์ฐ์น ํธ๋ฆฌ๋ฅผ ํธํฅ ํธ๋ฆฌ๋ผ๊ณ ํ๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์๊ณ ๋ฆฌ์ฆ๋ค์ด ์กด์ฌํ๋ฉฐ AVLํธ๋ฆฌ, Bํธ๋ฆฌ ๋ฑ์ด ์๋ค.
ํ(Heap)
ํธ๋ฆฌ์์ ๋ณํ(ํ์ฅ)๋ ๊ตฌ์กฐ
๋ฐ์ดํฐ์์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ์ง์ฐ๊ธฐ ์ํ ์์ ์ด์งํธ๋ฆฌ
์์ ์ด์งํธ๋ฆฌ : ๋
ธ๋๋ฅผ ์ฝ์
ํ ๋ ์ตํ๋จ ์ผ์ชฝ ๋
ธ๋๋ถํฐ ์ฐจ๋ก๋๋ก ์ฝ์
ํ๋ ํธ๋ฆฌ
(์ฐจ๋ก๋๋ก ์ฝ์
ํ๊ธฐ ๋๋ฌธ์ ํ์ชฝ์ผ๋ก ์น์ฐ์น๊ฑฐ๋ ํ์ง ์๊ณ ๊ท ํ์ ์ธ ํํ๋ฅผ ๋๋ค.)
ํ์ ์ฌ์ฉํ๋ ์ด์
๋ฐฐ์ด์์ ๋ฐ์ดํฐ์์ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ์ฐพ์ผ๋ ค๋ฉด $O(n)$์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ
ํ์ $O(log n)$์ด๋ฉด ๋จ.
์ฐ์ ์์ ํ์ฒ๋ผ ์ต๋๊ฐ ๋๋ ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ์์ผ ํ๋ ์๋ฃ๊ตฌ์กฐ ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ง์ด ํ์ฉ๋จ
ํ์ ๊ตฌ์กฐ
์ต๋ ํ(Max Heap)๊ณผ ์ต์ ํ(Min Heap)์ผ๋ก ๋ถ๋ฅ๋จ.
- ์ต๋ ํ
๊ฐ ๋ ธ๋๋ ์์๋ ธ๋๋ค๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ค.
๋ฐ๋ผ์ ๋ฃจํธ๋ ธ๋๊ฐ ๊ฐ์ฅ ํฐ ๊ฐ์ ๊ฐ์ง๋ค. - ์ต์ ํ
๊ฐ ๋ ธ๋๋ ์์๋ ธ๋๋ค๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ค.
๋ฐ๋ผ์ ๋ฃจํธ๋ ธ๋๊ฐ ๊ฐ์ฅ ์์ ๊ฐ์ ๊ฐ์ง๋ค.
ํ ๋ฐ์ดํฐ ์ฝ์
- ์ตํ๋จ ์ผ์ชฝ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๋ค.
- ๋ถ๋ชจ๋ ธ๋์ ๋น๊ตํด์ ํ์ฌ ๊ฐ์ด ๋ ํฌ๋ค๋ฉด ์๋ก ๋ฐ๊พผ๋ค.(swap)
- ๋ถ๋ชจ๋ ธ๋์ ๊ฐ์ด ํ์ฌ ๊ฐ๋ณด๋ค ๋ ํด๋๊น์ง ๋ฐ๋ณตํ๋ค.
๊ทธ๋ฆผ์์ 20์ ์ฝ์
ํ ๊ณผ์ ์ ๋ณด๋ฉด,
- 20์ ์ตํ๋จ ์ผ์ชฝ์ ์ฝ์ ํ๋ค.
- ํด๋น ๋ ธ๋์ ๋ถ๋ชจ(8)์ ๋น๊ตํด์ 20์ด ๋ ํฌ๋ฏ๋ก ์๋ก ๋ฐ๊พผ๋ค.
- ํด๋น ๋ ธ๋์ ๋ถ๋ชจ(15)์ ๋น๊ตํด์ 20์ด ๋ ํฌ๋ฏ๋ก ์๋ก ๋ฐ๊พผ๋ค.
- ๋ถ๋ชจ ๋ ธ๋๊ฐ ์์ผ๋ฏ๋ก ์ข ๋ฃํ๋ค.
ํ ๋ฐ์ดํฐ ์ญ์
ํ์ ๋ฐ์ดํฐ ์ญ์ ๋ ๋ฃจํธ ๋
ธ๋๋ฅผ ์ญ์ ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
(ํ์ ๋ณธ๋ ์ฉ๋๊ฐ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ๋น ๋ฅด๊ฒ ๊บผ๋ด ์ธ ์ ์๋๋ก ํ๊ธฐ ์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ)
์ญ์ ๊ณผ์ ์ ์๋์ ๊ฐ๋ค.
- ์ต์๋จ ๋ ธ๋๋ฅผ ์ญ์ ํ๋ค.
- ๊ฐ์ฅ ๋ง์ง๋ง์ผ๋ก ์ถ๊ฐํ ๋ ธ๋(์ตํ๋จ ์ค๋ฅธ์ชฝ ๋ ธ๋)๋ฅผ ์ต์๋จ ๋ ธ๋๋ก ์ฎ๊ธด๋ค.
- ์ต์๋จ ๋ ธ๋์ ์์ ๋ ธ๋์ ๋น๊ตํด์ ์์๋ ธ๋ ์ค ๋ ํฐ ๋ ธ๋์ swapํ๋ค.
- ์๋๋ก ์ด๋ํ ๋ ธ๋(์ด์ ์ต์๋จ ๋ ธ๋)์ ์์๋ ธ๋ ์ค ํฐ ๋ ธ๋์ swapํ๋ค.
- ๋ ์ด์ ์ด๋ํ ์ ์์๋๊น์ง 4๋ฅผ ๋ฐ๋ณตํ๋ค.
๋ง์ง๋ง
๊ตฌํ์ ๋ด์ผํ๊ธฐ๋ก~
๋๊ธ๋จ๊ธฐ๊ธฐ