활동정리/알고리즘 특강 (중급)

오리엔테이션 : 시간복잡도 계산

잔디🌿 2023. 7. 20. 17:15

시간복잡도 : 내 프로그램이 수행하는 연산의 수를 수식으로 나타낸 것

 

보통 빅오(O) 표기법을 사용하는데 이는 최악의 경우를 기준으로 계산한다.

 

for문

 

int ex(n){
 int x = 0;
 for(int i = 0;i<n;i++){
   x += i;
   System.out.println(x);
   }
   }

위 함수의 시간복잡도는 2n번 연산하기 때문에 O(n)이다. 

for문 안에서 2번의 연산을 하니까 O(2n)이라고 생각할 수도 있지만, 시간복잡도에서의 계수는 1이며(1/2n 도 n), 수식으로 나타낸 것이 다항식일 때에는 가장 높은 차수를 사용하므로(n^2 + n 은 n^2) O(n)이다.

 

int ex(n,m){
 int x = 0;
 for(int i = 0;i<n;i++){
   for(int j = 0;j<m;j++){
     System.out.println(x);
   }
   }
   }

 위의 경우는 nm번 수행하므로 시간복잡도는 O(nm)이다.

 

while문

 

int ex(n){
  while(0 > n || n > 100){
     if(n < 0)  n++;
     else  n--;
     return n;
     }

while문은  for문에 비해 생각할 것이 많다. 

경우의 수를 세가지로 나누면

  • n이 음수인 경우 ( -n)
  • n이 0에서 100 사이 (1)
  • n이 100보다 크다(n-100)

이다. 이때 가장 큰 차수는 n이므로 시간복잡도는 O(n)이다.

 

예시

 

void ex(int n, int m){
  int k = 0;
  int[] vis = new vis[n][m];
  for(int i =0;i<n;i++){
     for(int j = 0;j<m;j++){
        if(vis[i][j] == 0){
          for(int  k = 0;k<m;k++){
           vis[i][j] = 1;
           }
           }
           }
           }
           }

이 함수는 언뜻보면 nmk 같지만 k를 이용하는 for문에서 j 가 0일 때 vis 한 줄을 1로 만들면 다음 부터는 이 for문이 돌지 않는다. 따라서 시간복잡도는 O(nm)이다.

 

시간 계산하기

 

for 문이 1억번 돌 때 1초가 걸린다. 이를 바탕으로 n이 주어졌을 때 어느정도의 시간복잡도를 가진 알고리즘을 사용할 수 있을지 생각 할 수 있다.

원래 시간초과 때문에 시간 많이 빼았겼었는데 위 공식 잘 외워서 써야겠다.

 

 

공간복잡도

 

공간복잡도는 크게 어렵지 않다.

int[] arr = new int[n][n];

이 경우 공간복잡도는 O(n^2)이다.

 

또한 

int[][][] arr = new int[n][n][n];

이 경우의 공간복잡도는 O(n^3)이다.