시간 복잡도 판단하기
본문 바로가기
항해 중/알고 보면 알기 쉬운 알고리즘

시간 복잡도 판단하기

by 은돌1113 2021. 11. 12.

시간 복잡도란?

: 입력값과 문제를 해결하는 데 걸리는 시간과의 상관관계를 말한다.

(입력값과 결과값이 나오는 데까지 걸리는 시간을 말한다.)

입력값이 2배로 늘어났을 때 문제를 해결하는 데 걸리는 시간은 몇 배를 늘어나는 지 보는 것이다.

우리는 시간이 적게 걸리는 알고리즘을 좋아하니 입력값이 늘어나도 걸리는 시간이 덜 늘어나는 알고리즘이 좋은 알고리즘이겠죠?

 

시간 복잡도를 계산 할 때

입력값은 함수의 크기가 변경 될 수 있는 값을 말한다. 그렇기 때문에 다음 문제에서는 array가 입력값이다.

보통 array(입력값)의 길이는 N으로 표현하고, 각 줄이 실행되는 걸 1번의 연산이 된다라고 표현한다.

 

최댓값 찾기 알고리즘의 시간 복잡도를 판단 해보자면 

 

첫번째 방법의 시간 복잡도는

input = [3, 5, 6, 1, 2, 4]

def find_max_num(array):

    for num in array: # array의 길이만큼 아래의 연산이 실행
        for compare_num in array: # array의 길이만큼 아래의 연산이 실행
            if num < compare_num: # 비교 연산 1번 실행
                break
        else:
            return num


result = find_max_num(input)

array의 길이(N) * array의 길이(N) * 비교 연산 1번만큼의 시간이 필요하다.

그렇다면 첫번째 방법의 시간 복잡도는 다음과 같이 표현 할 수 있다.

그러면 이 함수는 N^2만큼의 시간이 걸렸구나!를 알 수 있다.

 

두번째 방법의 시간 복잡도는

def find_max_num(array):

    max_num = array[0] # 대입 연산 1번 실행       
    
    for num in array: # array의 길이만큼 아래 연산이 실행
        if num > max_num: # 비교 연산 1번 실행
            max_num = num # 대입 연산 1번 실행
    return max_num

result = find_max_num(input)

위에서 연산된 것들을 보면

1) max_num -> 대입 연산 1번

2) array 길이 * (비교 연산 + 대입 연산)

만큼의 시간이 필요하다. 첫번째 방법에서 했던 것처럼 array의 길이를 N이라고 하면

그러면 이 함수는 2N + 1만큼의 시간이 걸렸다는 걸 알 수 있다.

 

두 코드만 봐도 두번째 방법이 더 좋다는 걸 알 수 있지만 수치화 하면 얼마나 효율적인 지 정량적으로 분석 할 수 있다N의 길이가 길어 질수록, 다음과 같이 연산량이 변환한다.

이 표를 보면, 두가지를 알 수 있다.

1) N과 N^2은 N이 커질수록 더 큰 차이가 생긴다.

2) N의 지수를 먼저 비교하면 된다.

따라서 상수는 신경 쓰지 않고 입력값(함수의 크기가 변경 될 수 있는 값)에 비례해서 어느정도로 증가하는 지만 파악하면 된다.

'항해 중 > 알고 보면 알기 쉬운 알고리즘' 카테고리의 다른 글

점근 표기법(+배열에서 특정 요소 찾기)  (0) 2021.11.12
공간 복잡도 판단하기  (0) 2021.11.12
최빈값 찾기  (0) 2021.11.12
알파벳 빈도수 세기  (0) 2021.11.12
최댓값 찾기  (0) 2021.11.12

댓글