์ž๋ฃŒ๊ตฌ์กฐ/๐Ÿ‘‰์•Œ๊ณ ๋ฆฌ์ฆ˜ - 13

ํ•™์Šต๊ธฐ๋ก

์˜ค๋Š˜ ๋“ค์€ ๊ฐ•์˜ ๋ชฉ๋ก

  1. ๋™์ ๊ณ„ํš๋ฒ•๊ณผ ๋ถ„ํ• 
  2. ํ€ต ์ •๋ ฌ

๋™์ ๊ณ„ํš๋ฒ•(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)

ํ”ผ๋ณด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. ํ”ผ๋ด‡์„ ์ •ํ•ด์„œ ํ”ผ๋ด‡๋ณด๋‹ค ์ž‘์€ ๊ฐ’์€ ์™ผ์ชฝ, ํฐ ๊ฐ’์€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.
  2. ์™ผ์ชฝ์œผ๋กœ ๋‚˜๋‰œ ๋ถ€๋ถ„์—์„œ ํ”ผ๋ด‡์„ ์ •ํ•ด์„œ 1์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  3. ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋‚˜๋‰œ ๋ถ€๋ถ„์—์„œ ํ”ผ๋ด‡์„ ์ •ํ•ด์„œ 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๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค.)

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ