일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- UNIX
- 자료구조
- 재귀 함수
- 우분투
- 유닉스
- 순차 탐색
- 알고리즘
- sys.stdin.readline()
- 탐색
- 백준
- 이진 탐색
- IT
- 동적 계획
- 트리
- 파이썬
- format 메서드
- 자기개발
- Git
- git hub
- 정렬
- 그래프
- 그리디
- NQueen
- 기초
- type 함수
- MiniHeap
- 스택
- 문법
- 배열
- 분할 정복
Archives
- Today
- Total
코딩고치
[파이썬][자료구조] 시간 복잡도 본문
시간 복잡도
시간 복잡도 계산이 필요한 이유
알고리즘을 푸는데 정해진 정답은 없어 어떤 방식이 더 좋은지 고려하기 위해서 시간 복잡도를 계산해야 한다.
복잡도 계산 항목
- 시간 복잡도 : 실행 속도
- 공간 복잡도: 사용하는 메모리 사이즈
시간 복잡도가 중요하다. 공간 복잡도는 요즘 잘 계산하지 않는다.
시간 복잡도 주요 요소
반복문이 가장 큰 영향을 미친다.
알고리즘 성능 표기법
- Big O 표기법 : O(N)
- 가장 오래 걸리는 실행 시간을 계산
- 가장 많이 사용함
- 최악의 상황이라도, 이 정도 성능은 보장
Big-O 표기법
-
빅 오 표기법, Big-O 표기법 이라고도 부른다.
-
O(입력)
-
입력 n에 따라 결정된다.
-
O(1), O($log n$), O(n), O(n$log n$), O($n^2$), O($2^n$), O(n!)등으로 표기한다.
-
입력 n의 크기에 따라 걸리는 시간이 기하급수적으로 변한다.
- O(1) < O($log n$) < O(n) < O(n$log n$) < O($n^2$) < O($2^n$) < O(n!)
- 참고: log n의 베이스는 2 - $log_2 n$
- O(1) < O($log n$) < O(n) < O(n$log n$) < O($n^2$) < O($2^n$) < O(n!)
-
n에 따라 몇 번 실행되는지 계산하면 된다.
- 무조건 2회 (상수회) 실행될 때 : O(1)
if n > 10: print(n)
- n에 따라, n번, n + 5, 2n + 10번 등으로 실행할 때 : O(n)
for num in range(2): for i in range(n): print(i)
- n에 따라, $n^2$, $n^2 + 100$, $100n^2 - 25$번 실행할 때: O($n^2$)
for i in range(100): for num in range(n): for index in range(n): print(index)
- 시간 복잡도가 $2n^2 + 5n$일 때 O($n^2$) 로 가장 높은 차원으로 표기한다.
-
1부터 n까지의 합을 구할 때 시간 복잡도
def sum(n):
sum = 0
for num in range(1, n + 1):
sum += num
return sum
sum(100)
5050
반복문이 n번 실행된다.
시간 복잡도 : O(n)
def sum(n):
return int(n * (n + 1) / 2)
sum(100)
5050
반복문이 없다.
시간 복잡도 : O(1)
어떤 것이 더 좋은가?
O(1)이 시간이 더 적게 걸려서 좋다.
'파이썬 > 자료구조' 카테고리의 다른 글
[파이썬][자료구조] 트리 (Tree) (0) | 2020.04.23 |
---|---|
[파이썬][자료구조] 해쉬 테이블(Hash Table) (1) | 2020.04.22 |
[파이썬][자료구조] 링크드 리스트 (Linked List) (0) | 2020.04.15 |
[파이썬][자료구조] 스택 (Stack) (0) | 2020.04.15 |
[파이썬][자료구조] Queue (0) | 2020.04.15 |
Comments