๊ด€๋ฆฌ ๋ฉ”๋‰ด

yeon's ๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋ถ„ํ•  ์ •๋ณต (Divide & Conquer) ๋ณธ๋ฌธ

Computer ๐Ÿ’ป/์•Œ๊ณ ๋ฆฌ์ฆ˜

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋ถ„ํ•  ์ •๋ณต (Divide & Conquer)

yeon42 2021. 10. 25. 21:00
728x90

๋ถ„ํ•  ์ •๋ณต (Divide & Conquer)

 

: ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ ๋‘˜ ์ด์ƒ์˜ ๋ถ€๋ถ„ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆˆ ๋’ค ๊ฐ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‹ต์„ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์ด์šฉํ•ด ๊ณ„์‚ฐํ•˜๊ณ ,

๊ฐ ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ๋‹ต์œผ๋กœ๋ถ€ํ„ฐ ์ „์ฒด ๋ฌธ์ œ์˜ ๋‹ต์„ ๊ณ„์‚ฐํ•ด ๋ƒ„

 

* ์ผ๋ฐ˜์ ์ธ ์žฌ๊ท€ ํ˜ธ์ถœ๊ณผ ๋‹ค๋ฅธ ์ ์€ ๋ฌธ์ œ๋ฅผ ๊ฑฐ์˜ ๊ฐ™์€ ํฌ๊ธฐ์˜ ๋ถ€๋ถ„ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆˆ๋‹ค๋Š” ๊ฒƒ!

 

 

1. ๋ฌธ์ œ๋ฅผ ๋” ์ž‘์€ ๋ฌธ์ œ๋กœ ๋ถ„ํ• ํ•˜๋Š” ๊ณผ์ • (divide)

2. ๊ฐ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ตฌํ•œ ๋‹ต์„ ์›๋ž˜ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‹ต์œผ๋กœ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ณผ์ • (merge)

3. ๋” ์ด์ƒ ๋‹ต์„ ๋ถ„ํ• ํ•˜์ง€ ์•Š๊ณ  ๊ณง์žฅ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ์ž‘์€ ๋ฌธ์ œ (base case)

 

 

 

* 1๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜: 1 + 2 + ... + n

 

fastSum() = 1 + 2 + ... + n

        = (1 + 2 + ... + n/2) + ((n/2 + 1) + ... + n)

 

(n/2 + 1) + ... + n)

= (n/2 + 1) + (n/2 + 2) + ... + (n/2 + n/2))

= (n/2) * (n/2) + (1 + 2 + ... + n/2)

= (n/2) * (n/2) + fastSum(n/2)

 

fastSum(n) = 2*fastSum(n/2) + (n^2/4) (n์ด ์ง์ˆ˜์ผ ๋•Œ)

 

int fastsum(int n) {
	if (n==1) return 1;
	if (n%2 == 1) return fastSum(n-1) + n;
	return 2*fastsum(n/2) + (n/2)*(n/2);
}

 

 

 

* ํ–‰๋ ฌ์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ์„ ๊ตฌํ•˜๋Š” ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜

class SquareMatrix;
SquareMatrix identity(int n); // ํฌ๊ธฐ๊ฐ€ n*n์ธ ํ•ญ๋“ฑํ–‰๋ ฌ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

// A^m์„ ๋ฐ˜ํ™˜
SquareMatrix pow(const SquareMatrix& A, int m) {
	if (m==0) return identity(A.size());
	if (m%2 > 0) return pow(A, m-1) * A;
	// A^m = (A^(m/2)) * (A^(m/2))
	SquareMatrix half = pow(A, m/2);
    
	return half*half;

 

 

Comments