Algorithm Efficiency에 대해

Updated:

Algorithm Efficiency에 대해 알아보는 시간을 가져보도록 하겠습니다.

같은 문제에 대해 알고리즘이 각각 다를 수 있습니다. 과연 어떤 알고리즘이 더 좋은 것일까요?

그 중 하나의 기준으로 runnning time을 볼 수 있습니다. worst-case runnig time이라고 하는데요. worst case에 대해서 최대 몇 개의 line이 실행되는지 알 수 있습니다.

예를 하나 가져와보겠습니다.

...

    for (i = 0; i < n; i++)
    {
      if (a[i] < a[i - 1])
      {
        temp = a[i - 1]
        a[i - 1] = a[i];
        a[i] = temp;
      }

    }
    printf("\n");
...

for문에서 i가 n번 실행되고 if문이 실행된다면 4 lines을 실행하므로 worst case의 경우 printf()까지 합쳐 f(n) = 4n + 1가 됩니다.

이렇게 여러개의 반복문에 대해서도 f(n)을 구할 수 있습니다. 여러개의 예들을 더 확인해보겠습니다.

Constants
  c lines of statements;  -> f(n) = c

Linear loops
  for (i = 0; i < n; i++)
  {
    application code (c lines)
  }                       -> f(n) = c*n

  for (i = 0; i < n; i += 2)
  {
    application code (c lines)
  }                       -> f(n) = c*n/2

Multiply loops
  for(i = 2; i <= n; i *= 2)
   application code (c lines)
   termination condition : 2^Iteration > n
                          -> f(n) = c*log_2(n)

Divide loops
  for(i = 2; i <= n; i /= 2)
   application code (c lines)
   termination condition : (n / 2^Iteration) < 2
                          -> f(n) = c*log_2(n)

Quadratic (2중 반복문)
  for (i = 0; i < n; i++)       outer : n iterations
  {
    for (j = 0; j < n; j++)    inner : n iterations
  }
                          -> f(n) = c*n^2

Dependent quadratic       
  for (i = 0; i < n; i++)       outer : n
  {
    for ( j = 0; j <= n; j++)   inner : (n-1)/2
  }
                          -> f(n) = c*n*(n-1)/2

Linear logarithm
  for (i = 0; i < n; i++)       outer : n
  {
    for (j = 0; j < n; j *= 2)  inner : log_2(n)
  }
                          -> f(n) = c*nlog_2(n)

여러개의 f(n)을 확인할 수 있었습니다. 그렇다면 f(n) = 15n^2 + 45n + 2000이 있다고 가정해봅시다. n이 커질수록 어떤 것이 dominant해질까요? 직감적으로도 n^2이란 것을 알 수 있습니다.

다시 말해, n이 커질수록 n^2이 기하급수적으로 늘어납니다. 여기서 n을 data로 볼 수 있습니다. 알고리즘에 따라 f(n)은 바뀌게 되고 n의 차수가 낮을수록 f(n)의 값이 작음을 확인할 수 있습니다.

즉, data가 커질수록 알고리즘이 중요하다는 것을 알 수 있습니다.

앞서 볼 수 있듯이 최고 차항이 중요한 것을 알 수 있는데요. 이렇게 최고차랑만 고려하는 것을 asymptotic efficiency of algorithms라고 합니다.

Leave a comment