7. ๋ถํ ์ ๋ณต
7.1 ๋์
๋ถํ ์ ๋ณต( Divide & Conquer)์ ๊ฐ์ฅ ์ ๋ช ํ ์๊ณ ๋ฆฌ์ฆ ๋์์ธ ํจ๋ฌ๋ค์์ผ๋ก, ๊ฐ๊ฐ ๊ฒฉํ๋ผ๊ณ ์ค๋ช ํ ์ ์์
์ฃผ์ด์ง ๋ฌธ์ ๋ฅผ ๋ ์ด์์ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋๋ ํ, ์ฌ๊ท ํธ์ถ์ ์ด์ฉํด ๊ฐ๊ฐ์ ๋ต์ ๊ณ์ฐํ๊ณ , ๋ถ๋ถ ๋ฌธ์ ์ ๋ต์ ์ด์ฉํด ์ ์ฒด์ ๋ต์ ๊ณ์ฐํ๋ ๋ฐฉ์
์๊ณ ๋ฆฌ์ฆ ๊ตฌ์ฑ
-
divide
๋ฌธ์ ๋ฅผ ๋ ์์ ๋ฌธ์ ๋ก ๋ถํ
-
merge
๊ฐ ๋ฌธ์ ์ ๋ต์ ์ ์ฒด ๋ฌธ์ ์ ๋ต์ผ๋ก ๋ณํฉ
-
base case
๋์ด์ ๋ต์ ๋ถํ ํ์ง ์๊ณ ํ ์ ์๋ ๋งค์ฐ ์์ ๋ฌธ์
์ ์ฉ๊ฐ๋ฅํ ๋ฌธ์ ์ ํน์ฑ
- ๋ฌธ์ ๋ฅผ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋๋๋ ์์ฐ์ค๋ฌ์ด ๋ฐฉ๋ฒ์ด ์กด์ฌํด์ผํจ
- ๋ถ๋ถ ๋ฌธ์ ์ ๋ต์ ์กฐํฉํด ์ ์ฒด ๋ฌธ์ ์ ๋ต์ ๊ณ์ฐํ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด ์์ด์ผํจ
์ฅ์
๋๋ถ๋ถ์ ๊ฒฝ์ฐ์์ ์์ ์ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํด์ค
์์ : ์์ด์ ๋น ๋ฅธ ํฉ๊ณผ ํ๋ ฌ์ ๋น ๋ฅธ ์ ๊ณฑ
1์์ n๊น์ง์ ํฉ์ ๊ณ์ฐ
-
์ฌ๊ทํจ์๋ฅผ ์ด์ฉ
def Sum(num): if num == 1: return 1 return num+Sum(num-1)
-
๋ถํ ์ ๋ณต ์ด์ฉ
1~n์ ํฉ์ 1~2/n์ ํฉ์๋ค๊ฐ 2/n~n์ ํฉ์ ๋ํ ๊ฒ๊ณผ ๊ฐ์
2/n~n์ ํฉ์ 1~2/n์ ํฉ + 2/n*2/n ์ด๋ฏ๋ก ํ๋ฒ์ ์ฌ๊ท๋ก ๋ํ๋ผ ์ ์์
def Sum(num): if num == 1: # ์ง์์ผ ๋ 2/n ํ๋ค๋ณด๋ฉด ๋๋ฌ return 1 if num%2 == 1 : # ํ์์ผ ๋๋ return Sum(n-1)+n return Sum(2/n)+(2/n)*(2/n)
๋ฌด์์ด ๋ ๋์๊น?
์ฌ๊ท๋ n๋ฒ์ ํจ์ ํธ์ถ์ด ํ์
๋ถํ ์ ๋ณต์ 2/n๋ณด๋ค ์ฝ๊ฐ ํฐ ์์ ํจ์ ํธ์ถ ์์
๋ถํ ์ ๋ณต์์ ํ๋ฆ์ ๊ธ๋ก ๋ํ๋ด๋ณด๋ฉด
- ํ์์ธ ๊ฒฝ์ฐ์๋ ํ์ฌ ์+ ์ฌ๊ท(ํ์ฌ ์์์ 1์ ๋บ ์ง์)
- ์ง์์ธ ๊ฒฝ์ฐ์๋ ์ฌ๊ท(ํ์ฌ ์๋ฅผ 2๋ก ๋๋ ์ง์)+์์
์ด๋ฏ๋ก ์ฌ๊ท๋ก ๋์ด๊ฐ๋ n์ ๊ฐ๊ฐ
- 1์ ๋บ๋ค.
- 2๋ก ๋๋๋ค.
์ด๋ค.
์ด๋ฅผ 2์ง์๋ก ํํํด๋ณด๋ฉด, ์ด๋ค ์ N์ ์ด์ง์ ํํ ๋์๋ฆฌ๊ฐ 1์ธ ๊ฒฝ์ฐ๋ ํ์์ด๋ฏ๋ก ๋์๋ฆฌ๋ฅผ 0์ผ๋ก ๋ฐ๊พธ๊ฒ ๋ง๋ค๊ณ 0์ธ ๊ฒฝ์ฐ๋ ์ง์์ด๋ฏ๋ก ๋์๋ฆฌ ํ๋๋ฅผ ์ง์ฐ๋ ๊ฒ์ด ์ฌ๊ท๋ก ๋๊ธฐ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด์ ๋ํด ํ์ฌ ์์ ์์๊ฐ ๊ฐ๊ฐ ๋ถ์ง๋ง ํจ์๊ฐ ๋ช ๋ฒ ์คํ๋ ์ง๋ง ๋ฐ์ง๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๊ตฌํ ์ ์๋ค.
2์ง์๋ก ํํํ์ ๋ ์๋ฆฌ ์ + ์ฒซ ์๋ฆฌ๋ฅผ ์ ์ธํ๊ณ ๋ํ๋๋ 1์ ๊ฐ์
๊ฐ ํจ์์ ์ด ํธ์ถ ํ์์ด๋ค.
๋ ๊ฐ์ ์ํ์ ๋ชจ๋ logn์ด๋ค.
logn = log(2)n
๋ฐ๋ผ์ ์ด ์๊ณ ๋ฆฌ์ฆ์ ์คํ์๊ฐ์ O(logn)์ด๋ค.
ํ๋ ฌ์ ๊ฑฐ๋ญ ์ ๊ณฑ
ํ๋ ฌ์ ๊ฑฐ๋ญ ์ ๊ณฑ์ ๊ทธ๋ฅ ๊ณ์ฐํ๋ ค๊ณ ๊ตฌํํ๋ฉด n*n ํ๋ ฌ์ m์น ๊ฑฐ๋ญ์ ๊ณฑ์ ๊ตฌํ๋๋ฐ์ O(n^3*m)
์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
๋ถํ ์ ๋ณต์ ์ด์ฉํด๋ณด์.
์ ๋ฐ์ผ๋ก ์๋ผ์ A์ m์น์ (A์ m/2์น)*(A์ m/2์น) ์ผ๋ก ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค.
matrix # 2์ฐจ์ ํ๋ ฌ
def pow(matrix, m): # matrix์ m์น์ ๋ฐํํ๋ ํจ์
if m==0 # ๊ธฐ์ ์ฌ๋ก : A์ 0์น
return 1
if m%2==1: # ํ์์ผ ๋
return pow(matrix,m-1)*matrix
half = pow(matrix,m/2)
return half*half
๋๋์ด ๋จ์ด์ง์ง ์์ ๋์ ๋ถํ ๊ณผ ์๊ฐ ๋ณต์ก๋
m์ด ํ์์ผ ๋ matrix*์ฌ๊ท(m-1) ๋ณด๋ค ์ฌ๊ท(m-1/2)*์ฌ๊ท(m+1/2) ์ด๋ ๊ฒ ๋๋๋ ๊ฒ์ด ๋ ๋ซ์ง ์์๊น?
์ค๋ณตํด์ ๊ณ์ฐ๋๋ ๋ถ๋ถ์ด ์์
๋ถ๋ถ ๋ฌธ์ ๊ฐ ์ค๋ณต๋๋ ๋ฌธ์ ๋ ๊ณ์ ๋ค๋ค์ง ๊ฒ์!
์์ : ๋ณํฉ ์ ๋ ฌ๊ณผ ํต ์ ๋ ฌ
- ๋ณํฉ ์ ๋ ฌ : ์ฃผ์ด์ง ์์ด์ ๊ฐ์ด๋ฐ์์ ์ชผ๊ฐ ์ด๋ค์ ์ฌ๊ท ํธ์ถ์ ์ด์ฉํด ๊ฐ๊ฐ ์ ๋ ฌ
- ํต ์ ๋ ฌ : ์ฃผ์ด์ง ์์ด์ ํํฐ์ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ํ๋์ ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ชฝ ์์ด๋ก ๋๋๋ ๋ฐฉ์์ผ๋ก ์ ๋ ฌ
๋๋ค ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ์ ํจ๋ฌ๋ค์(๋ถํ ์ ๋ณต ํจ๋ฌ๋ค์)์ ์ด์ฉํ ์๊ณ ๋ฆฌ์ฆ์ด์ง๋ง, ์๋ก ๋ค๋ฅด๋ค.
์๊ฐ ๋ณต์ก๋ ๋ถ์
-
๋ณํฉ ์ ๋ ฌ
๋ณํฉ ์ ๋ ฌ์์๋ ๋๋์ด์ง ๋ถ๋ถ ๋ฌธ์ ์์ ํด๋ต์ ๋ฐํํ๋ ๋ฐฉ์์ผ๋ก ์งํ๋๋ค. ํ๋์ ์์๋ฅผ ๊ฐ์ง ์์ด์ผ๋ก ๋ค ๋๋์ด์ง ๋จ๊ณ ์ดํ๋ถํฐ๋ ๋ณํฉ ๋จ๊ณ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ ์์ด์ ๋ชจ๋ ์์๋ฅผ ๊ฑฐ์ณ์ ํฌ๊ธฐ ๋น๊ต ํ ์ฝ์ ํด์ผํ๋๋ฐ, ๋ชจ๋ ์์๋ฅผ ๊ฑฐ์น๋ ๊ณผ์ ์ด n๋ฒ์ผ๋ก ํญ์ ๊ฐ๋ค. ์ฆ, ๊ฐ ๋จ๊ณ(๊ทธ๋ฆผ์์ ํํ๋ ๊ฐ๋ก์ค)๋ ํญ์ ๊ฐ์ ์์์ ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋ฐ๋ผ์ n๊ฐ์ ์์๋ฅผ ํฉ์น๋๋ฐ์๋ logn ๋งํผ์ ๋จ๊ณ์์ n๋งํผ์ ๋ฐ๋ณต๋ฌธ์ ๋๋ฉด์ ์ ๋ ฌํด์ผํ๋ฏ๋ก, ๋ณํฉ ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋๋ O(nlogn)์ด๋ค.
-
ํต ์ ๋ ฌ
ํต ์ ๋ ฌ์ ํํฐ์ ๊ณผ์ ์ ๋ณํฉ ์ ๋ ฌ์ ๋ณํฉ ๊ณผ์ ๊ณผ ๋น์ทํ์ง๋ง, ๋ ์์ด์ด ๋น์ทํ ํฌ๊ธฐ๋ก ๋๋ ์ง๋ค๋ ๋ณด์ฅ์ด ์๊ธฐ ๋๋ฌธ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ณ์ฐํ๊ธฐ ํ๋ค๋ค. ๋ฐ๋ผ์ ์ต์ ์ ์๊ฐ๋ณต์ก๋๊ฐ ๋์ค๋ ์ํฉ์ ๋ณด๋ฉด, ๊ธฐ์ค์ผ๋ก ํ ์๊ฐ ์ต๋๋ ์ต์์ ์์ผ ๋์ด๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ํต์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋๋ O(n^2)์ด๋ค. ํ์ง๋ง ํ๊ท ์ ์ผ๋ก ๊ณ์ฐํ๋ฉด ๋ณํฉ์ ๋ ฌ๊ณผ ๊ฐ์ O(nlogn)์ด ๋๋ค๋ ๊ฒ์ด ์๋ ค์ ธ ์๋ค. ๋ฐ๋ผ์ ํต ์ ๋ ฌ์ ๊ตฌํํ ๋๋ ๊ฐ๋ฅํ ์ ๋ฐ์ ๊ฐ๊น์ด ๋ถํ ์ ์ป๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
์์ : ์นด๋ผ์ธ ๋ฐ์ ๋น ๋ฅธ ๊ณฑ์ ์๊ณ ๋ฆฌ์ฆ
: ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ํ ์
๋ ๊ฐ์ ํฐ ์ ์๋ฅผ ๊ณฑํ๋ ์๊ณ ๋ฆฌ์ฆ
- ๋จ์ ์๊ณ ๋ฆฌ์ฆ
์ด๋ฌํ ์ด๋ฑํ๊ต ๋ ์ผ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋๋ก ๊ตฌํํ์ ๋, ํฐ ์๊ฐ ๋ด๊ฒจ์๋ ๋ฐฐ์ด์ 2์ค for๋ฌธ์ผ๋ก ์ ๊ทผํด์ผํ๋ฏ๋ก O(N^2)์ ๋ณต์ก๋๊ฐ ๋์จ๋ค.
- ์นด๋ผ์ธ ๋ฐ ์๊ณ ๋ฆฌ์ฆ
ํฐ ์๊ฐ 2๊ฐ๋ฅผ ๋ฐ ์ฉ ์๋ฆฌ์๋ฅผ ๋๋์ด์ ํํ
a1 = ์์ 128์๋ฆฌ, a0 = ๋ค์ 128์๋ฆฌ
์ด๋ฐ ํํ ๋ฐฉ์์ผ๋ก a*b๋ฅผ ํํํ๋ฉด
์ด๋ ๊ฒ a0,a1,b0,b1 ๋ค ๊ฐ์ง์ ์กฐ๊ฐ์ผ๋ก ํํํ ์ ์๋๋ฐ ์ด๋๋ ์๊ฐ ๋ณต์ก๋๊ฐ O(N^2)์ผ๋ก ๊ฐ๋ค. ์ด๋ฅผ 3๊ฐ์ง๋ก ๋ญ์ณ์ z0,z1,z2 ์ธ๊ฐ์ง ์กฐ๊ฐ์ผ๋ก ํํํ๋ฉด ์๊ฐ ๋ณต์ก๋์์์ ํจ์จ์ ๋์ผ ์ ์๋ค๋ ๊ฒ์ด๋ค.
z1์ (a0+a1)*(b0+b1)-z0-z2 ๋ก ํํํ๋ค๋ฉด ๊ณฑ์ ์ธ ๊ฐ๋ก ์ธ ์กฐ๊ฐ์ ํํํ ์ ์์ผ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๊ฐ ๋ฎ์์ง๋ค.
์๊ณ ๋ฆฌ์ฆ
- a, b๋ฅผ ๋ฐ๋๋ค. (๋ ํฐ ์๋ฅผ a๋ก ๋๋ค.)
- O(n^2)์ ์ผ๋ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ํด๋ ๊ด์ฐฎ์ ์ ๋ ฅ ๋ฒ์๋ฉด, ๊ธฐ๋ณธ ์๊ณ ๋ฆฌ์ฆ์ ๊ณ์ฐํด์ return ํ๋ค.
- a์ b๋ฅผ ๋ฐ์ผ๋ก ๋๋ ์ a0,a1,b0,b1์ ๋ง๋ ๋ค.
- 3๋ฒ์์์ ๋ค ๊ฐ์ง ๋ณ์๋ก z0,z1,z2๋ฅผ ๋ง๋ ๋ค. (์ฌ๊ท ํจ์ ์ด์ฉ)
- ์ธ ๊ฐ์ง ๋ณ์๋ก ๋ง์ง๋ง ์์ ๋ง๋ค์ด์ return ํ๋ค.
์๊ฐ ๋ณต์ก๋
n = 2^k ์ผ ๋, k๋ฒ ์ฌ๊ท ํธ์ถ ํ๋ฉด์ ๋ง์ง๋ง์ 3๋ฒ์ ๊ณฑ์ ํ์
์ด 3^k๋ฒ์ ๊ณฑ์ ํ์ => 3^(lgn)
O(3^(logn))=O(n^(log3))
log3์ 1.585 ์ ๋์ด๋ฏ๋ก n^2๋ณด๋ค ์ ์ ์๊ฐ๋ณต์ก๋์
*์ฃผ์ : ์ ๋ ฅ์ ํฌ๊ธฐ๊ฐ ์์ ๊ฒฝ์ฐ O(n^2)๋ณด๋ค ๋๋ฆด ์ ์์
Comment