2021. 9. 6. 08:00ใ์ฝ๋ฉ ํ ์คํธ ์ค๋น/์๋ฃ๊ตฌ์กฐ
์๋ ํ์ธ์? ์ฃผ๋ํ๋ ์ ๋๋ค.
์ค๋์ ์๋ฃ๊ตฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฃ๊ตฌ์กฐ์์ Heap ๊ตฌ์กฐ์ ๋ํด ๊ณต๋ถ ํด ๋ณด๋๋ก ํ๋ ๊ฒ์ด์์.
์์ค ์ฝ๋์ ๋ํด์ ํ์ธ ํ๊ณ ์ถ์ผ์ ๋ถ๋ค๊ป์๋ ์ฃผ๋ํ๋์ Git hub์ ๊ด์ฌ์ ์ฃผ์ธ์!
๐ Heap ๊ตฌ์กฐ
๐ Heap (ํ)์ด๋?
Data์์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ๊ธฐ ์ํด ๊ณ ์๋ Complete Binary Tree (์์ ์ด์ง ํธ๋ฆฌ)์ธ ๊ฒ์ด์์.
๊ทธ๋ผ ์์ ์ด์ง ํธ๋ฆฌ๊ฐ ๋ฌด์์ผ๊น์? Node๋ฅผ ์ฝ์ ํ ๋, ์ต ํ๋จ ์ผ์ชฝ Node๋ถํฐ ์ฐจ๋ก๋๋ก ์ฝ์ ํ๋ ๊ฒ์ ๋งํ๋ต๋๋ค!
๐ ํ์ ์ฌ์ฉํ๋ ์ด์
- ๋ฐฐ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ , ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ์ฐพ์ผ๋ ค๋ฉด $O(n)$์ด ๊ฑธ๋ฆฐ๋ค.
- ์ด์ ๋ฐํด, ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ , ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ์ฐพ์ผ๋ฉด, $O(logn)$์ด ๊ฑธ๋ฆฐ๋ค.
- ์ฐ์ ์์ ํ์ ๊ฐ์ด ์ต๋๊ฐ ๋๋ ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ์์ผ ํ๋ ์๋ฃ๊ตฌ์กฐ ๋ฐ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ ๋ฑ์ ํ์ฉ
๐ Heap ๊ตฌ์กฐ
ํ์ ์ต๋๊ฐ์ ๊ตฌํ๊ธฐ ์ํ ๊ตฌ์กฐ(์ต๋ ํ, Max Heap)์ ์ต์๊ฐ์ ๊ตฌํ๊ธฐ ์ํ ๊ตฌ์กฐ(์ต์ ํ, Min Heap)๋ก ๋ถ๋ฅํ ์ ์๋ ๊ฒ์ด์์.
ํ์ ๋ค์๊ณผ ๊ฐ์ด ๋ ๊ฐ์ง ์กฐ๊ฑด์ ๊ฐ์ง๊ณ ์๋ ์๋ฃ ๊ตฌ์กฐ๋๋๋ค!
- ๊ฐ Node์ ๊ฐ์ ํด๋น Node์ ์์ Node๊ฐ ๊ฐ์ง ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค(์ต๋ ํ์ ๊ฒฝ์ฐ).
- ์ต์ ํ์ ๊ฒฝ์ฐ๋ ๊ฐ Node์ ๊ฐ์ ํด๋น Node์ ์์ Node๊ฐ ๊ฐ์ง ๊ฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
- ์์ ์ด์ง ํธ๋ฆฌ ํํ๋ฅผ ๊ฐ์
๐ ํ๊ณผ ์ด์ง ํ์ ํธ๋ฆฌ์ ๊ณตํต์ ๊ณผ ์ฐจ์ด์
- ๊ณตํต์ : ํ๊ณผ ์ด์ง ํ์ ํธ๋ฆฌ๋ ๋ชจ๋ ์ด์ง ํธ๋ฆฌ ๊ตฌ์กฐ
- ์ฐจ์ด์ : ํ์ ๊ฐ Node์ ๊ฐ์ด ์์ Node๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค(Max Heap์ ๊ฒฝ์ฐ).
- ์ด์ง ํ์ ํธ๋ฆฌ๋ ๋ถ๋ชจ Node ๊ธฐ์ค ์ผ์ชฝ ์์ Node์ ๊ฐ์ด ๊ฐ์ฅ ์๊ณ , ๋ค์ ๋ถ๋ชจ Node, ๋ค์ ๋ถ๋ชจ Node ๊ธฐ์ค ์ค๋ฅธ์ชฝ Node ๊ฐ์ด ๊ฐ์ฅ ํฌ๋ค.
- ํ์ ์ด์ง ํ์ ํธ๋ฆฌ์ ์กฐ๊ฑด์ธ ์์ ๋
ธ๋์์ ์์ ๊ฐ์ ์ผ์ชฝ, ํฐ ๊ฐ์ด ์ค๋ฅธ์ชฝ์ ์์ผ ํ๋ค๋ผ๋ ์กฐ๊ฑด์ด ์๋ค.
- ํ์ ๋ถ๋ชจ Node ๊ธฐ์ค ์ผ์ชฝ ๋ฐ ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋์ ๊ฐ์ ์ค๋ฅธ์ชฝ์ด ํด์๋ ์ผ์ชฝ์ด ํด์๋ ์๋ค.
- ์ด์ง ํ์ ํธ๋ฆฌ๋ ํ์์ ์ํ ๊ตฌ์กฐ, ํ์ ์ต๋ / ์ต์๊ฐ ๊ฒ์์ ์ํ ๊ตฌ์กฐ ์ค ํ๋์ด๋ค.
๐ Heap ๋์
Data๋ฅผ ํ ๊ตฌ์กฐ์ ์ฝ์ , ์ญ์ ํ๋ ๊ณผ์ ์ ์ฐ๋ฆฌ ํ๋ฒ ์ดํด ํด ๋ณด์์!
๐ Heap์ Data ์ฝ์ - ๊ธฐ๋ณธ ๋์
ํ์ ์์ ์ด์ง ํธ๋ฆฌ์ด๋ฏ๋ก, ์ฝ์ ํ Node๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ์ชฝ ์ตํ๋จ๋ถ Node๋ถํฐ Data๊ฐ ์ฑ์์ง๋ ๊ฒ์ด์์.
๐ ์ฝ์ ํ Data๊ฐ Heap์ Data๋ณด๋ค ํด ๊ฒฝ์ฐ? (Max Heap ์์)
๋จผ์ ์ฝ์ ๋ Data๋ ์์ ์ด์ง ํธ๋ฆฌ ๊ตฌ์กฐ์ ๋ง์ถ์ด ์ตํ๋จ๋ถ ์ผ์ชฝ Node๋ถํฐ ์ฑ์์ง๋ ๊ฒ์ด์์.
์ฑ์์ง Node ์์น์์, ๋ถ๋ชจ Node๋ณด๋ค ๊ฐ์ด ํด ๊ฒฝ์ฐ, ๋ถ๋ชจ Node์ ์์น๋ฅผ ๋ฐ๊ฟ์ฃผ๋ ์์ ์ ๋ฐ๋ณต(Swap)ํด์ผ ํ๋ต๋๋ค!
20์ด๋ผ๋ Data๊ฐ ๋ค์ด์ฌ ๋, ์ต์ด ์ตํ๋จ ์ผ์ชฝ Node๋ถํฐ Node๊ฐ ์ฑ์์ง๋ ๊ฒ์ด์์. 5, 4๋ผ๋ Data๋ฅผ ๊ฐ์ง Node๊ฐ ์์ผ๋ ๊ทธ ๋ค์ ๋น ๊ณต๊ฐ์ 20์ด ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฐ๋ค 20๊ณผ ๋ถ๋ชจ Node์ ๊ฐ์ ๋น๊ต๋ฅผ ํ๋๋ฐ, ๋ถ๋ชจ Node์ ๊ฐ์ด ๋ ์๋ค๋ฉด ์๋ก ์์น๋ฅผ ๋ฐ๊พธ๋ ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค ๋ ์์ ๋ถ๋ชจ Node์ ๊ฐ์ ๋น๊ต๋ฅผ ํ๋๋ฐ, ๋ถ๋ชจ Node๊ฐ ๊ฐ์ด ํฌ๋ค๋ฉด ๋ณํ ์์ด ๊ฐ๋งํ ์๊ณ , ๋์ด ๋๊ฒ ์ง๋ง, ๊ทธ๋ ์ง ์๋ค๋ฉด ๋ ํ๋ฒ์ ์์น ๋ณํ๊ฐ ์๊ธฐ๋ ๊ฒ์ด์์.
๐ Heap์ Data ์ญ์ (Max Heap ์์)
์ญ์ ๋ ์ต์๋จ Node (Root Node)๋ฅผ ์ญ์ ํ๋ ๊ฒ์ด ์ผ๋ฐ ์ ์ธ ๊ฒ์ด์์.
์๋ํ๋ฉด ํ์ ์ฉ๋๋ ์ต๋๊ฐ ๋๋ ์ต์๊ฐ์ Root Node์ ๋๊ธฐ ๋๋ฌธ์ด๋ฉฐ, Heap์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ๊ตฌํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ์๋ฃ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ๋ฐ๋ก ๊บผ๋ด ์ธ ์ ์๋๋ก ํ๋ ๊ฒ์ด์์.
๊ทธ๋ผ ์ด์ Root Node๊ฐ ๋น์ ๋ค๋ฉด ๋ค์ ์์ ์ผ๋ก ์๋จ์ Data ์ญ์ ์, ๊ฐ์ฅ ์ตํ๋จ๋ถ ์ผ์ชฝ์ ์์นํ Node(์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฅ ๋ง์ง๋ง์ ์ถ๊ฐํ Node)๋ฅผ Root Node๋ก ์ด๋ ์ํจ๋ต๋๋ค!
Root Node์ ๊ฐ์ด Child Node๋ณด๋ค ์๋ค๋ฉด Root Node์ Child Node ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ ๊ฐ์ง Node์ Root Node์ ์์น๋ฅผ ๋ฐ๊พธ๋ ์์ ์ ๋ค์ ์์ํ๊ฒ ๋๋ต๋๋ค. (Swap)
์์ ๊ทธ๋ฆผ์์ 8์ด Root Node๋ก ์ฌ๋ผ๊ฐ ๋ค ๊ทธ ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ธ 15์ ๋น๊ต๋ฅผ ํด์ ์๊ธฐ ๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์ ์์น๋ฅผ ๋ฐ๊พธ๋ ๊ฒ์ด์์.
๊ทธ๋ฐ๋ฐ, ๋ง์ฝ 15 ๋ฐ์ ๋๋ค๋ฅธ Child Node๊ฐ ์์๊ณ , ๊ทธ ์ซ์๊ฐ ๋ 8๋ณด๋ค ํฌ๋ค๋ฉด? ์ด ์์ ์ ๋ ๋ฐ๋ณต ๋๊ฒ ๋ ๊ฒ์ด์์.
๐ Heap ๊ตฌํ
๐ Heap์ Data ์ญ์ (Max Heap ์์)
- ์ผ๋ฐ์ ์ผ๋ก ํ ๊ตฌํ์ ๋ฐฐ์ด ์๋ฃ๊ตฌ์กฐ๋ฅผ ํ์ฉํ๋ค๊ณ ํฉ๋๋ค!
- ๋ฐฐ์ด์ ์ธ๋ฑ์ค๊ฐ 0๋ฒ๋ถํฐ ์์ํ์ง๋ง, ํ ๊ตฌํ์ ํธ์๋ฅผ ์ํด, root ๋
ธ๋ ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ 1๋ก ํด๋ณผ ๊ฒ์ด์์!
- ๋ถ๋ชจ ๋
ธ๋ ์ธ๋ฑ์ค ๋ฒํธ (parent node's index) = ์์ ๋
ธ๋ ์ธ๋ฑ์ค ๋ฒํธ (child node's index) // 2
(๋๋๊ธฐ 2) - ์ผ์ชฝ ์์ ๋ ธ๋ ์ธ๋ฑ์ค ๋ฒํธ (left child node's index) = ๋ถ๋ชจ ๋ ธ๋ ์ธ๋ฑ์ค ๋ฒํธ (parent node's index) * 2
- ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋ ์ธ๋ฑ์ค ๋ฒํธ (right child node's index) = (๋ถ๋ชจ ๋ ธ๋ ์ธ๋ฑ์ค ๋ฒํธ (parent node's index) * 2) + 1
- ๋ถ๋ชจ ๋
ธ๋ ์ธ๋ฑ์ค ๋ฒํธ (parent node's index) = ์์ ๋
ธ๋ ์ธ๋ฑ์ค ๋ฒํธ (child node's index) // 2
๐ 10์ ๊ฐ์ง Node(Index Number 2)์ ๋ถ๋ชจ Node Index Number ๊ตฌํ๊ธฐ!
2 // 2
# ๊ฒฐ๊ณผ : 1
๐ 15์ ๊ฐ์ง Node(Index Number 1)์ ์ผ์ชฝ ์์ Node Index Number ๊ตฌํ๊ธฐ!
1 * 2
# ๊ฒฐ๊ณผ : 2
๐ 15์ ๊ฐ์ง Node(Index Number 1)์ ์ค๋ฅธ์ชฝ ์์ Node Index Number ๊ตฌํ๊ธฐ!
(2 * 2) + 1
# ๊ฒฐ๊ณผ : 5
๐ Heap์ Data ์ฝ์ ๊ตฌํ (Max Heap ์์)
๐ Heap Class ๊ตฌํ
class Heap:
def __init__(self, data): # ์์ฑ์ ์์ฑ (data๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋๋ค.)
self.heap_array = list() # heap_array๋ฅผ ๋ฆฌ์คํธ๋ก ๋ง๋ ๋ค.
# heap_arrary์ ์ต์ด 0๋ฒ ์ธ๋ฑ์ค์ None์ ๋ฃ๋๋ค. (1๋ฒ ์ธ๋ฑ์ค๋ถํฐ ์ฌ์ฉํ๊ธฐ ์ํจ)
self.heap_array.append(None)
# 1๋ฒ ์ธ๋ฑ์ค๋ถํฐ data๊ฐ ๋ค์ด์ค๊ฒ ํ๋ค.
self.heap_array.append(data)
heap = Heap(1)
print(heap.heap_arrary)
# ๊ฒฐ๊ณผ : [None, 1]
๐ Insert Method ๊ตฌํ
์ธ๋ฑ์ค ๋ฒํธ๋ 1๋ถํฐ ์์ํ๋๋ก ํ ๊ฒ์ด๊ณ , ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ์๋ํ๋๋ก ๊ตฌํ ํด ๋ณด๊ฒ ์ต๋๋ค!
class Heap:
def __init__(self, data): # ์์ฑ์ ์์ฑ (data๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋๋ค.)
self.heap_array = list() # heap_array๋ฅผ ๋ฆฌ์คํธ๋ก ๋ง๋ ๋ค.
# heap_arrary์ ์ต์ด 0๋ฒ ์ธ๋ฑ์ค์ None์ ๋ฃ๋๋ค. (1๋ฒ ์ธ๋ฑ์ค๋ถํฐ ์ฌ์ฉํ๊ธฐ ์ํจ)
self.heap_array.append(None)
# 1๋ฒ ์ธ๋ฑ์ค๋ถํฐ data๊ฐ ๋ค์ด์ค๊ฒ ํ๋ค.
self.heap_array.append(data)
def insert(self, data): # ๋ฐฐ์ด์ Data๋ฅผ ์
๋ ฅํ๊ธฐ ์ํ Method
if len(self.heap_array) == 0: # ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ 0์ด๋ผ๋ฉด? ์ฆ, ๋ฐฐ์ด์ Data๊ฐ ๋ค์ด์์ง ์๋ค๋ฉด?
self.heap_array.append(None) # ์ด๊ธฐํ๋ฅผ ์ํด 0๋ฒ ์ธ๋ฑ์ค์ None์ ๋ฃ์ด์ค๋ค.
self.heap_array.append(data) # ๊ทธ๋ฐ๋ค 1๋ฒ ์ธ๋ฑ์ค์ Data๊ฐ ๋ค์ด์ค๋๋ก ํ๋ค.
return True # ์ฐธ์ ๋ฐํํด์ค๋ค.
# ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ 0์ด ์๋๋ผ๋ฉด? ์
๋ ฅ๋ Data๋ฅผ ๋ฐฐ์ด์ ๋ง์ง๋ง ์ธ๋ฑ์ค ๋ฒํธ์ ์
๋ ฅํด ์ค๋ค.
self.heap_array.append(data)
return True # ์ฐธ์ ๋ฐํํด์ค๋ค.
์ฝ์ ํ Node๊ฐ ์์ ์ ๋ถ๋ชจ Node๋ณด๋ค ๊ฐ์ง ๊ฐ์ด ํฌ๋ค๋ฉด ๋ถ๋ชจ Node์ ์ฝ์ ํ Node์ ์์น๋ฅผ ๋ฐ๊ฟ์ผ ํ๋ ๊ฒ์ด์์.
์ฝ์ ํ Node๊ฐ Root Node๊ฐ ๋๊ฑฐ๋, ๋ถ๋ชจ Node๋ณด๋ค ๊ฐ์ด ์๊ฑฐ๋ ๊ฐ์ ๋๊น์ง ๋น๋น๋น~ ๋ฐ๋ณต์ ํ๋ต๋๋ค!
๐ ํน์ Node์ ๊ด๋ จ Node์ ์์น ์์๋ด๊ธฐ!
- ๋ถ๋ชจ ๋
ธ๋ ์ธ๋ฑ์ค ๋ฒํธ (parent node's index) = ์์ ๋
ธ๋ ์ธ๋ฑ์ค ๋ฒํธ (child node's index) // 2
(๋๋๊ธฐ 2) - ์ผ์ชฝ ์์ ๋ ธ๋ ์ธ๋ฑ์ค ๋ฒํธ (left child node's index) = ๋ถ๋ชจ ๋ ธ๋ ์ธ๋ฑ์ค ๋ฒํธ (parent node's index) * 2
- ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋ ์ธ๋ฑ์ค ๋ฒํธ (right child node's index) = (๋ถ๋ชจ ๋ ธ๋ ์ธ๋ฑ์ค ๋ฒํธ (parent node's index) * 2) + 1
heap = Heap(15) # ์ต์ด heap์ Heap๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋งค๊ฐ๋ณ์๋ก 15๋ฅผ ๋ฃ์ด์ค๋ค.
heap.insert(10) # heap๊ฐ์ฒด์ insert Method์ 10์ ๋ฃ์ด์ค๋ค.
heap.insert(8) # heap๊ฐ์ฒด์ insert Method์ 8์ ๋ฃ์ด์ค๋ค.
heap.insert(5) # heap๊ฐ์ฒด์ insert Method์ 5์ ๋ฃ์ด์ค๋ค.
heap.insert(4) # heap๊ฐ์ฒด์ insert Method์ 4์ ๋ฃ์ด์ค๋ค.
heap.insert(20) # heap๊ฐ์ฒด์ insert Method์ 20์ ๋ฃ์ด์ค๋ค.
# List์ ๋ค์ด์๋ ๊ฐ๋ค์ ์ถ๋ ฅํด ๋ณธ๋ค.
print("heap ๋ฐฐ์ด์ ์
๋ ฅ๋ ๊ฐ์ \"" + str(heap.heap_array) + "\" ์
๋๋ค.\n")
print("=" * 100 + "\n")
# ๊ฒฐ๊ณผ : [None, 20 , 10, 15, 5, 4, 8]
์ฃผ๋ํ๋์ ๊ธ์ด ๋ง์์ ๋์ จ๋์? ๊ตฌ๋ ๊ณผ ๊ณต๊ฐ! ๊ทธ๋ฆฌ๊ณ , ๋๊ธ์ ์ฃผ๋ํ๋์๊ฒ ๋ง์ ํ์ด ๋ฉ๋๋ค
'์ฝ๋ฉ ํ ์คํธ ์ค๋น > ์๋ฃ๊ตฌ์กฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๋ฃ๊ตฌ์กฐ] Heap (2) (0) | 2021.09.06 |
---|---|
[์๋ฃ๊ตฌ์กฐ] Tree ๊ตฌ์กฐ(1) (0) | 2021.08.29 |
[์๋ฃ๊ตฌ์กฐ] Tree ๊ตฌ์กฐ(2) (0) | 2021.08.29 |
[์๋ฃ๊ตฌ์กฐ] 05. Hash Table (0) | 2021.08.27 |
[์๋ฃ๊ตฌ์กฐ] 04. Linked List (0) | 2021.08.15 |