TIL
[2023-09-22] TIL - 시간 복잡도
이즈흐
2023. 9. 22. 14:41
시간 복잡도는 자료구조와 알고리즘을 배우기 위해 필요한 지식이다.
시간 복잡도
프로그램의 성능을 측정하기 위해서는
- 입력 크기
- 하드웨어 성능
- 운영체제 성능
- 컴파일러 최적화
- 비동기 로직
- 등등..
위와 같이 많은 것들을 고려해야한다.
따라서 프로그램의 성능을 정확히 파악하는 것이 불가능하다.
그래서 빅오표기법을 만들어냈다.
빅오표기법
O(1) < O(log N) < O(n) < O(n log n) < O(n2) < O(2n) < O(n!)
이를 다른이름으로도 부른다.
상수형 < 로그형 < 선형 < 로그선형 < 2차형 < 지수형 < 팩토리얼형
O(n)
for(let i = 0; i < n; i++){
...
}
O( log n )
for(let i = 1; i <= n; i*=2){
...
}
O(n log n)
for(let i = 0; i < n; i++){
for(let i = 1; i <= n; i*=2){
...
}
}
O(n2)
for(let i = 0; i < n; i++){
for(let i = 0; i < n; i++){
...
}
}
이후의 시간복잡도는 되도록 사용되어서는 안되는 시간복잡도이므로 작성하지 않았다.
여기서 아래와 같은 식에 계수가 있거나 상수가 있는 경우는 찾아볼 수 없을 것이다.
O(n2+ 126), O(3n - 30), O(3 log n) -> O(n2), O(n), O(log n)
이유로
빅오표기법은 점근적표기법을 따르기 때문이다.
점근적표기법은 함수의 증감 추세를 비교하는 방법이라고 한다.
c와 n0은 양수라고 가정한다. n이 n 을 넘어설 떄 함수 f(n)은 함수 g(n)에 가까워질 수 는 있지만 넘을 수 없다.
한마디로 함수 g(n)은 함수 f(n)의 한계치라고 할 수 있다.
이것을 점근적표기법으로 나타낸 것이 빅오표기법(시간복잡도)라고 얘기한다.
빅오표기법의 법칙
계수 법칙
- n이 무한에 가까울 수록 상수 k의 크기는 의미가 없어진다.
// 두 루프는 같은 O(n)으로 표기된다.
for(let i = 0; i < n; i++){
...
}
for(let i = 0; i < n * 5; i++){
...
}
합의 법칙
- 빅오끼리는 더해질 수 있다.
// 두 루프는 합쳐 O(n + m)으로 표기할 수 있다.
// 계수 법칙에 의해 5는 사라진다.
for(let i = 0; i < n; i++){
...
}
for(let i = 0; i < m * 5; i++){
...
}
곱의 법칙
- 빅오끼리는 곱해질 수 있다.
// 두 루프를 곱해 O(n^2)으로 표기할 수 있다.
// 계수 법칙에 의해 5는 사라진다.
for(let i = 0; i < n; i++){
for(let i = 0; i < n * 5; i++){
...
}
}
다항 법칙
- f(n)이 k차 다항식이면 f(n)은 O(nk)이다.
//다음 루프는 O(n^3)으로 표기할 수 있다.
for(let i = 0; i < n * n * n; i++){
...
}
728x90
반응형
LIST