알고리즘정리

[정리] 시간복잡도

kanghs 2024. 9. 3. 17:42

1. O(1) : 입력값에 관계없이 일정하다.  최고차항의 차수가 0

MenOfPassion(A[], n) {
    i = ⌊n / 2⌋;
    return A[i]; # 코드1
}

 

2. O(n) : 입력값에 비례하여 실행시간이 증가한다. 최고차항의 차수가 1

MenOfPassion(A[], n) {
    sum <- 0;
    for i <- 1 to n
        sum <- sum + A[i]; # 코드1
    return sum;
}
  • 입력값 n에 따라 반복횟수가 변화한다
  • 실행시간이 n의 값에 비례한다.

3. O(n^2) : 입력값 ^ 2에 비례하여 실행시간이 증가한다. 최고차항의 차수가 2

MenOfPassion(A[], n) {
    sum <- 0;
    for i <- 1 to n
        for j <- 1 to n
            sum <- sum + A[i] × A[j]; # 코드1
    return sum;
}
  • 입력값 n으로 2번 반복되니 n x n 으로 반복횟수가 n^2이다. 
  • 실행시간이 n^2의 값에 비례한다.

3-1

MenOfPassion(A[], n) {
    sum <- 0;
    for i <- 1 to n - 1
        for j <- i + 1 to n
            sum <- sum + A[i] × A[j]; # 코드1
    return sum;
}
  • i의 반복횟수 n - 1
  • j의 반복횟수 i를 k라 가정하였을 때 n - k

전체 반복횟수를 구하는 공식

  • 이 공식은 (n^2 - n )/2 와 동일하다.
  • 이때 시간복잡도는 최고차항만을 고려하므로 시간복잡도는 O(n^2)

4. O(n^3) : 입력값 ^ 3 에 비례하여 실행시간이 증가한다. 최고차항의 차수가 3

MenOfPassion(A[], n) {
    sum <- 0;
    for i <- 1 to n
        for j <- 1 to n
            for k <- 1 to n
                sum <- sum + A[i] × A[j] × A[k]; # 코드1
    return sum;
}
  • 입력값 n으로 3번 반복되니 n x n x n 으로 반복횟수가 n^3이다.
  • 실행시간이 n^3에 비례한다.

4-1

MenOfPassion(A[], n) {
    sum <- 0;
    for i <- 1 to n - 2
        for j <- i + 1 to n - 1
            for k <- j + 1 to n
                sum <- sum + A[i] × A[j] × A[k]; # 코드1
    return sum;
}
  • i의 반복횟수 n - 2
  • j의 반복횟수 n - i - 1
  • k의 반복횟수 n - j
  • 전체 반복횟수를 구하는 조합의 수는 n(n-1)(n-2)/6이다.
  • 시간복잡도는 최고차항만 고려하므로 시간복잡도는 O(n^3)

 

ex)

O(g(n)) = {f(n) | 모든 n ≥ n0에 대하여 f(n) ≤ c × g(n)인 양의 상수 c와 n0가 존재한다}

함수 f(n) = a1n a0, 양의 정수 cn0가 주어질 경우 O(n) 정의를 만족하는지 알아보자.

(출력조건: f(n), cn0가 O(n) 정의를 만족하면 1, 아니면 0을 출력한다.)

  • 모든 n 은 n >= n0 이 성립되어야한다.
  • f(n) = a1n a0 해당함수가 O(n)에 포함되려면 f(n) <= c x n 이 성립되어야 한다.
  • a1n + a0 <= c x n 의 식이 성립된다. 여기서 양쪽 모두 a1n을 빼면
  • a0 <= c x n - a1n 의 식이 된다.
  • a0 <= (c -a1) x n 으로 묶을 수 있다.
  • 이러면 c - a1 >= 0 그리고 a0 <= (c - a1) x n의 두가지 조건이 만족해야 한다.

결과적으로 해당 코드가 나타나게 된다.