본문 바로가기

알고리즘

시간 복잡도(Time Complexity) - 1

시간복잡도(time complexity)를 알차게 설명합니다! 빅 오(Big O)를 포함해서 점근적 표기법

참고하였습니다 : https://www.youtube.com/watch?v=tTFoClBZutw&t=1135s

 

 

 

말 그대로 시간이 얼마나 복잡하냐?

근데 이렇게 한국인이 이해하는건 사실상 불가능하다.

 

시간 복잡도 라는 말은 알고리즘 세계에서 사용 되는 단어, 알고리즘의 성능 지표로 사용된다.

 

먼저 빠르게 짧게 이해하고 가자

시간복잡도

=> 알고리즘 성능이 얼마나 좋은가?

=> 실행시간이 얼마나 짧은가?

 

우리는 보통 코드를 보면, 무언가 값을 넣었을때, 실행시간이 짧으면 짧을 수록 성능이 좋다고 생각한다.

당연하다. 음식점에서 주문해놓고 한참동안 음식이 안오면 얼마나 빡치겠는가? (한국인 8282~~)

 

아래의 코드가 있다. 보자.

우리는  위의 코드의 성능을 알고 싶어서 실행시간을 알고싶다.

 

그런데,,,

이 실행시간이란 것은 컴퓨터 성능에 따라 천차만별이다.

예를 들어 입력값이 방대한 데이터 라면, 고성능 컴퓨터의 경우 2분안에 처리 할수 있다면, 저사양의 컴퓨터일 경우 하루가 더 걸릴수도 있는 일이다.

 

단순히 현재 세팅에서 실행시간을 아는건 별 의미 없다는 것이다.

그럼 실행시간을 대신하여 성능을 평가할 지표가 없을까?

 

다시 코드를 보자

보아하니,

정수배열을 반환값으로 하는 multiply 함수는

총 4줄의 수행코드로 이뤄져 있다.

 

1 번째 줄은 딱 1번만 실행된다.

2 번째 줄은 입력값 정수배열 inputs 의 길이(N) + 1 만큼 실행된다. ( inputs.length(N) + 1 )

=>  +1 은 for 반복문을 탈출하는 조건인 inputs.length(N) + 1 번 수행될때 반복문을 탈출한다.

3 번째 줄은 입력값 정수배열 inputs 의 길이 만큼(N) 실행된다

4 번째 줄은 번째 줄은 딱 1번만 실행된다.

 

 

이것을 표로 만들면

오른쪽은 cost(코드 수행 비용), time(실행 횟수) 이다.

지금 cost, time 이해할려고 하지마라. 그냥 쭉 내려서 계속 읽어라.

 

각 줄의 cost x time 을 모두 더하면

aN + b 같은 변수와 상수로 조합된 실행횟수 식이 나오게 된다.

 

시간복잡도

⇒ 알고리즘 성능이 얼마나 좋은가?

⇒ 실행시간이 얼마나 짧은가?

⇒ 실행횟수가 얼마나 작은가?

라고 일단 생각할수 있겠다.

 

 

 

 

 

 

 

 

여기서부터가 중요한데

일반적으로 알고리즘 성능은 입력값 변수 N 이 무한하게 클때, 얼마나 빠르게 처리는가가? 핵심이다.

그래서 크게 영향을 주지 않는, 계수와 상수를 제거한다.

이렇게 계산하면 결국 변수 N 하나만 남게 되는데

이것을 점근적 표기법 이라고 한다.

최종적으로 시간복잡도 는

⇒ 알고리즘 성능이 얼마나 좋은가?

⇒ 실행시간이 얼마나 짧은가?

⇒ 실행횟수가 얼마나 작은가?

⇒ 실행횟수 식의 변수 N 이 무한하게 클때, 점근적 표기법으로 단순하게 보여지는 표현식

(같은 문제를 해결하는 코드에, 시간 보다 얼마나 더 적은 단계로 문제를 해결하는가? = 핵심은 단계 이다.)

 

결론

시간복잡도는, 실행횟수 식의 변수 N 이 무한하게 커지면서, 점근적 표기법으로 단순하게 보여지는 표현식

다시한번 말하지만. 같은 문제를 해결하는 코드에, 시간 보다 얼마나 더 적은 단계로 문제를 해결하는가? = 핵심은 단계 이다.

 

시간복잡도의 퀄리티는 아래 5단계 로 판단된다.

- Horrible : 최악이네..

- bad : 안좋아.. 개선해야해..

- Fair : 처리해야하는 양만큼 비례

- Good : 호~ 쓰기좋네

- Excellent : 어떤상황에서든지 최고다!!

X축 : 입력값  ,  Y축 : 코드 수행수치

 

 

'알고리즘' 카테고리의 다른 글

시간 복잡도(Time Complexity) - 2  (0) 2022.10.24