์๋ฃ๊ตฌ์กฐ/๐์๊ณ ๋ฆฌ์ฆ - 13
ํ์ต๊ธฐ๋ก
์ค๋ ๋ค์ ๊ฐ์ ๋ชฉ๋ก
- ๋์ ๊ณํ๋ฒ๊ณผ ๋ถํ
- ํต ์ ๋ ฌ
๋์ ๊ณํ๋ฒ(DP, Dynamic Programming)
ํ๋์ ํฐ ๋ฌธ์ ๋ฅผ ๋ถ๋ถ๋ฌธ์ ๋ก ๋๋์ด์ ๋ถ๋ถ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ,
๋ถ๋ถ๋ฌธ์ ์ ํด๋ฅผ ์ด์ฉํด์ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ์.
์ํฅ์ ์ ๊ทผ๋ฒ(Top-Down)
fibo(5)๋ฅผ ๊ตฌํ ๋,
fibo[0] -> fibo[1] -> fibo[2] -> fibo[3] -> fibo[4] -> fibo[5] ์ด๋ฐ ์์๋ก ๊ตฌํ๋ค.
๋ฐ๋ผ์, ์๋์ ์ ์๋ฅผ ํฅํ ํํ๋ฅผ ๋์ด์ ์ํฅ์ ์ ๊ทผ๋ฒ์ด๋ผ๊ณ ํ๋ค.
๋๋ถ๋ถ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํ๋๋ค.
๋ฉ๋ชจ์ด์ ์ด์ (Memoization)
์ด์ ์ ๊ณ์ฐํ ๊ฐ์ ์ ์ฅํ์ฌ, ๊ฐ์ ๋ฌธ์ ์ ๋ํด ๋ค์ ๊ณ์ฐํ์ง ์๋๋ก ํ๋ ๋ฐฉ๋ฒ
๋ถํ ์ ๋ณต(Divide and Conquer)
๋ฌธ์ ๋ฅผ ๋๋ ์ ์์ ๋๊น์ง ๋๋์ด์ ํด๊ฒฐํ๊ณ , ๊ทธ๊ฒ๋ค์ ๋ค์ ํฉ๋ณํ์ฌ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
ํํฅ์ ์ ๊ทผ๋ฒ(Bottom-Up)
fibo(5)๋ฅผ ๊ตฌํ ๋
fibo(5) -> fibo(4) -> fibo(3) -> fibo(2) -> fibo(1) -> fibo(0) ์ด๋ฐ ์์๋ก ๊ตฌํ๊ณ
ํ์ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๊ฐ์ ํฉ์ณ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
๋๋ถ๋ถ ์ฌ๊ทํจ์๋ก ๊ตฌํ๋๋ค.
ํผ๋ณด๋์น (๊ธฐ๋ณธ)
callcnt = 0
def fibo(n):
global callcnt
callcnt += 1
if n <= 1:
return n
return fibo(n - 1) + fibo(n - 2)
print(fibo(10), " , ํธ์ถํ์ : ", callcnt)
์ด ์ฝ๋์์ ์ฐ์ฐํ์๋ 177๋ฒ์ด๋ค.
ํผ๋ณด๋์น ์์ด์ ๊ตฌํ๋ ํจ์๋ฅผ DP, ๋ถํ ์ ๋ณต์ผ๋ก ํ์ด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
ํผ๋ณด๋์น (DP)
callcnt = 0
n = 10
memo = [None for i in range(n + 1)]
memo[0] = 0
memo[1] = 1
for i in range(2, n + 1):
callcnt += 1
memo[i] = memo[i - 1] + memo[i - 2]
print(memo[n], " , ํธ์ถํ์ : ", callcnt)
์ด ์ฝ๋์์๋ 9ํ์ ์ฐ์ฐ์ผ๋ก ํด๊ฒฐ๋์๋ค.
ํผ๋ณด๋์น (๋ถํ ์ ๋ณต)
callcnt = 0
memo = []
def fibo(n):
global callcnt
print(n)
callcnt += 1
if memo[n - 1] == None:
memo[n - 1] = fibo(n - 1)
if memo[n - 2] == None:
memo[n - 2] = fibo(n - 2)
return memo[n - 1] + memo[n - 2]
n = 10
memo = [None for i in range(n + 1)]
memo[0] = 0
memo[1] = 1
print(fibo(n), " , ํธ์ถํ์ : ", callcnt)
์ด ์ฝ๋์์๋ 9ํ์ ์ฐ์ฐ์ผ๋ก ํด๊ฒฐ๋์๋ค.
ํผ๋ณด๋์น (๋จ์์ฌ๊ท, DP, ๋ถํ ์ ๋ณต) ๋น๊ต
โโ- | ๋จ์์ฌ๊ท | DP | ๋ถํ ์ ๋ณต |
---|---|---|---|
์ฐ์ฐํ์ | 177 | 9 | 9 |
๋ฉ๋ชจ์ด์ ์ด์ ๊ธฐ๋ฒ์ ์ฌ์ฉํด์ ์ฐ์ฐํ์๊ฐ ํ๊ธฐ์ ์ผ๋ก ์ค์๋ค.
ํต ์ ๋ ฌ(quick sort)
ํผ๋ด(pivot, ๊ธฐ์ค์ )์ ์ ํด์ ๊ธฐ์ค์ ๋ณด๋ค ์์ ๊ฐ์ ์ผ์ชฝ, ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ ๋ ฌํ๋ ๊ฒ์ ๋ฐ๋ณตํด์ ์ ๋ ฌํจ.
- ํผ๋ด์ ์ ํด์ ํผ๋ด๋ณด๋ค ์์ ๊ฐ์ ์ผ์ชฝ, ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ ๋ ฌํ๋ค.
- ์ผ์ชฝ์ผ๋ก ๋๋ ๋ถ๋ถ์์ ํผ๋ด์ ์ ํด์ 1์ ์ํํ๋ค.
- ์ค๋ฅธ์ชฝ์ผ๋ก ๋๋ ๋ถ๋ถ์์ ํผ๋ด์ ์ ํด์ 1์ ์ํํ๋ค.
๊ตฌํ
def qsort(list):
if len(list) <= 1:
return list
pivot = list[0]
ll, rl = [], []
for i in range(1, len(list)):
if list[i] < pivot:
ll.append(list[i])
else:
rl.append(list[i])
return qsort(ll) + [pivot] + qsort(rl)
print(checkSortFunc(qsort))
ํต์ํธ๋ฅผ ๊ตฌํํด๋ดค๋๋ฐ ๊ฐ๋จํ๊ฒ ๋๋ค?
์ ํ์ด์ฌ ๋ฌ๋ค ๋ฌ์~
์๊ฐ๋ณต์ก๋
๊น์ด $log n$ : ๊ฐ ๋จ๊ณ๋ก ๋ด๋ ค๊ฐ๋ ๋๋ก ๋๋๊ธฐ ๋๋ฌธ์($log_2 n$),
๊ฐ ๋จ๊ณ๋น ์ฝ$n$๋ฒ์ ๋น๊ต,
๋ฐ๋ผ์ ํ๊ท ์ ์ธ ์๊ฐ๋ณต์ก๋๋ $O(n log n)$์ด๋ค.
(๋๋ถ๋ถ ์ด๊ฑธ ํต์ํธ์ ์๊ฐ๋ณต์ก๋๋ผ๊ณ ํ๊ณ , ์ต์
์ ๊ฒฝ์ฐ๋ ๊ผญ ์์๋ฌ์ผํ๋ค.)
๋ค๋ง ์ต์
์ ๊ฒฝ์ฐ์๋ $O(n^2)$.
์ต์ ์ ๊ฒฝ์ฐ๋ ์ด๋ฏธ ์ ๋ ฌ๋์ด์๋ ๊ฒฝ์ฐ๋ค.
๋ง์ง๋ง
(TMI : c++ ์๊ณ ๋ฆฌ์ฆ ํค๋ํ์ผ์ sortํจ์๋ quicksort, heapsort, insertionsort(์ฝ์ ์ ๋ ฌ) ์ธ๊ฐ์ง๋ก ๊ตฌํ๋ Introsort๋ก ๊ตฌํ๋์ด์๋ค.)
๋๊ธ๋จ๊ธฐ๊ธฐ