공부했던 자료 정리하는 용도입니다.

재배포, 수정하지 마세요.

 

 


팩토리얼(거듭제곱 값) 계산

  반복적인 방법이 순환적인 방법에 비하여 속도가 더 빠르다.

 


 

1. 반복문을 사용하는 방법

double power_1(double x, int n)
{
	int i;
	double result = 1.0;
	
	for (i = 0; i < n ; i++)
		result *= x;
	return (result);
}

한 번의 루프마다 한 번의 곱셈이 일어나므로 시간 복잡도는 $O(n)$이 된다.

 

 

 

2. 순환을 사용하는 방법

double power_2(double x, int n)
{
	if (n == 0)
		return 1;
	else if ((n % 2) == 0)	// n이 짝수인 경우
		return power_2((x * x), (n / 2));
	else	// (n % 2) != 0 -> n이 홀수인 경우 
		return x * power_2((x * x), ((n - 1) / 2));
}

$x^n = (x^2)^{\frac{n}{2}}$ 의 공식을 이용하는 방법이다.

n이 짝수인 경우에는 $x^2$을 먼저 계산한 후에 이 값을 $\frac {n}{2}$제곱하고,

n이 홀수인 경우에는 $x^2$을 $\frac{n-1}{2}$제곱한 뒤 $x$를 한번 더 곱해야 한다.

함수를 한번 호출할 때마다 n승, $\frac{n}{2}$, $\frac{n}{4}$승으로 점점 문제의 크기가 약 절반으로 줄어든다.

 

 

 

  시간 복잡도


$2^k$
 → $2^{k-1}$ → $2^{k-2}$ → ... → $2^1$ → $2^0$

약 k번의 순환 호출이 일어난다. $n = 2^k$이므로 양변에 log를 취하면 $log_2n = k$가 된다.

한 번의 순환 호출이 일어날 때마다 약 1번의 곱셈과 1번의 나눗셈이 일어나므로 전체 연산의 개수는 $k = log_2n$에 비례하게 되어 시간 복잡도는 $O(log_2n)$이 된다.

 

 

 

+ Recent posts