알콰리즈미 : 이름이 라틴어로 변환되면서 알고리즘이라는 용어를 쓰게됨
최초의 알고리즘은 유클리드의 최대 공약수 알고리즘 이다.
: 2개의 자연수의 최대 공약수는 큰 수에서 작은 수를 뺀 수와 작은 수와의 최대 공약수와 같다!
ex) (18,6) == (12,6) == (6,6) == (0,6)
두 수 중 하나가 0이 됐을 때 나머지 값이 최대 공약수!
ex) for 루프 n^2 x 최대값 구할때 적어도 n/2 == n^3
sample(A[],n){ sum=0; for i = 1 to n for j = 1 to n{ k= A[1 ~ n] 에서 임의로 n/2 개 뽑았을 때 최대값; sum=sum+k; } return sum; }
int fib(int n){
if(n<=1)
return n;
else
return (fib(n-1)+fib(n-2));
}
T(n) : fib(n)을 계산하기 위하여 fib함수를 호출하는 횟수
T(0) = 1
T(1) = 1
T(n) = T(n-1) + T(n-2) +1 (처음 실행했으니까)
> T(n-2) + T(n-2) == 2xT(n-2)
📌 T(n-1) > T(n-2) 이므로!!
📌 T(n-2) = T(n-3) + T(n-4) +1 > 2 x T(n-4)
> 2^2 X T(n-4)
> 2^3 X T(n-6)
.
.
.
> 2^n/2 X T(n-n) = 2^n/2 X T(0) = 2^n/2
: T(n) > 2^n/2
: 피보나치 재귀 알고리즘은 수행속도가 매우 느리다. 왜? 중복계산이 너무 많아서
int fib2(int n){
index i;
int f[0~n];
f[0]=0;
if(n>0){
f[1]=1;
for (i=2; i<=n; i++){
f[i]=f[i-1]+f[i-2];
}
return f[n];
}
: T(n) = n+1
: 중복계산을 하지 않기 때문에 훨씬 빠르다