[C++] 시간 복잡도

Connected Brain·2025년 10월 10일

시간 복잡도

과제

1부터 n까지의 숫자의 합을 구하는 알고리즘 구현

  • Algorithm A : n(n+1)/2 공식을 사용하는 방법
  • Algorithm B : 1+2+…+n까지 더하는 방법
  • Algorithm C : 0+(1)+(1+1)+(1+1+1)+…+(1+1+…+1) 모든 숫자에 대해 1씩 하는 방법

수행

// sum = n(n+1)/2
long long algorihmA(int n) {    
    long long sum = 0;    
    // TODO: implement Algorithm A
    sum = n * (n + 1) / 2;
    return sum;
}

// sum = 1+2+…+n
long long algorihmB(int n) {
    long long sum = 0;    
    // TODO: implement Algorithm B
    for(int i = 1; i <= n; i++)
    {
        sum += i;
    }

    return sum;
}
//sum = 0+(1)+(1+1)+(1+1+1)+…+(1+1+…+1)
long long algorihmC(int n) {    
    long long sum = 0;
    // TODO: implement Algorithm C
    for(int i = 1; i <= n; i++)
    {
        for(int j = 0; j < i; j++)
            sum += 1;
    }
    return sum;
}

Algorithm A

// sum = n(n+1)/2
long long algorihmA(int n) {    
    long long sum = 0;    
    // TODO: implement Algorithm A
    sum = n * (n + 1) / 2;
    return sum;
}
  • 주어진 n에 대해 n * (n + 1) / 2 공식을 통해 수열의 합을 구함
  • n의 할당과 연산까지 2번의 연산을 거침
  • n의 크기에 관계없이 1번의 연산이 이루어지는 O(1)의 시간복잡도를 가짐

Algorithm B

// sum = 1+2+…+n
long long algorihmB(int n) {
    long long sum = 0;    
    // TODO: implement Algorithm B
    for(int i = 1; i <= n; i++)
    {
        sum += i;
    }

    return sum;
}
  • 1부터 n까지의 숫자를 차례대로 더하여 수열의 합을 구함
  • n의 할당과 덧셈 연산까지 2n번의 연산을 거침
  • 입력받은 n의 크기만큼 연산을 반복하는 O(n)의 시간복잡도를 가짐

Algorithm C

//sum = 0+(1)+(1+1)+(1+1+1)+…+(1+1+…+1)
long long algorihmC(int n) {    
    long long sum = 0;
    // TODO: implement Algorithm C
    for(int i = 1; i <= n; i++)
    {
        for(int j = 0; j < i; j++)
            sum += 1;
    }
    return sum;
}
  • 1부터 n까지의 숫자를 차례대로 연산을 실시하나 그때의 i의 값 만큼 1을 더하는 것을 반복하여 수열의 합을 구함
  • n의 할당과 덧셈 연산까지 2n^2번의 연산을 거침
  • 이중 반복문을 사용해 n만큼의 연산을 실시하므로 O(n^2)의 시간복잡도를 가짐

결과

  • 같은 기능을 수행하는 알고리즘 중에서도 여러 시간 복잡도를 가진 방법이 사용될 수 있음
    O(1) < O(log n) < O(n) < O(n log n) < O(n^2) < O(n^3)
    < ... < O(n^k) < O(2^n) < ... < O(n!)
  • 시간 복잡도가 클 수록 n이 커졌을 때 전체 알고리즘이 실행되는 시간이 길어지므로 효율적이지 못함
  • 시간 복잡도가 n^2 + n + 1인 알고리즘이 있다고 할 때 n이 커질 수록 가장 큰 차수인 연산의 영향력이 커지므로 해당 알고리즘의 시간 복잡도를 표기할 때 가장 큰 차수인 O(n^2)으로 표기
  • O(n)은 최악의 경우를 표시하며 Ω(n)은 가장 유리한 케이스를, 평균적인 경우는 θ(n)으로 나타낼 수 있음
    Ex) 정렬 알고리즘에 있어 최적의 경우 : 이미 정렬되어 있어 전체를 순회하는 것 외에 다른 조치가 필요하지 않은 경우 n회의 연산만이 필요

0개의 댓글