- Data Structure
- spring ๊ตฌ๊ธ ์์ ๋ก๊ทธ์ธ
- SSL
- Spring
- ํจ์คํธ์บ ํผ์คX์ผ๋์
- Rp2๊ธฐ
- Quick Sort
- ์์คํ ์ํํธ์จ์ด
- RP 2๊ธฐ
- C++
- docker
- Unity
- DATABASE
- GIT
- OpenAPI
- Java
- MethodArgumentNotValidException
- node js
- spring์ผ๋ก https ์ ์ฉ
- ๋ฆฌ๋ ์ค ๋ช ๋ น์ด
- @CreatedDate
- MAKE US
- datagrip
- mysql
- SQL
- spring ์์ ๋ก๊ทธ์ธ
- ๊ตฌ๊ธ ์์ ๋ก๊ทธ์ธ
- java error
- aligoapi
- merge sort
YS's develop story
Heap (ํ) ์ ๋ฆฌ ๋ณธ๋ฌธ
๐จ๐ผ๐ป Heap (ํ) ์ ๋ฆฌ With Python
๐ฅ Heap ์ด๋?
๋ฐ์ดํฐ์์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ๊ธฐ ์ํด ๊ณ ์๋ ์์ ์ด์งํธ๋ฆฌ(Complete Binary Tree)์ ๋๋ค.
์์ ์ด์งํธ๋ฆฌ?
- Node๋ฅผ ์ฝ์ ํ ๋ ์ตํ๋จ ์ผ์ชฝ Node๋ถํฐ ์ฐจ๋ก๋๋ก ์ฝ์ ํ๋ Tree
๋ฐฐ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ , ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ์ฐพ์ผ๋ ค๋ฉด O(n) ์ด ๊ฑธ๋ฆฌ์ง๋ง
ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ , ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ์ฐพ์ผ๋ฉด O(logn) ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์
์ต๋๊ฐ, ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ์์ผ ํ๋ ์๋ฃ๊ตฌ์กฐ ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉ๋ฉ๋๋ค.
ํ์ ์๋์ ๋ ๊ฐ์ง ์กฐ๊ฑด์ ๊ฐ์ง๊ณ ์์ด์ผ ํฉ๋๋ค.
- ๊ฐ ๋ ธ๋์ ๊ฐ์ ํด๋น ๋ ธ๋์ ์์ ๋ ธ๋๊ฐ ๊ฐ์ง ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ต๋๋ค.
- ์์ ์ด์งํธ๋ฆฌ ํํ๋ฅผ ๊ฐ์ง๋๋ค.
๐ Heap VS Binary Search Tree
๊ณตํต์
- ํ๊ณผ ์ด์ง ํ์ ํธ๋ฆฌ๋ ๋ชจ๋ ์ด์งํธ๋ฆฌ์ ๋๋ค.
์ฐจ์ด์
- ํ์ ๊ฐ ๋ ธ๋์ ๊ฐ์ด ์์ ๋ ธ๋๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ต๋๋ค.
- ์ด์ง ํ์ ํธ๋ฆฌ๋ ์ผ์ชฝ ์์ ๋ ธ๋์ ๊ฐ์ด ๊ฐ์ฅ ์๊ณ , ๊ทธ๋ค์ ๋ถ๋ชจ ๋ ธ๋, ๊ทธ๋ค์ ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋ ๊ฐ์ด ๊ฐ์ฅ ํฝ๋๋ค.
- ํ์ ์ด์ง ํ์ ํธ๋ฆฌ์ ์กฐ๊ฑด์ธ ์์ ๋ ธ๋์์ ์์ ๊ฐ์ ์ผ์ชฝ, ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ์ด๋ผ๋ ์กฐ๊ฑด์ด ์์ต๋๋ค.
- ํ์ ์ผ์ชฝ ๋ฐ ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋์ ๊ฐ์ ์ค๋ฅธ์ชฝ์ด ํด ์๋ ์๊ณ , ์ผ์ชฝ์ด ํด ์๋ ์์ต๋๋ค.
- ์ด์ง ํ์ ํธ๋ฆฌ๋ ํ์์ ์ํ ๊ตฌ์กฐ, ํ์ ์ต๋/์ต์๊ฐ ๊ฒ์์ ์ํ ๊ตฌ์กฐ์ ๋๋ค.
๐ Heap์ ๋ฐ์ดํฐ ๋ฃ๊ธฐ
Heap์ ์์ ์ด์งํธ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ์ฝ์ ํ Node๋ ์ผ์ชฝ ์ตํ๋จ Node๋ถํฐ ์ฑ์์ง๋๋ค.
์ฑ์์ง ๋ ธ๋ ์์น์์, ๋ถ๋ชจ ๋ ธ๋๋ณด๋ค ๊ฐ์ด ํด ๊ฒฝ์ฐ, ๋ถ๋ชจ ๋ ธ๋์ ์์น๋ฅผ ๋ฐ๊ฟ์ฃผ๋ ์์ ์ ๋ฐ๋ณตํ๊ฒ ๋ฉ๋๋ค.
๐ Heap์ ๋ฐ์ดํฐ ์ญ์ ํ๊ธฐ
Heap์์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ผ ๊ฒฝ์ฐ ์ต์๋จ Node๋ฅผ ๊บผ๋ด๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
(Heap์ ๋ชฉ์ ์ธ ์ต์๊ฐ, ์ต๋๊ฐ์ ์์๋ด๊ธฐ ์ํด์...)
์ต์๋จ Node๋ฅผ ์ญ์ ์,
๋งจ ๋ง์ง๋ง์ ์ ๋ ฅ๋ Node๊ฐ ์ต์๋จ Node๋ก ์ด๋ํ์ฌ ์ฌ๋ฐ๋ฅธ ์์น๋ฅผ ์ฐพ์ ๋๊น์ง
Node์ ์์น๋ฅผ ๋ฐ๊ฟ์ฃผ๊ฒ ๋ฉ๋๋ค.
๐ Heap ๊ตฌํ With Python
ํ ๊ตฌํ ์ ๋ฐฐ์ด ์๋ฃ๊ตฌ์กฐ๋ฅผ ํ์ฉํฉ๋๋ค.
๊ท์น์ ํตํด์ heap์ ๋ฐฐ์ด๋ก ์ ์ฅํ ์ ์์ต๋๋ค.
- ๋ถ๋ชจ ๋ ธ๋ ์ธ๋ฑ์ค ๋ฒํธ = ์์ ๋ ธ๋ ์ธ๋ฑ์ค ๋ฒํธ // 2
- ์ผ์ชฝ ์์ ๋ ธ๋ ์ธ๋ฑ์ค ๋ฒํธ = ๋ถ๋ชจ ๋ ธ๋ ์ธ๋ฑ์ค ๋ฒํธ * 2
- ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋ ์ธ๋ฑ์ค ๋ฒํธ = ๋ถ๋ชจ ๋ ธ๋ ์ธ๋ฑ์ค ๋ฒํธ * 2 + 1
class Heap:
def __init__(self, data):
self.heap_array = list()
self.heap_array.append(None)
self.heap_array.append(data)
def move_down(self, popped_idx):
left_child_popped_idx = popped_idx * 2
right_child_popped_idx = popped_idx * 2 + 1
# case1: ์ผ์ชฝ ์์ ๋
ธ๋๋ ์์ ๋
if left_child_popped_idx >= len(self.heap_array):
return False
# case2: ์ค๋ฅธ์ชฝ ์์ ๋
ธ๋๋ง ์์ ๋
elif right_child_popped_idx >= len(self.heap_array):
if self.heap_array[popped_idx] < self.heap_array[left_child_popped_idx]:
return True
else:
return False
# case3: ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ์์ ๋
ธ๋ ๋ชจ๋ ์์ ๋
else:
if self.heap_array[left_child_popped_idx] > self.heap_array[right_child_popped_idx]:
if self.heap_array[popped_idx] < self.heap_array[left_child_popped_idx]:
return True
else:
return False
else:
if self.heap_array[popped_idx] < self.heap_array[right_child_popped_idx]:
return True
else:
return False
def pop(self):
if len(self.heap_array) <= 1:
return None
returned_data = self.heap_array[1]
self.heap_array[1] = self.heap_array[-1]
del self.heap_array[-1]
popped_idx = 1
while self.move_down(popped_idx):
left_child_popped_idx = popped_idx * 2
right_child_popped_idx = popped_idx * 2 + 1
# case2: ์ค๋ฅธ์ชฝ ์์ ๋
ธ๋๋ง ์์ ๋
if right_child_popped_idx >= len(self.heap_array):
if self.heap_array[popped_idx] < self.heap_array[left_child_popped_idx]:
self.heap_array[popped_idx], self.heap_array[left_child_popped_idx] = self.heap_array[left_child_popped_idx], self.heap_array[popped_idx]
popped_idx = left_child_popped_idx
# case3: ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ์์ ๋
ธ๋ ๋ชจ๋ ์์ ๋
else:
if self.heap_array[left_child_popped_idx] > self.heap_array[right_child_popped_idx]:
if self.heap_array[popped_idx] < self.heap_array[left_child_popped_idx]:
self.heap_array[popped_idx], self.heap_array[left_child_popped_idx] = self.heap_array[left_child_popped_idx], self.heap_array[popped_idx]
popped_idx = left_child_popped_idx
else:
if self.heap_array[popped_idx] < self.heap_array[right_child_popped_idx]:
self.heap_array[popped_idx], self.heap_array[right_child_popped_idx] = self.heap_array[right_child_popped_idx], self.heap_array[popped_idx]
popped_idx = right_child_popped_idx
return returned_data
def move_up(self, inserted_idx):
if inserted_idx <= 1:
return False
parent_idx = inserted_idx // 2
if self.heap_array[inserted_idx] > self.heap_array[parent_idx]:
return True
else:
return False
def insert(self, data):
if len(self.heap_array) == 1:
self.heap_array.append(data)
return True
self.heap_array.append(data)
inserted_idx = len(self.heap_array) - 1
while self.move_up(inserted_idx):
parent_idx = inserted_idx // 2
self.heap_array[inserted_idx], self.heap_array[parent_idx] = self.heap_array[parent_idx], self.heap_array[inserted_idx]
inserted_idx = parent_idx
return True
๐ฅฅ Heap ์๊ฐ ๋ณต์ก๋
depth๋ฅผ h๋ผ๊ณ ํํํ๋ค๋ฉด, n๊ฐ์ ๋ ธ๋๋ฅผ ๊ฐ์ง๋ heap์ ๋ฐ์ดํฐ ์ฝ์ ๋๋ ์ญ์ ์,
์ต์ ์ ๊ฒฝ์ฐ root๋ ธ๋์์ leaf๋ ธ๋๊น์ง ๋น๊ตํด์ผ ํ๋ฏ๋ก h = log 2n์
์๊ฐ ๋ณต์ก๋๋ ๐(๐๐๐๐)์ด ๋ฉ๋๋ค.
ํ๋ฒ ์คํ์๋ง๋ค 50%์ ์คํํ ์๋ ์๋ ๋ช ๋ น์ ์ ๊ฑฐํ๋ค๋ ์๋ฏธ์ ๋๋ค.
์ฆ 50%์ ์คํ์๊ฐ์ ๋จ์ถ์ํฌ ์ ์์ต๋๋ค.
'Data Structure' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Graph (๊ทธ๋ํ) ์ ๋ฆฌ (0) | 2021.07.29 |
---|---|
Tree (ํธ๋ฆฌ) ์ ๋ฆฌ (0) | 2021.07.27 |
Hash Table (ํด์ ํ ์ด๋ธ) ์ ๋ฆฌ (0) | 2021.07.23 |
Linked List (๋งํฌ๋ ๋ฆฌ์คํธ) ์ ๋ฆฌ (0) | 2021.07.23 |
Stack (์คํ) ์ ๋ฆฌ (0) | 2021.07.22 |