Algorithm Theory

λ™μ ν”„λ‘œκ·Έλž˜λ°(Dynamic Programming)

Meng's Computer 2020. 12. 14. 23:46

πŸ“’ λ™μ ν”„λ‘œκ·Έλž˜λ°

  • λ™μ ν”„λ‘œλž˜λ°(DP, Dynamic Programming) : μ•Œκ³ λ¦¬μ¦˜ μ„€κ³„μ˜ 일반적 기법 쀑 ν•˜λ‚˜
  • μ–Έλœ» 보기에 λ§Žμ€ μ‹œκ°„( 심지어 μ§€μˆ˜ μ‹œκ°„ )이 μ†Œμš”λ  것 같은 λ¬Έμ œμ— 주둜 μ μš©ν•œλ‹€.
  • 적용의 쑰건은 :

    πŸ‘‰ λΆ€λ¬Έμ œ λ‹¨μˆœμ„±(Simple Subproblems) : λΆ€λ¬Έμ œλ“€μ΄ j,k,l,m λ“±κ³Ό 같은 λͺ‡ 개의 λ³€μˆ˜λ‘œ μ •μ˜ 될 수 μžˆλŠ” 경우
    πŸ‘‰ λΆ€λ¬Έμ œ μ΅œμ μ„±(Optimality Subproblems) : 전체 μ΅œμ μΉ˜κ°€ 졜적의 λΆ€λ¬Έμ œλ“€μ— μ˜ν•΄ μ •μ˜λ  수 μžˆλŠ” 경우
    πŸ‘‰ λΆ€λ¬Έμ œ 쀑볡성(Overlap Subproblems) : λΆ€λ¬Έμ œλ“€μ΄ 독립적이 μ•„λ‹ˆλΌ μƒν˜Έ 겹쳐질 경우 ( 즉, 상ν–₯μ‹μœΌλ‘œ ꡬ좕 )

  • λŒ€ν‘œμ  μ˜ˆμ‹œ

    πŸ‘‰ ν”Όλ³΄λ‚˜μΉ˜ 수(Fibonacci progression)μ—μ„œ N-번째 수 μ°ΎκΈ°
    πŸ‘‰ κ·Έλž˜ν”„μ˜ 이행적폐쇄 κ³„μ‚°ν•˜κΈ°

  • λ™μ ν”„λ‘œκ·Έλž˜λ° vs λΆ„ν• ν†΅μΉ˜λ²•

    곡톡점

    πŸ‘‰ μ•Œκ³ λ¦¬μ¦˜ μ„€κ³„κΈ°λ²•μ˜ 일쒅
    πŸ‘‰ λ¬Έμ œκ³΅κ°„ : 원점-λͺ©ν‘œμ  ꡬ쑰 ( 원점 : 문제의 초기 λ˜λŠ” κΈ°μ΄ˆμ§€μ  / λͺ©ν‘œμ  : μ΅œμ’…ν•΄κ°€ μš”κ΅¬λ˜λŠ” 지점 )

    차이점

    πŸ‘‰ λ¬Έμ œν•΄κ²° 진행 λ°©ν–₯

    λ™μ ν”„λ‘œκ·Έλž˜λ°(단방ν–₯) : 원점 -> λͺ©ν‘œμ 
    λΆ„ν• ν†΅μΉ˜λ²•(μ–‘λ°©ν–₯) : λͺ©ν‘œμ  -> 원점 -> λͺ©ν‘œμ  ( 단, ν•΄λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•œ 연산을 진행, λ°©ν–₯은 원점->λͺ©ν‘œμ  )

    μ„±λŠ₯

    πŸ‘‰ λ™μ ν”„λ‘œκ·Έλž˜λ° : 단방ν–₯ νŠΉμ„±λ•Œλ¬Έμ— μ’…μ’… 효율적
    πŸ‘‰ λΆ„ν• ν†΅μΉ˜λ²• : λΆ„ν•  회수(보톡 2뢄할을 ν•œλ‹€.) , 쀑볡연산 μˆ˜ν–‰ νšŒμˆ˜μ— 따라 닀름
  • 이름은 "동적"ν”„λ‘œκ·Έλž˜λ°μ΄μ§€λ§Œ, μ‹€μ œλ‘œ μš°λ¦¬κ°€ μ•„λŠ” "동적", κ·Έλ•Œκ·Έλ•Œ μ‚¬μš©ν•˜λŠ” 그런 μ˜λ―ΈλŠ” μ•„λ‹ˆλ‹€.
    ν•˜λ‚˜ κ΅¬ν•œ 것은, λ‹€λ₯Ό λ•Œ, μ‚¬μš©ν•˜λŠ” 의미일 뿐이고, μ΄λŸ¬ν•œ κΈ°λ²•μ˜ 이름을 지은 μ‚¬λžŒμ΄ κ·Έλƒ₯ "λ™μ ν”„λ‘œκ·Έλž˜λ°"이라 μž‘λͺ…ν•œ 것 일 뿐이닀. μ˜€ν•΄ν•˜μ§€λ§μž.

πŸ“’  λ™μ ν”„λ‘œκ·Έλž˜λ° μ˜ˆμ‹œ

  • N-번째 ν”Όλ³΄λ‚˜μΉ˜ 수 μ°ΎκΈ° : ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄(Fibonacci Progression)은 i = 0,1에 λŒ€ν•΄ f(i) = 1이며, i >= 2 에 λŒ€ν•΄
    f(i) = f(i-1) + f(i-2)인 μˆ˜μ—΄μ΄λ‹€.
  • 즉, f(0) = 1, f(1) = 1, f(2) = 2, f(3) = 3, f(4) = 5, f(5) = 8, .......
  • f(n), 즉 ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ˜ n-번째 수λ₯Ό μ°ΎκΈ° μœ„ν•΄, μ •μ˜λ‘œλΆ€ν„° 직접 μž¬κ·€μ•Œκ³ λ¦¬μ¦˜ fλ₯Ό μž‘μ„±ν•  μˆ˜λ„ μžˆμ§€λ§Œ,
    λΆˆν–‰νžˆλ„ μ§€μˆ˜μ‹œκ°„(exponential time)에 μˆ˜ν–‰ν•˜λ―€λ‘œ λ„ˆλ¬΄λ‚˜ λΉ„νš¨μœ¨μ μ΄λ‹€ !!
  • 이λ₯Ό, λ™μ ν”„λ‘œκ·Έλž˜λ°μ— κΈ°μ΄ˆν•˜μ—¬ f(n)을 μ°ΎλŠ” λΉ„μž¬κ·€, μ„ ν˜•μ‹œκ°„ μ•Œκ³ λ¦¬μ¦˜μ„ λ‹€μŒ 두 λ²„μ ΌμœΌλ‘œ μž‘μ„±ν•΄λ³΄μž.

    πŸ‘‰ 1. μ„ ν˜•κ³΅κ°„μœΌλ‘œ μˆ˜ν–‰ν•˜λŠ” 버젼
    πŸ‘‰ 2. μƒμˆ˜κ³΅κ°„μœΌλ‘œ μˆ˜ν–‰ν•˜λŠ” 버젼
Alg f(n)		// μ„ ν˜• 곡간

if(n == 0 || n == 1)
    return 1

A[0] <- 1
A[1] <- 1
for i <- 2 to n
    A[i] <- A[i-1] + A[i-2]

return A[n]

=============================

Alg f(n)		// μƒμˆ˜ 곡간

if(n == 0 || n == 1)
    return 1

a <- 1
b <- 1
for i <- 2 to n
    c <- a + b
    a <- b
    b <- c

return c

 

728x90
λ°˜μ‘ν˜•