πŸ˜‰/μ½”λ”©ν…ŒμŠ€νŠΈ

[μ•Œκ³ λ¦¬μ¦˜] 뢄할정볡(Divide & Conquer)

ruhz 2020. 7. 28. 17:17

<μ•Œκ³ λ¦¬μ¦˜ λ¬Έμ œν•΄κ²° μ „λž΅>의 ν•΄λ‹Ή 단원 λ°‘μ€„μž…λ‹ˆλ‹€.

"λΆ„ν•  정볡을 μ‚¬μš©ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜λ“€μ€ λŒ€κ°œ μ„Έ κ°€μ§€μ˜ ꡬ성 μš”μ†Œλ₯Ό κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€.

  • 문제λ₯Ό λΉ„μŠ·ν•œ 크기의 더 μž‘μ€ 문제둜 λΆ„ν• ν•˜λŠ” κ³Όμ •(divide)

  • 각 λ¬Έμ œμ— λŒ€ν•΄ κ΅¬ν•œ 닡을 μ›λž˜ λ¬Έμ œμ— λŒ€ν•œ λ‹΅μœΌλ‘œ λ³‘ν•©ν•˜λŠ” κ³Όμ •(merge)

  • 더이상 닡을 λΆ„ν• ν•˜μ§€ μ•Šκ³  κ³§μž₯ ν’€ 수 μžˆλŠ” 맀우 μž‘μ€ 문제(base case)"

 

"같은 λ¬Έμ œλΌλ„ μ–΄λ–»κ²Œ λΆ„ν• ν•˜λŠλƒμ— 따라 μ‹œκ°„ λ³΅μž‘λ„ 차이가 μ»€μ§„λ‹€λŠ” 것을 λ³΄μ—¬μ£ΌλŠ” 쒋은 μ˜ˆμž…λ‹ˆλ‹€. μ—¬λŸ¬λ²ˆ μ€‘λ³΅λ˜μ–΄ κ³„μ‚°λ˜λ©΄μ„œ μ‹œκ°„μ„ μ†Œλͺ¨ν•˜λŠ” λΆ€λΆ„ λ¬Έμ œλ“€μ΄ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€."

​​

 


병합 μ •λ ¬ (Merge Sort)

μˆ˜μ—΄μ„ κ°€μš΄λ°μ—μ„œ μͺΌκ°œ 두 개의 λΆ€λΆ„μˆ˜μ—΄λ‘œ λ§Œλ“€κ³ , 각 λΆ€λΆ„ μˆ˜μ—΄μ— λŒ€ν•΄μ„œλ„ 같은 절차λ₯Ό μž¬κ·€ ν˜ΈμΆœν•œλ‹€. κΈ°μ € 사둀(base case)κΉŒμ§€ μͺΌκ°œ 값이 λ°˜ν™˜λ˜λ©΄, λŒ€μ†Œλ₯Ό λΉ„κ΅ν•˜μ—¬ λ³‘ν•©ν•˜λ©° μˆ˜μ—΄μ„ μ •λ ¬ν•˜κ²Œ λœλ‹€.

​

 

 

퀡 μ •λ ¬ (Merge Sort)

피봇(Pivot, κΈ°μ€€)을 μ •ν•˜κ³ , 피봇과 λŒ€μ†Œλ₯Ό 비ꡐ해
μˆ˜μ—΄μ„ [Pivot보닀 μž‘μ€ μˆ˜λ“€] [Pivot] [Pivot보닀 큰 μˆ˜λ“€]의 꼴둜 λ§Œλ“ λ‹€.
이 λ•Œ, ν”Όλ΄‡μ˜ μœ„μΉ˜λŠ” μ •λ ¬ ν›„μ˜ ν”Όλ΄‡μ˜ μœ„μΉ˜μ™€ μΌμΉ˜ν•˜λ―€λ‘œ [Pivot]을 μ œμ™Έν•˜κ³  μ•ž λ’€ λ¬ΆμŒμ— λŒ€ν•΄μ„œ 같은 절차λ₯Ό 각각 μž¬κ·€ν˜ΈμΆœ ν•œλ‹€.

 

​

​

​

μΉ΄λΌμΈ λ°”μ˜ λΉ λ₯Έ κ³±μ…ˆ (Karatsuba)

$$a\left(256자리\ μžμ—°μˆ˜\right)\times b\left(256자리\ μžμ—°μˆ˜\right)\ =\ ?$$

$$a\ =a_1\left(a의\ 첫\ 128자리\right)\times 10^{128}+a_0\left(a의\ κ·Έ\ λ‹€μŒ\ 128자리\right)​$$

$$b\ =b_1\left(b의\ 첫\ 128자리\right)\times 10^{128}+b_0\left(b의\ κ·Έ\ λ‹€μŒ\ 128자리\right)​$$

$$\to \ a\times b=\left(a_1\times b_1\right)\times 10^{256}+\left(a_1\times b_0\ +\ a_0\times b_1\right)\ +\ \left(a_0\times b_0\right)​$$

 

a × bλŠ” 절반 크기의 4번의 κ³±μ…ˆμœΌλ‘œ λΆ„ν• (divide)ν•  μˆ˜μžˆμŒμ„ μ•Œ 수 μžˆλ‹€.
그리고 λ‹€μŒκ³Ό 같이 κ³„μ‚°ν•˜λ©΄ 4번의 κ³±μ…ˆμ„ 3번의 κ³±μ…ˆμœΌλ‘œ 쀄일 μˆ˜κ°€ μžˆλ‹€.

 

$$z_0=\left(a_0\times b_0\right)$$

$$z_1=\left(a_1\times b_0\ +\ a_0\times b_1\right)\ ​$$

$$z_2=\left(a_1\times b_1\right)$$

$$β€»\ \left(a_1+b_0\ \right)\times \left(\ a_0+b_1\right)\ =$$

$$\left(a_1\times b_1\right)+\left(a_1\times b_0\ +\ a_0\times b_1\right)\ +\ \left(a_0\times b_0\right)$$

$$\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =z_0+z_1+z_2​​$$

 

μ•„λž˜ μ„Έ 개의 λ³€μˆ˜λ₯Ό 적절히 μ—°μ‚°(λ”ν•˜κΈ°, μ‹œν”„νŠΈ)ν•˜μ—¬ κ΅¬ν•œλ‹€.

 

z2 = a1 * b1;

z0 = a0 * b0;

z1 = (a0 + a1) * (b0 + b1) - z0 - z2;

​