๐Ÿ˜‰/์ฝ”๋”ฉํ…Œ์ŠคํŠธ

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋ถ„ํ• ์ •๋ณต(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;

โ€‹