Immersion In Data

Python/이것이 코딩테스트다

[Python] 1. 복잡도

sungjunminn 2022. 11. 8. 15:22

1. 복잡도

알고리즘의 성능을 나타내는 척도

시간 복잡도

특정한 크기의 입력에 대하여 알고리즘이 얼마나 오래 걸리는지를 의미, 알고리즘을 위해 필요한 연산 횟수를 계산할 수 있다. 알고리즘 문제를 풀 때, 단순히 '복잡도'라고 하면 보통은 시간 복잡도를 의미한다.  

cf) 빅오(Big-O) 표기법 : 시간 복잡도를 표현하는 방법, 가장 빠르게 증가하는 항만을 고려하는 표기법 

a = 5
b = 7
print(a + b)
# a와 b에 값을 대입하는 대입 연산과 출력 함수를 무시하고 보면, 연산 횟수는 1
# 단순 더하기 연산 한번이 수행되므로(상수 연산) 시간 복잡도는 O(1)

 

array = [3, 5, 1, 2, 4] # 5개의 데이터(N = 5)

for i in array:
	for j in array:
    	temp = i * j
        print(temp)

# 데이터의 개수가 N개일 때, 2중 반복문을 이용하여 
# 각 원소에 대하여 다른 모든 원소에 대한 곱셈 결과를 매번 출력하고 있기 때문에 
# O(N²)의 시간 복잡도를 가진다.

 

cf) 빅오 표기법

빅오 표기법 명칭
O(1) 상수 시간(Constant time)
O(logN) 로그 시간(Log time)
O(N) 선형 시간
O(NlogN) 로그 선형 시간
O(N²) 이차 시간
O(N³) 삼차 시간
O(2ⁿ) 지수 시간

 

cf) 범위에 따른 시간 복잡도별 알고리즘 선택 예시

  • N의 범위가 500인 경우 : 시간 복잡도가 O(N³)인 알고리즘을 설계하여 푼다. 
  • N의 범위가 2,000인 경우 : 시간 복잡도가 O(N²)인 알고리즘을 설계하여 푼다.  
  • N의 범위가 100,000인 경우 : 시간 복잡도가 O(NlogN)인 알고리즘을 설계하여 푼다. 
  • N의 범위가 10,000,000인 경우 : 시간 복잡도가 O(N)인 알고리즘을 설계하여 푼다. 

 

공간 복잡도

특정한 크기의 입력에 대하여 알고리즘이 얼마나 많은 메모리를 차지하는지를 의미, 알고리즘을 위해 필요한 메모리의 양을 계산할 수 있다. 

int를 기준으로한 리스트 크기에 따른 메모리 사용량

  • int a[1000] : 4KB
  • int a[1000000] : 4MB
  • int a[2000][2000] : 16MB

코딩 테스트에서 보통 메모리 사용량은 128 ~ 512MB 정도로 제한한다. 즉, 일반적인 경우 데이터의 개수가 1,000만 단위가 넘어가지 않도록 알고리즘을 설계해야 한다는 의미이다. 

 

시간과 메모리 측정

수행시간 측정 소스코드

import time
start_time = time.time()

end_time = time.time()
print("time :", end_time - start_time)

 

선택 정렬과 Sort정렬의 수행시간 비교

from random import randint
import time

array = []
for _ in range(10000):
    array.append(randint(1, 100))

start_time = time.time()

for i in range(len(array)):
    min_index = i
    for j in range(i+1, len(array)):
        if array[min_index > array[j]]:
            min_index = j

    array[i], array[min_index] = array[min_index], array[i]

end_time = time.time()
print('선택 정렬 시간측정:', end_time - start_time)

sort_start_time = time.time()

array.sort()

sort_end_time = time.time()

print("sort 시간:", sort_end_time - sort_start_time)

# 선택 정렬 시간측정 : 8.62038803100586
# Sort 정렬 시간측정 : 0.0010328292846679688

선택 정렬보다 파이썬 기본 라이브러리의 Sort정렬이 훨씬 빠른 것을 확인할 수 있다. 

 

 

 

'이것이 코딩테스트다'를 읽고 공부한 내용을 바탕으로 작성하였습니다. 

'Python > 이것이 코딩테스트다' 카테고리의 다른 글

[Python] 6. 순열과 조합  (0) 2022.11.14
[Python] 5. 구간 합 계산  (0) 2022.11.14
[Python] 4. 투 포인터  (0) 2022.11.11
[Python] 3. 에라토스테네스의 체  (0) 2022.11.10
[Python] 2. 주요 라이브러리  (1) 2022.11.09