순환을 사용하지 않고 x의 n제곱 값을 구하는 함수 작성
double slow_power(double x, int n) {
int i;
double result = 1.0;
for (i = 0; i < n; i++)
result = result * x;
return(result);
}
- 루프 1회당 한 번의 곱셈이 필요하고 루프의 횟수는 n회
- O(n)의 시간복잡도
순환을 사용하여 x의 n제곱 값을 구하는 함수 작성
1. 알고리즘
power(x, n) : if(n==0) return 1; else if(n==짝수) return power(x^2, n/2); else if(n==홀수) return x*power(x^2, (n-1)/2); |
- x^n=(x^2)^(n/2)이므로
double power(double x, int n) {
if (n == 0) return(1);
else if ((n % 2) == 0)
return(power(x * x, n / 2));
else if ((n % 2) == 1)
return(power(x * x, (n - 1) / 2));
}
- 한 번의 순환 호출을 할 때마다 문제의 크기는 약 절반으로 감소
- n을 2^k라 가정한다면 순환 호출 한 번 당 n의 크기가 절반씩 줄어듦
- 2^k부터 2^0까지 약 k번의 순환 호출 발생
- 한 번 호출될 때마다 곱셈과 나눗셈이 각각 약 1번씩 발생하므로 전체 연산의 개수는 k=log2n에 비례
- O(logn)의 시간 복잡도
'안 씀 > 자료구조-예제&실습' 카테고리의 다른 글
스택의 응용: 후위 표기 수식 계산 (0) | 2024.07.11 |
---|---|
스택의 응용: 괄호 검사 문제 (0) | 2024.07.11 |
배열의 응용: 다항식 표현 (0) | 2024.07.05 |
순환-하노이탑 문제 (0) | 2024.07.03 |
반복-피보나치 수열 계산 (0) | 2024.07.03 |