intro
๐ฏ ์ฐ์ ์์ ํ = '์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฅ ๋จผ์ ์ญ์ ํ๋ ์๋ฃ๊ตฌ์กฐ'
๐ฏ ๋ฐ์ดํฐ๋ฅผ ์ฐ์ ์์์ ๋ฐ๋ผ ์ฒ๋ฆฌํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค์ด ๋ฌผ๊ฑด ๋ฐ์ดํฐ๋ฅผ ์๋ฃ๊ตฌ์กฐ์ ๋ฃ์๋ค๊ฐ ๊ฐ์น๊ฐ ๋์ ๋ฌผ๊ฑด๋ถํฐ ๊บผ๋ด์ ํ์ธํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ฆ ๊ฐ์น๋ผ๋ ์ฐ์ ์์์ ๋ฐ๋ผ ์ฒ๋ฆฌํ ๋ ์ฐ์ ์์ ํ๋ผ๋ ์๋ฃ๊ตฌ์กฐ ์ฌ์ฉ. ์์ ๋ฐฐ์ด ์คํ์ ๊ฒฝ์ฐ ๊ฐ์ฅ ๋์ค์ ์ฝ์ ๋ ๋ฐ์ดํฐ๊ฐ ๋จผ์ ์ถ์ถ๋๊ณ , ํ์ ๊ฒฝ์ฐ ๊ฐ์ฅ ๋จผ์ ์ฝ์ ๋ ๋ฐ์ดํฐ๊ฐ ๋จผ์ ์ถ์ถ๋๋ค. ํ์ง๋ง ์ฐ์ ์์ ํ๋ ์ง์ ์ ํ ์ฐ์ ์์์ ๋ฐ๋ผ ์ถ์ถ๋๋, ์ฆ, ํ๋ผ๋ ์๋ฃ๊ตฌ์กฐ์์ ์ฐ์ ์์๋ผ๋ ์ด๋ค ๊ธฐ์ค์ ์ ํด ์ด์ ์ํด ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ๋ฐฉ์์ด๋ผ ์๊ฐํ๋ฉด ๋๋ค.
๐ฏ ์ฐ์ ์์ ํ๋ ํฌ๊ฒ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํ ๊ฐ๋ฅํ๋ค. โ ๋จ์ํ list๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ๊ณผ โก heap์ ์ด์ฉํ์ฌ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค. heap์ ๊ฒฝ์ฐ, heap์ ์ฌ์ฉํด์, ๋จ์ํ ๋จผ์ ๋ค์ด์ค๊ฑฐ๋ ๋์ค์ ๋ค์ด์จ ์์๊ฐ ์๋, ์ฐ์ ์์๊ฐ ๋์, ์ฆ ์ต๋๊ฐ ๋จผ์ , ์๋๋ฉด ์ต์๊ฐ ๋จผ์ ๋ฝ์ ์ ์๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด ํจ์จ์ ์ธ ์๊ฐ ํจ์จ ๋ด๋ก ์ฐ์ฐ ์งํ์ด ๊ฐ๋ฅํ๋ค.
๐ฏ ์ฐ์ ์์ ํ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ์์ ๋ฐ๋ฅธ ๊ตฌํ ์๊ฐ ๋ณต์ก๋ ๋น๊ต (๋ฐ์ดํฐ ๊ฐ์ N)
์ฐ์ ์์ ํ ๊ตฌํ ๋ฐฉ์ | ์ฝ์ ์๊ฐ | ์ญ์ ์๊ฐ |
Priority Queue list | O(1) | O(N) |
Priority Queue heap | O(logN) | O(logN) |
โ list์ ๊ฒฝ์ฐ ์ฝ์ ์ ๋จ์ํ ๋ค์ชฝ์ ์ฝ์ ํ๋ฉด ๋๋ฏ๋ก O(1)์ด์ง๋ง, ์ญ์ ํ๋ค๋ฉด ์ฐ์ ์์๊ฐ ๋์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์์ผ ํ๋ฏ๋ก O(N)์ ์๊ฐ์ด ๊ฑธ๋ฆผ
โก heap์ ๊ฒฝ์ฐ ์ฝ์ ๊ณผ ์ญ์ ๋ชจ๋ ์ต์ ์ ๊ฒฝ์ฐ์๋ O(logN)์ ๋ณด์ฅํ๋ค. ๋ฐ๋ผ์ heap์ N๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์๋ค๊ฐ ์ฐ์ ์์๋ก ์ต๋๊ฐ ๋จผ์ ๊บผ๋ด๊ฑฐ๋, ์ต์๊ฐ ๋จผ์ ๊บผ๋ด๋ ์์ ์ ๊ณง ์ ๋ ฌ์ ๋ปํ๊ณ , ์ด๋ heap sort๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ, ๋น์ฐํ priority queue ์ญ์ ์๊ฐ ๋ณต์ก๋๋ O(logN)์ด๋ฏ๋ก heap sort time complexity๋ O(NlogN) (์์ ๋ณํฉ์ ๋ ฌ๊ณผ ์๊ฐ๋ณต์ก๋ ๋์ผ)
2. heap ์์ฝ
โ๏ธ heapq python library๋ฅผ ์ฌ์ฉํ์๋ฉด,
→ find max()๋ list์ indexing ์ฌ์ฉ ํ, heapify() ํจ์ ์ฌ์ฉ
(๋๋ heappop()์ ์ฌ์ฉํ๋ฉด ์์์ ์ต์๋จ node๋ฅผ ๋นผ์ฃผ๊ณ , heapify()๊น์ง ์งํ)
→ insertion์ heappush() ์ฌ์ฉ (์์์ max ๋๋ min heap ํ์ฑ)
→ heapsort()๋ ๋ณ๋ ์ ๋ ฌ ํฌ์คํ ์ฐธ์กฐ (heappush()์ heappop()์ ์ฌ๋ฌ ๋ฒ ์ฐ๋ฉด ๋๋ค)
examples
๐จ๐ซ python์์ heapq๋ผ๋ library๋ฅผ ์ง์ํด์ฃผ์ด heap ์ฌ๋ฌ implementation์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
๐จ๐ซ python์ heapq๋ default๋ก min-heap์ ๊ตฌํํ๋ค.
Q. heapsort using min-heap
import sys
import heapq
input=sys.stdin.readline
def heapsort(iterable):
h=[]
res=[]
#๋ชจ๋ ์์๋ฅผ ์ฐจ๋ก๋๋ก heap์ ์ฝ์
for value in iterable:
heapq.heappush(h,value)
#heap์ ์ฝ์
๋ ๋ชจ๋ ์์๋ฅผ ์ฐจ๋ก๋๋ก ๊บผ๋ด์ด ๋ด๊ธฐ
for i in range(len(h)):
res.append(heapq.heappop(h))
return res
n=int(input())
arr=[]
for i in range(n):
arr.append(int(input()))
res=heapsort(arr)
for i in range(n):
print(res[i])
1) heapq์ heappush์ ์ํด min-heap ์์ฑ
2) min-heap์ด๋ฏ๋ก heapq์ heappop์ ์ํด ๊ฐ์ฅ ๋ง์ง๋ง node๊ฐ root node์ ์ค๋ฉด์ root node์ธ ์ต์๊ฐ์ด ์ถ๋ ฅ
3) ์ 2)์ ๊ณผ์ ์ ๊ณ์ ๋ฐ๋ณตํ๋ฉด์ ์ถ๋ ฅ๋๋ ๊ฐ์ ๋์ดํ๋ฉด ์ค๋ฆ์ฐจ์ ์ ๋ ฌ!
→ ์๋ฅผ ์ฐจ๋ก๋๋ก ์ง์ด๋ฃ์ผ๋ฉด, ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋๋ก ์ถ๋ ฅ๋์ด ๋์จ๋ค.
โป python์ ๊ฒฝ์ฐ heapq๋ min-heap ์ต์ ํ์ ๊ตฌํํด์ฃผ๋ library๋ค. ๋ฐ๋ผ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋๋ค โป
Q. heapsort using max-heap
โป max-heap์ python์ ๊ฒฝ์ฐ ์ min-heap ๊ตฌํ ์ฝ๋์ heappush ์ฌ์ฉ์ value์ ์์๋ฅผ ๋ถ์ฌ heap์ ์ง์ด๋ฃ๊ณ , ์ ๋ ฌํ ๋ค, heappop ์ฌ์ฉํ ๋ ๋ค์ ์์๋ฅผ ๋ถ์ด๋ฉด ๋๋ค.
import sys
import heapq
input=sys.stdin.readline
def heapsort(iterable):
h=[]
res=[]
#๋ชจ๋ ์์๋ฅผ ์ฐจ๋ก๋๋ก heap์ ์ฝ์
for value in iterable:
heapq.heappush(h,-value)
#heap์ ์ฝ์
๋ ๋ชจ๋ ์์๋ฅผ ์ฐจ๋ก๋๋ก ๊บผ๋ด์ด ๋ด๊ธฐ
for i in range(len(h)):
res.append(-heapq.heappop(h))
return res
n=int(input())
arr=[]
for i in range(n):
arr.append(int(input()))
res=heapsort(arr)
for i in range(n):
print(res[i])
Q. building a heap - heapify()
→ min-heap(์์ ์ด์ง ํธ๋ฆฌ)์ ์ค์ ๋ก ๋ง๋๋ heapify()๋ O(n)์ ์๊ฐ ๋ณต์ก๋.
import heapq
nums = [9,7,5,3,1]
heapq.heapify(nums)
print(nums) #[1,3,5,9,7]
Q. deletion using heappop() - find the nth smallest
โ ์ ๋ง๋ค์ด์ง heap [1,3,5,9,7]์์
โก ์๋ฅผ ๋ค์ด ์ธ ๋ฒ์งธ ์์ ์์๋ฅผ ์ฐพ๊ณ ์ถ๋ค๋ฉด ์ด ๋ ๋ฒ์ heappop() ์ํํ ๋ค O(1)์ด ๊ฑธ๋ฆฌ๋ nums[0] ์ฐ์ฐ ์ํ
heapq.heappop(nums)
print(nums) #[3,7,5,9]
heapq.heappop(nums)
print(nums) #[5,7,9]
print(nums[0]) #5
#heap์ node ์ถ๋ ฅ
→ ์ธ ๋ฒ์งธ ์์ ์์ 5 ์ถ๋ ฅ!
* ์ถ์ฒ1) ์ด์ฝํ 2021 https://youtu.be/AjFlp951nz0
* ์ถ์ฒ2) heap ์๊ฐ ์ ํฌ๋ธ https://youtu.be/Zl07LUsR6P0
* ์ถ์ฒ3) heap ์ด์ ๋ฆฌ youtube https://youtu.be/TK48r1Dlo4k
* ์ถ์ฒ4) heap wiki https://en.wikipedia.org/wiki/Heap_(data_structure)
* ์คํ์ค๋ฒํ๋ก์ฐ ์ถ์ฒ) https://stackoverflow.com/questions/9755721/how-can-building-a-heap-be-on-time-complexity
'Computer Science > Data Structures' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ณ Binary Tree ๐ณ (1) | 2023.12.19 |
---|---|
๐ Map (0) | 2023.08.03 |
Types of Binary Tree๐ฒ (0) | 2023.01.10 |
hash table / hashing (0) | 2022.11.06 |
๐stack & queue & deque (0) | 2022.09.23 |
๋๊ธ