์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- disk spill
- Airflow
- spark executor memory
- off heap memory
- aws
- Spark SQL
- AQE
- Spark ์ค์ต
- Speculative Execution
- mysql
- SQL
- Docker
- KDT_TIL
- k8s
- Spark
- redshift
- ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ
- Spark Caching
- Kubernetes
- topic
- DataFrame Hint
- etl
- Spark Partitioning
- Dag
- colab
- Salting
- ๋น ๋ฐ์ดํฐ
- CI/CD
- backfill
- Kafka
- Today
- Total
JUST DO IT!
[TIL] KDT_20230412 ๋ณธ๋ฌธ
๐ KDT WEEK 2 DAY 3 TIL
- ํ(Queue)
- ์ด์ง ํธ๋ฆฌ(Binary Trees)
- ํ(Heaps)
ํ(Queue)์ ํน์ง
- ์ ์ ์ ์ถ(FIFO)์ ์๋ฃ ๊ตฌ์กฐ "ํ์ดํฌ" ๋ผ๊ณ ๋ ๋ถ๋ฆ
- dequeue ์ฐ์ฐ์ ์๊ฐ ๋ณต์ก๋ ํจ์จ์ ์ํด ์ ํ ๋ฐฐ์ด๋ณด๋ค ์ฐ๊ฒฐ๋ฆฌ์คํธ๊ฐ ์ ๋ฆฌ
ํํ ํ(Circular Queues)์ ํน์ง
- ํ์ ๋ฐ์ดํฐ ์ฌ์ด์ฆ๋ฅผ ์ ํํด๋๊ณ , ํ์ชฝ ๋๊ณผ ๋ค๋ฅธ ์ชฝ ๋์ด ๋ง๋ฟ์ ํํ
- ์ ํ ๋ฐฐ์ด๋ก๋ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํ ๊ฐ๋ฅ
์ฐ์ ์์ ํ(Priority Queues)์ ํน์ง
- enqueue ์ฐ์ฐ์ ์ฐ์ ์์ ์์๋๋ก ํ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์
- dequue ์ฐ์ฐ์์ ์ฐ์ ์์๊ฐ ๋์ ๊ฒ์ ์ ํํ ์๋ ์๊ฒ ์ง๋ง, ์ด ๊ฒฝ์ฐ ๋งค ๋ฒ O(n) ์์
- ์ด์์ฒด์ ์์ CPU ์ค์ผ์ค๋ฌ๋ฅผ ๊ตฌํํ ๋ ํ์ฉ๋จ
์ด์ง ํธ๋ฆฌ(Binary Trees)์ ํน์ง
- ํธ๋ฆฌ์ ํฌํจ๋๋ ๋ชจ๋ ๋ ธ๋์ ์ฐจ์๊ฐ 2 ์ดํ์ธ ํธ๋ฆฌ
- ์ ์ ์์ฒด๊ฐ ์ฌ๊ท์ ์ด๊ธฐ ๋๋ฌธ์, ์ฐ์ฐ๋ค๋ ๋๋ถ๋ถ ์ฌ๊ท์ ์ผ๋ก ๊ตฌํ ๊ฐ๋ฅ
์ด์ง ํธ๋ฆฌ์ ๊น์ด ์ฐ์ ์ํ
- ์ค์ ์ํ(in-order traversal) : ์ผ์ชฝ, ์์ , ์ค๋ฅธ์ชฝ ์์๋๋ก ํ์
- ์ ์ ์ํ(pre-order traversal) : ์์ ์ ๋จผ์ ๋ฐฉ๋ฌธ ํ ์ผ์ชฝ ํ์, ์ค๋ฅธ์ชฝ ํ์
- ํ์ ์ํ(post-order traversal) : ์ผ์ชฝ, ์ค๋ฅธ์ชฝ, ์์ ์์๋๋ก ํ์
์ค๋ ๊ฐ์ข๋ก ๊ตฌํํ๋ ์ฝ๋ ์์..
์ ์ ์ํ์ ๊ฒฝ์ฐ
def preorder(self):
traversal = []
traversal.append(self.data)
if self.left:
traversal += self.left.preorder()
if self.right:
traversal += self.right.preorder()
return traversal
์ค์, ํ์ ์ํ์ ๊ฒฝ์ฐ ์ ์ฝ๋์์ ์๋ง๊ฒ ์์น๋ง ๋ฐ๊ฟ์ค๋ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
๊น์ด ์ฐ์ ์ํ์ ๊ฒฝ์ฐ ๊ตฌํ์ด ๊ทธ๋ ๊ฒ ์ด๋ ต์ง๋ ์์ง๋ง.. ๋์ด ์ฐ์ ์ํ์ ๊ฒฝ์ฐ๋ ๋ค๋ฅด๋ค..
์ด์ง ํธ๋ฆฌ์ ๋์ด ์ฐ์ ์ํ
- ์ผ์ชฝ๋ถํฐ ์ค๋ฅธ์ชฝ์ผ๋ก, ๋ฎ์ ๋ ๋ฒจ์์ ๋์ ๋ ๋ฒจ๋ก ์ฐจ๋ก๋๋ก ์ํํ๋ค.
- ์ฌ๊ท์ ์ผ๋ก ๊ตฌํ์ ์ด๋ ต๊ณ , ํ(Queue)๋ฅผ ํ์ฉํ ๋ฐฉ๋ฒ์ด ์๋ค.
๊ตฌํํ๋ ์ฝ๋ ์์.. ํ๋ฅผ ํ์ฉํ ๋ฐฉ๋ฒ์ด ์ธ์์ ์ด์๋ค.
class BinaryTree:
def __init__(self, r):
self.root = r
def bft(self): # ๋์ด ์ฐ์ ์ํ
traversal = []
q = ArrayQueue()
if self.root:
q.enqueue(self.root)
while not q.isEmpty(): # ํ ์์ ๋ฐ์ดํฐ๊ฐ ์๋ ๋์์ ๋ฃจํ
curr = q.dequeue()
traversal.append(curr.data)
# ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ์์์ด ์กด์ฌํ๋ฉด ์ฐจ๋ก๋ก ํ์ ๋ฃ๋๋ค.
if curr.left:
q.enqueue(curr.left)
if curr.right:
q.enqueue(curr.right)
return traversal
์ด๋ ๊ฒ ํ์ ์ฐจ๋ก๋๋ก ๋ ธ๋๋ฅผ ๋ฃ๊ฒ ๋๋ฉด, ํ์ ์ ์ ์ ์ถ์ ์ํด ๊ฒฐ๊ตญ ๋ฎ์ ๋ ๋ฒจ ๋ถํฐ ์ฐจ๋ก๋๋ก ํ์ํ๊ฒ ๋๋ค! ๐
์ด์ง ํ์ ํธ๋ฆฌ(Binary Search Trees)์ ํน์ง
- ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ์์ ๋ณด๋ค ๋ฎ์ ๊ฐ์, ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ ์์ ๋ณด๋ค ๋์ ๊ฐ์์ ๋ง์กฑํ๋ ํธ๋ฆฌ
- ํ์, ์ฝ์ , ์ญ์ ์ ์๊ฐ ๋ณต์ก๋๊ฐ log(n)์ ๋น๋กํ๋ค. (ํธ๋ฆฌ์ ์ข์ฐ ๊ท ํ์ด ๋น์ทํ ๋)
์ญ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ ์ฝ๋, ์๊ฐํด ๋ณผ ๊ฒฝ์ฐ์ ์๊ฐ ์ข ์์๋ค.
def remove(self, key):
node, parent = self.lookup(key)
if node:
nChildren = node.countChildren()
# The simplest case of no children
if nChildren == 0:
# ๋ง์ฝ parent ๊ฐ ์์ผ๋ฉด
# node ๊ฐ ์ผ์ชฝ ์์์ธ์ง ์ค๋ฅธ์ชฝ ์์์ธ์ง ํ๋จํ์ฌ
# parent.left ๋๋ parent.right ๋ฅผ None ์ผ๋ก ํ์ฌ
# leaf node ์๋ ์์์ ํธ๋ฆฌ์์ ๋์ด๋ด์ด ์์ฑ๋๋ค.
if parent:
if parent.left == node:
parent.left = None
else:
parent.right = None
# ๋ง์ฝ parent ๊ฐ ์์ผ๋ฉด (node ๋ root ์ธ ๊ฒฝ์ฐ)
# self.root ๋ฅผ None ์ผ๋ก ํ์ฌ ๋น ํธ๋ฆฌ๋ก ๋ง๋ญ๋๋ค.
else:
self.root = None
# When the node has only one child
elif nChildren == 1:
# ํ๋ ์๋ ์์์ด ์ผ์ชฝ์ธ์ง ์ค๋ฅธ์ชฝ์ธ์ง๋ฅผ ํ๋จํ์ฌ
# ๊ทธ ์์์ ์ด๋ค ๋ณ์๊ฐ ๊ฐ๋ฆฌํค๋๋ก ํฉ๋๋ค.
if node.left:
child = node.left
else:
child = node.right
# ๋ง์ฝ parent ๊ฐ ์์ผ๋ฉด
# node ๊ฐ ์ผ์ชฝ ์์์ธ์ง ์ค๋ฅธ์ชฝ ์์์ธ์ง ํ๋จํ์ฌ
# ์์์ ๊ฐ๋ฆฌํจ ์์์ ๋์ node ์ ์๋ฆฌ์ ๋ฃ์ต๋๋ค.
if parent:
if parent.left == node:
parent.left = child
else:
parent.right = child
# ๋ง์ฝ parent ๊ฐ ์์ผ๋ฉด (node ๋ root ์ธ ๊ฒฝ์ฐ)
# self.root ์ ์์์ ๊ฐ๋ฆฌํจ ์์์ ๋์ ๋ฃ์ต๋๋ค.
else:
self.root = child
# When the node has both left and right children
else:
parent = node
successor = node.right
# parent ๋ node ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๊ณ ,
# successor ๋ node ์ ์ค๋ฅธ์ชฝ ์์์ ๊ฐ๋ฆฌํค๊ณ ์์ผ๋ฏ๋ก
# successor ๋ก๋ถํฐ ์ผ์ชฝ ์์์ ๋งํฌ๋ฅผ ๋ฐ๋ณตํ์ฌ ๋ฐ๋ผ๊ฐ์ผ๋ก์จ
# ์ํ๋ฌธ์ด ์ข
๋ฃํ ๋ successor ๋ ๋ฐ๋ก ๋ค์ ํค๋ฅผ ๊ฐ์ง ๋
ธ๋๋ฅผ,
# ๊ทธ๋ฆฌ๊ณ parent ๋ ๊ทธ ๋
ธ๋์ ๋ถ๋ชจ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ฐพ์๋
๋๋ค.
while successor.left:
parent = successor
successor = successor.left
# ์ญ์ ํ๋ ค๋ ๋
ธ๋์ธ node ์ successor ์ key ์ data ๋ฅผ ๋์
ํฉ๋๋ค.
node.key = successor.key
node.data = successor.data
# ์ด์ , successor ๊ฐ parent ์ ์ผ์ชฝ ์์์ธ์ง ์ค๋ฅธ์ชฝ ์์์ธ์ง๋ฅผ ํ๋จํ์ฌ
# ๊ทธ์ ๋ฐ๋ผ parent.left ๋๋ parent.right ๋ฅผ
# successor ๊ฐ ๊ฐ์ง๊ณ ์๋ (์์ ์๋ ์์ง๋ง) ์์์ ๊ฐ๋ฆฌํค๋๋ก ํฉ๋๋ค.
if successor.left:
child = successor.left
else:
child = successor.right
if parent.left == successor:
parent.left = child
else:
parent.right = child
return True
else:
return False
์์์ ์๋ถํฐ ์์ํด์ ์ผ์ชฝ ์์์ธ์ง.. ์ค๋ฅธ์ชฝ ์์์ธ์ง.. ๋ฑ ๊ตฌ๋ณํด์ผ ํ๋ค.
ํ(Heaps)์ ํน์ง
- ๋ฃจํธ ๋ ธ๋๊ฐ ํญ์ ์ต๋๊ฐ, ์ต์๊ฐ์ ๊ฐ์ง๋๋์ ๋ฐ๋ผ ์ต๋ํ, ์ต์ํ์ผ๋ก ๋๋๋ค.
- ์๋ธํธ๋ฆฌ ๋ํ ์ต๋ํ์ด๋ ์ต์ํ์ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
- ์์ ํ ํฌ๊ธฐ ์์๋๋ก ์ ๋ ฌ๋์ด ์์ง ์์ผ๋, ํ ์ ๋ ฌ(Heap sort) ์๊ณ ๋ฆฌ์ฆ์ ํตํด ์ ๋ ฌ์ ์ฌ์ฉ๋๋ค.
- ์ฝ์ , ์ญ์ ์๊ฐ์ log(n) ๋งํผ ์์ํ๋ค.
- ๋ ธ๋์ ์ถ๊ฐ์ ์ญ์ ๊ฐ ํญ์ ๋ง์ง๋ง ์์์์๋ง ์ผ์ด๋๋ค. โก ์์ ์ด์ง ํธ๋ฆฌ๋ฅผ ๋ง์กฑํด์ผ ํ๊ธฐ ๋๋ฌธ!
๐ค ๊ณต๋ถํ๋ฉด์ ์ด๋ ค์ ๋ ๋ด์ฉ
์ค๋๋ง ์ธ ๊ฐ์ง์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ฐฐ์ ๋ค..๐
๊ฐ ์๋ฃ๊ตฌ์กฐ์ ํน์ง์ด ๋๋ ทํ๊ณ ์ฐ์์๊ฐ ๋ณด์ฌ์ ์ฌ๋ฐ๊ธด ํ์์ง๋ง..
์ด ๊ตฌ์กฐ๋ค์ ์๋ง์ ์ํฉ์ ๋ฑ๋ฑ ์ฌ์ฉํ๋ ค๋ฉด ์ ๋ง ๋ง์ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๋ ๊ฒ ๋ต์ธ ๊ฒ๊ฐ๋ค..๐คค
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL]KDT_20230417 (0) | 2023.04.17 |
---|---|
[TIL] KDT_20230414 (0) | 2023.04.14 |
[TIL] KDT_20230413 (0) | 2023.04.13 |
[TIL] KDT_20230411 (0) | 2023.04.11 |
[TIL] KDT_20230410 (0) | 2023.04.10 |