시간복잡도
시간복잡도(Time Complexity)는 컴퓨터과학 이론으로, 알고리즘이 어떤 문제를 해결하는데 걸리는 시간을 의미한다. 계산 복잡도 이론의 한 종류로, 알고리즘을 분석하여 효율성을 평가하는데 사용된다. 계산 복잡도 이론에는 시간복잡도 외에 공간복잡도가 있다.
개요
컴퓨터가 프로그램을 가동할 때, 제대로된 결과만 낸다고해서 좋은 프로그램이라고 볼 수는 없다. 결과가 나오기까지의 시간이 오래걸릴수록 프로그램이 중앙처리장치를 차지하는 시간이 길어지고, 그렇게 되면 중앙처리장치가 다른 일을 처리하지 못해서 컴퓨터의 효율성은 떨어질 수 밖에 없다. 따라서 좋은 프로그램인지 알고리즘의 성능을 분석할 방법이 필요하다.[1]
알고리즘의 성능분석의 주된 요소로는 공간복잡도와 시간복잡도가 있다. 공간 복잡도는 메모리 사용량에 대한 분석결과로 알고리즘에 사용되는 메모리 공간의 총량을 의미하며, 시간복잡도는 알고리즘에 사용되는 연산횟수의 총량을 의미한다. 더 정확히는, 알고리즘을 구성하는 명령어들이 몇 번 실행되는지 실행횟수를 센 결과에 각 명령어의 실행시간을 곱한 합계를 의미한다. 주로 수행시간을 구해 시간복잡도를 구하고 해당 알고리즘이 효율적인 알고리즘인지를 판단하는 데 사용된다. 다만, 각 명령어의 실행시간은 하드웨어나 프로그래밍 언어에 따라 값의 변동이 있을 수 있어서 일반적으로는 실행시간을 제외하고 명령어의 실행 횟수만을 고려한다. 또한, 알고리즘의 소요 시간을 명확하고 정확하게 평가할 수는 없기때문에 자료의 수 이 증가한다고 할때 시간이 증가하는 패턴을 시간 복잡도로 표현한다. 시간복잡도의 간단한 예를 들자면, 1을 1000000번 더하는 for 반복문이 있다고 할 때, 여기서의 시간 복잡도는 이라고 할 수 있다. 시간복잡도를 표기하는 방법으로는 대표적으로 빅오표기법이 있다. 빅오에서 가장 차수가 높은 최고차항만 두고 나머지는 버려진다.
- : 입력 데이터의 크기와 상관없이 언제나 일정한 시간이 걸리는 알고리즘이다. 입력데이터의 양에 상관 없이 언제나 실행시간이 일정하다. 알고리즘이 문제를 해결하는 과정이 한단계이다.
- : 입력 데이터의 크기에 비례하여 처리시간에 걸리는 알고리즘을 표현할 때 사용한다. 데이터의 양에 따라 시간이 정비례한다. Lenear Search, for문을 통한 탐색을 예로 들수 있다.
- :데이터의 양에 따라 걸리는시간은 제곱에 비례한다. 이중루프내에서 입력자료를 처리하는 경우에 발생하며, 값이 커지면 실행시간도 매우 길어져 효율성이 떨어진다.
- : 데이터의 양이 증가해도 시간이 조금씩 증가한다. 시간에 비례하여 탐색 가능한 데이터의 양이 이 된다. 문제를 해결할 때 필요한 단계들이 연산마다 특정 요인에 의해 줄어든다. 문제를 일정한 크기의 작은 문제로 분리할 때 사용된다. 이진 검색을 예로 들 수 있다.[2]
시간 복잡도는 어떤 함수를 돌렸을 때 결과를 반환할 때까지 걸리는 실행시간을 의미하는 것이 아니다. 시간복잡도는 연산의 횟수를 의미하는 것이므로, 시간단위가 아니라 시행횟수 단위이다. 따라서 다음과 같은 장점을 얻는다.
- 실행이 따로 필요하지 않다.
- 소프트웨어나 하드웨어가 필요없다.
- 모든 플랫폼에서 동일한 결과를 산출한다.[3]
계산복잡도
계산 복잡도 이론은 계산 문제를 푸는 알고리즘을 복잡도에 따라 문제를 구성하는 방법을 연구한다. 따라서 알고리즘의 계산복잡도를 고려하면 더 효율적인 프로그램이 개발될 수 있다. 복잡도의 기준은 시간 복잡도, 공간 복잡도로 나뉘어 각각 알고리즘이 소요하는 시간과 메모리 사용량을 기준으로 한다. 공간 복잡도는 문제를 해결하는데 있어 주기억장치의 공간을 얼마나 차지하는지를 살펴보는 것이다. 공간복잡도는 공간을 얼마나 차지하는가를 기준으로 판단하고, 시간복잡도는 시간을 얼마나 차지하는가를 기준으로 판단한다. 과거에 비해 기술의 발달로 주기억장치인 RAM의 용량이 커져서 공간복잡도의 중요성이 많이 낮아졌다. 따라서 최근에는 공간복잡도보다 시간복잡도가 프로그램의 성능을 비교분석하고 판단하는 중요한 잣대로 사용되고 있다.[1]
표기법
빅오 표기법
최고차항의 차수만 표기하는 방법으로, 시간복잡도를 표현할 때 자주 사용된다. 예를 들어 를 빅오표기법으로 표현한다면 으로 표기할 수 있다. 입력자료가 인 알고리즘에서 시간복잡도가 이라고 할 때, 의 값이 커질수록 시간복잡도가 복잡한 알고리즘은 수행시간이 급격하게 증가한다. 수행시간은 문제의 크기에 독립적인 필요가 없으나, 수행시간의 상한은 문제의 크기에 독립적으로 제한된다. 만약 a와 b를 바꿔서 b가 a보다 크거나 작게 만들어야하는 문제가 발생한 경우, 시간이 조건 만족 여부에 종속적이라고 해도 상수시간을 갖는다고는 할 수 없다.
오메가 표기법
세타 표기법
종류
- : 입력 데이터의 크기와 상관없이 언제나 일정한 시간이 걸리는 알고리즘이다. 입력데이터의 양에 상관 없이 언제나 실행시간이 일정하다. 알고리즘이 문제를 해결하는 과정이 한단계이다.
- : 입력 데이터의 크기에 비례하여 처리시간에 걸리는 알고리즘을 표현할 때 사용한다. 데이터의 양에 따라 시간이 정비례한다. Lenear Search, for문을 통한 탐색을 예로 들수 있다.
- :데이터의 양에 따라 걸리는시간은 제곱에 비례한다. 이중루프내에서 입력자료를 처리하는 경우에 발생하며, 값이 커지면 실행시간도 매우 길어져 효율성이 떨어진다.
- : 데이터의 양이 증가해도 시간이 조금씩 증가한다. 시간에 비례하여 탐색 가능한 데이터의 양이 이 된다. 문제를 해결할 때 필요한 단계들이 연산마다 특정 요인에 의해 줄어든다. 문제를 일정한 크기의 작은 문제로 분리할 때 사용된다. 이진 검색을 예로 들 수 있다.[4]
- 상수 시간
알고리즘의 수학적 연산 시간이 입력 데이터의 크기와 관계 없이 언제나 일정하고, 알고리즘이 문제를 해결하는데 한단계만 걸리는 것을 상수 시간 또는 이다. 객체에서 키를 알거나 배열에서 인덱스를 알고 있으면 언제나 한 단계만 걸린다. 입력 데이터의 양에 상관 없이 언제나 실행 시간이 일정하다. 예를 들자면, 배열 또는 메모리에 있는 요소들에 접근하는데 연산 하나만으로 가능한데, 요소에 접근하는 복잡도를 상수 시간이라고 칭한다. 하지만, 정렬되지 않은 배열 내의 최솟값을 찾아낼 때는 요소 하나하나를 전부 훑어봐야 하므로, 이에 걸리는 시간은 상수 시간이라고 칭할 수 없고, 시간이 사용되는 선형 시간이 된다. 그러나 만약 요소들의 개수를 미리 알고있다면, 알고리즘은 상수 시간에 제대로 이뤄질 수 있다.
- 로그 시간
입력값 n이 주어졌을 때 문제를 해결하는 데 필요한 단계들이 연산마다 특정 요인때문에 줄어든다면 로그시간 또는 이다. 데이터의 양이 증가해도 시간이 조금씩 증가하고, 시간에 비례하여 탐색 가능한 데이터의 양이 이 된다. 문제를 해결할 때 필요한 단계들이 연산마다 특정 요인에 의해 줄어든다. 문제를 일정한 크기의 작은 문제로 분리할 때 사용되며, 배열에서 값을 찾을 때 어느 쪽에서 시작할지를 알고 있으면 검색 시간이 두배로 감소한다. 이진 검색을 예로 들 수 있다.
- 다항 로그 시간
- 서브-선형 시간
- 선형 시간
시간복잡도가 이라고 할 때, 알고리즘은 시간 혹은 선형 시간이라고 할 수 있다. 다음 식의 n은 입력 값의 개수이고, 은 연산횟수를 구하는 함수이다. 첫번째는 n개의 데이터가 들어왔을 때 for문에서 n번 반복하므로 이라고 할 수 있다. 두 번째는 이므로 라고 할 수 있다. 이처럼 데이터 n개에 대한 들이 n 또는 n/2일 경우 n에 대한 1차방정식이 된다. n이 증가하면 시간복잡도도 비례하여 선형적으로 증가한다.
- //application code
- //application code
- 유사 선형 시간
- 서브-이차 시간
- 다항 시간
- 초다항 시간
- 준-다항 시간
- 서브-지수 시간
- 지수 시간
- 이중지수 시간
각주
- ↑ 1.0 1.1 시간 복잡도 네이버 지식백과 - https://terms.naver.com/entry.nhn?docId=3609919&cid=58598&categoryId=59316
- ↑ 박동건, 〈Time Complexity(시간복잡도)〉, 《벨로그》, 2020-01-02
- ↑ 호로요이이, 〈시간 복잡도와 공간 복잡도〉, 《네이버 블로그》, 2018-03-15
- ↑ 박동건, 〈Time Complexity(시간복잡도)〉, 《벨로그》, 2020-01-02
참고 자료
- 시간복잡도 위키백과 - https://ko.wikipedia.org/wiki/%EC%8B%9C%EA%B0%84_%EB%B3%B5%EC%9E%A1%EB%8F%84
- 호로요이이, 〈시간 복잡도와 공간 복잡도〉, 《네이버 블로그》, 2018-03-15
- 박동건, 〈Time Complexity(시간복잡도)〉, 《벨로그》, 2020-01-02
같이 보기