2021. 1. 9. 00:07ใ๐ Algorithm/๐ Python ๋ฌธ๋ฒ
ํ์ด์ฌ์์์ Heap ?!
Python์์์ Heap์ heapq ๋ชจ๋๊ณผ Queue ๋ชจ๋์ PriorityQueue ํด๋์ค๋ฅผ ํตํด heapq๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋จ, MinHeap์ผ๋ก ๊ตฌํ๋์ด์์ด ๊ฐ์ฅ ์์ ์๋ ์์๊ฐ ๊ฐ์ฅ ์์ ์์๊ฐ ๋ฉ๋๋ค.
heapq ์ PriorityQueue ์ ๊ณตํต์ ๊ณผ ์ฐจ์ด์
๊ณตํต์ ์ ๋๋ค MinHeap์ผ๋ก ๊ตฌํ๋์ด ์๋ค๋ ์ ์ ๋๋ค. ์ฆ ๊ฐ์ฅ ์์ ์๋ ์์๊ฐ ๊ฐ์ฅ ์์ ์์ ์ ๋๋ค.
์ฐจ์ด์ ์ PriorityQueue๋ ํด๋์ค์ด๊ณ , heapq๋ ๋ชจ๋์ด๋ผ๋ ์ ์ ๋๋ค.
ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ผ๋ ค๋ฉด !?
PriorityQueue๋ ๊ฐ์ฒด๋ฅผ ์์ฑ ํ ๋ฉ์๋๋ฅผ ํธ์ถํด์ผํ๋ค.
heapq๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ heapify(๋ฆฌ์คํธ ๊ฐ์ฒด)์ฒ๋ผ ํจ์๋ฅผ ํธ์ถํ์ฌ ์ฌ์ฉํ๋ค.
Heap์ ์ธ์ ์ฌ์ฉํ๋ฉด ์ข์๊น?!
1. ๋ฐ์ดํฐ๊ฐ ์ง์์ ์ผ๋ก ์ ๋ ฌ์ด ๋์ด์ผ ํ ๋
2. ๋ฐ์ดํฐ์ ์ฝ์ / ์ญ์ ๊ฐ ๋น๋ฒํ ์ผ์ด๋ ๋
Heap์ ์๊ฐ ๋ณต์ก๋
Operation | Time Complexity - Worst Case |
Get Item | O(1) |
Insert Item | O(logn) |
Delete Item | O(logn) |
Search Item | O(n) |
heapq - heapify
heapq ๋ชจ๋์ heapify ํจ์๋ ์ฃผ์ด์ง ๋ฆฌ์คํธ๋ฅผ ํ ์ ๋ ฌํ ๋ ์ฌ์ฉํฉ๋๋ค. ์ด๋์ Time Complexity๋ O(nlogn)์ ๋๋ค.
import heapq
my_list = [3, 2, 1, 5, 7]
heapq.heapify(my_list) #[1,2,3,5,7]
heapq - heappop(heap)
heapq ๋ชจ๋์์์ heappop ํจ์๋ ํ ์ ๋ ฌ๋ ๋ฆฌ์คํธ์์ ์๋์ ๊ฐ์ ์ญํ ์ ํฉ๋๋ค.
1. ๊ฐ์ฅ ์์ ์์๋ฅผ ๋นผ๋ธ๋ค.
2. ๋๋จธ์ง ์์๊ฐ ํ์ ์ ์งํ๋๋ก ์ ๋ ฌํ๋ค.
โ๏ธ๋ฆฌ์คํธ๊ฐ ํ ์ ๋ ฌ๋์ด ์์ง ์์ ์ํ์์ heappop ์ฌ์ฉ ์, ์ด์ํ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์์ต๋๋ค!!
import heapq
my_list = [13, 2, 1, 5, 10]
heapq.heapify(my_list)
# ๊ฐ์ฅ ์์ ์์์ธ 1์ด ๋ฆฌํด๋ฉ๋๋ค. my_list์ ๊ธธ์ด๊ฐ ํ๋ ์ค์ด๋ญ๋๋ค.
ret_val = heapq.heappop(my_list)
print("๋ฆฌํด๋ ๊ฐ:", ret_val) # 1
print("๋จ์ ์์:", my_list) # [2,5,13,10]
heapq - heappush(heap, item)
heapq ๋ชจ๋์์์ heappush ํจ์๋ ๋ฆฌ์คํธ์ ํ ์ํ๋ฅผ ์ ์งํ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์์ผ ์ค๋๋ค.
โ๏ธ๋ฆฌ์คํธ๊ฐ ํ ์ ๋ ฌ๋์ด ์์ง ์์ ์ํ์์ heappush ์ฌ์ฉ ์, ์ด์ํ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์์ต๋๋ค!!
import heapq
my_list = [13, 2, 1, 5, 10]
heapq.heapify(my_list)
# 7 ์ฝ์
heapq.heappush(my_list, 7)
# ๊ธฐ์กด์ ๊ฐ์ฅ ์์๋ ์์๊ฐ ๊ณ์ ์์ ์์น
print("๋จ์ ์์:", my_list)
# ๋จ์ ์์: [1, 2, 7, 5, 10, 13]
heapq - ๊ฐ์ฅ ์์ ์์์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ
heap ๋ฆฌ์คํธ์์ ๊ฐ์ฅ ์์ ์์๋ฅผ ์ญ์ ํ์ง ์๊ณ ๋จ์ํ ์ฝ๊ธฐ๋ง ์ฌ์ฉํ ๋ ๋ฆฌ์คํธ์ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
import heapq
my_list = [13, 2, 1, 5, 10]
heapq.heapify(my_list)
# heappop์ ํ์ง๋ง, ๋งจ ์ ์์๊ฐ ์ต์๊ฐ์์ ๋ณํ์ง ์์
while my_list:
print("๋ฆฌ์คํธ์ ๋งจ ์ ์์:", my_list[0])
heapq.heappop(my_list)
'''
๋ฆฌ์คํธ์ ๋งจ ์ ์์: 1
๋ฆฌ์คํธ์ ๋งจ ์ ์์: 2
๋ฆฌ์คํธ์ ๋งจ ์ ์์: 5
๋ฆฌ์คํธ์ ๋งจ ์ ์์: 10
๋ฆฌ์คํธ์ ๋งจ ์ ์์: 13
'''
+) heapq - ์ต๋ ํ (Max Heap) ๊ตฌํํ๊ธฐ
heapq๋ ์ต์ ํ์ด๋ผ๋ ๊ฒ์ ์ด์ฉํ์ฌ ๋ชจ๋ ๊ฐ์ -๋ฅผ ๋ถ์ฌ - ์ต๋ ๊ฐ์ด ์ต์ ๊ฐ์ด ๋๋๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
import heapq
nums = [5,1,10,13,2]
heap = []
for num in nums:
heapq.heappush(heap, (-num, num)) # (์ฐ์ ์์, ๊ฐ)
while heap:
print("๋ฆฌ์คํธ์ ๋งจ ์ ์์ :", heapq.heappop(heap)[1]) # index 1
'''
๋ฆฌ์คํธ์ ๋งจ ์ ์์: 13
๋ฆฌ์คํธ์ ๋งจ ์ ์์: 10
๋ฆฌ์คํธ์ ๋งจ ์ ์์: 5
๋ฆฌ์คํธ์ ๋งจ ์ ์์: 2
๋ฆฌ์คํธ์ ๋งจ ์ ์์: 1
'''
+) K๋ฒ์งธ ์ต์๊ฐ / ์ต๋๊ฐ ๊ตฌํ๊ธฐ
Heap์ ์ฌ์ฉํ์ฌ K ๋ฒ์งธ์ ์ต์๊ฐ, ์ต๋๊ฐ์ ํจ์จ์ ์ผ๋ก ๊ตฌํ์ค ์ ์์ต๋๋ค.
import heapq
def kth_smallest(nums, k):
heap = []
for num in nums:
heapq.heappush(heap, num)
kth_min = None
for _ in range(k):
kth_min = heapq.heappop(heap)
return kth_min
print(kth_smallest([4, 1, 7, 3, 8, 5], 3)) # 4
'๐ Algorithm > ๐ Python ๋ฌธ๋ฒ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python ์๋ฃ๊ตฌ์กฐ] Hash(ํด์) (0) | 2021.01.16 |
---|---|
[Python ์๋ฃ๊ตฌ์กฐ] Queue (ํ) ๊ตฌํํ๊ธฐ (0) | 2021.01.06 |
ํ์ด์ฌ์ ํ์ด์ฌ ๋ต๊ฒ (0) | 2020.12.30 |