big-O notaion
자료구조나 알고리즘에서 성능(효율성)을 측정하기 위한 지표
알고리즘의 효율성 = 데이터가 n개 주어졌을 때 사칙연산과 같은 기본 연산의 횟수
빅오표기법의 정의
어떤 양수 n0, c이 존재할 때 f(n)= O(g(n)),
n0 이상의 모든 n에 대해 f(n) <= cg(n)
예를 들어보자
f(n) = n 이라고 하면
g(n) = n, c = 1 이라고 하면 c*g(n) = n
==> f(n) <= c*g(n)
==> n <= 1*n
==> f(n) = O(g(n)) = O(n)
따라서 n의 빅오표기법은 O(n)이 된다
(만약 여기서 g(n) = 2n, c = (1/2)n이라고 하면 빅오 표기법은 O(2n)이 된다)
f(n) = 2n 이라고 하면
g(n) = n, c = 2 이라고 하면 c*g(n) = 2*n
==> f(n) <= c*g(n)
==> 2n <= 2*n
==> f(n) = O(g(n)) = O(n)
따라서 n의 빅오표기법은 O(n)이 된다
f(n) = (1/2)n 이라고 하면
g(n) = n, c = 2 이라고 하면 c*g(n) = 2*n
==> f(n) <= c*g(n)
==> 2n <= 2*n
==> f(n) = O(g(n)) = O(n)
따라서 n의 빅오표기법은 O(n)이 된다
다음과 같은 예시에서는 몇가지 빅오표기법의 특징을 알 수 있다
빅오표기법의 특징
-
상수항 무시: 빅오표기법은 데이터 입력값이 충분히 크다고 가정-> 상수항 같이 사소한 부분은 무시한다 O(2n) --> O(n), O(6*n^2) --> (n^2)
-
영향력 없는 항 무시: 빅오표기법은 데이터 입력값이 충분히 크다-> 가장 영향력 큰 항 이외의 항들은 무시 O(n^2 + 2*n+1) --> O(n^2)
빅오표기법 성능비교
빅오표기법의 성능을 비교한 그래프이다
fast : O(1) < O(log n) < O(n) < O(nlogn) < O(n^2) < O(2^n) : slower
각각 표기법의 예제들을 몇개씩 알아두면 유용할 것 같아서 적어두도록 하겠다
- O(1) : 기본 사칙연산, stack push,pop
- O(logn) : 이진트리
- O(n) : for문
- O(n logn) : quick sort, merge sort, heap sort
- O(n^2) : 이중 for문, insertion sort, bubble sort, selection sort
- O(2^n) : 피보나치 수열
시간복잡도
코드가 답을 도출하기까지 걸리는 시간을 나타내는 것
알고리즘의 수행 시간이 얼마인지를 빅오표기법으로 나타낸다
시간복잡도를 얼추 구하기 위해서는 1초에 대략 1억번의 연산을 한다고 가정한다
예를 들어 1부터 n까지 정수를 더하는 문제를 풀어본다
https://www.acmicpc.net/problem/8393
이 문제는 나는 2가지로 풀어 보겠다
#include<iostream>
using namespace std;
int main()
{
int n, sum = 0;
cin >> n;
for (int i = 0; i <= n; i++) //for문이 1번 사용되고 덧셈이 1번이므로 1*n번
{
sum += i;
}
cout << sum << endl;
return 0;
}
위의 예제는 시간복잡도가 O(n)임을 간단하게 알 수 있다
다음은 수학공식을 이용해서 풀게 되면 (1부터 n까지의 합 = 1/2*n*(n+1))
#include<iostream>
using namespace std;
int main()
{
int n, sum;
cin >> n;
sum = n * (n+ 1)*0.5; // 사칙연산이 1번있다
cout << sum << endl;
return 0;
}
위의 예제의 시간복잡도는 O(1)임을 알 수 있다.
곱셈이 2번 덧셈이 1번 있지만 연산은 3번하므로 시간복잡도는 O(1)임을 알 수 있다.
참고로 대입, 입력 드의 연산들은 다 제외하고 대충세도 맞아 떨어진다.
공간복잡도
알고리즘의 공간이 얼마나 필요로 하는지 나타낸다
크기가 n인 배열을 만들면 공간복잡도는 O(n)이 된다
크기가 n^2배열을 만들면 공간복잡도는 O(n^2)이 된다
참고 사이트 : https://noahlogs.tistory.com/27
빅오 표기법 (big-O notation) 이란
컴퓨터 과학(Computer Science) 에서 알고리즘은 어떠한 문제를 해결하기 위한 방법이고, 어떠한 문제를 해결 하기 위한 방법은 다양하기 때문에 방법(알고리즘) 간에 효율성을 비교하기 위해 빅오(big-O) 표기법..
noahlogs.tistory.com
참고 사이트 : https://kks227.blog.me/220781557098
스택(Stack) (수정 2019-05-14)
또다른 기본 자료구조 중 하나인 스택(stack)입니다.스택은 LIFO(Last In First Out) 자료구조인데...
blog.naver.com
'알고리즘' 카테고리의 다른 글
LinkedList with class(양방) (0) | 2019.11.11 |
---|---|
LinkedList with class(단일) (0) | 2019.11.11 |
C++ 클래스와 constructor, destructor 간단 정리 (0) | 2019.11.10 |