파이썬 프로그램은 1초에 2,000만 ~ 1억개의 의 연산을 수행할 수 있다.
시간복잡도 유형
빅오 표기의 시간 복잡도 유형
시간복잡도는 데이터의 크기에 따라 수행시간이 다르며 비교 시 수치는 아래와 같다.
O(logn) < O(n) < O(nlogn) < O(n2) < O(2n) < O(n!)
log 계산 방법
import math
print(math.log2(1000000)) # 19.931568569324174
시간 복잡도 도출 기준
정의 - 프로그램에서 발생하는 문법 오류나 논리 오류를 찾아 바로잡는 과정
디버깅 방법
배열 - 메모리의 연속 공간에 값이 채워져 있는 형태로 인덱스를 통해 데이터를 참조할 수 있고 선언한 자료형의 값만 저장이 가능
리스트 - 값과 포인터를 묶은 노드
파이썬 리스트
정의 - 합 배열을 이용해 시간복잡도를 더 줄이기 위해 사용하는 특수 목적의 알고리즘
숫자로 가득찬 리스트 A의 특정 인덱스까지의 합을 구할 때 시간 복잡도는 O(N)이지만 미리 합배열을 만들어 구해놓으면 O(1)로 시간복잡도가 변한다.
TIP : 입력 받는 부분에서 손실을 발생시키지 않으려면 아래와 같이 input 을 설정한다.
import sys
input = sys.stdin.readline
정의 - 2개의 포인터로 알고리즘의 시간 복잡도를 최적화
요약 - 2개의 포인터(시작과 끝점)에서 조건을 만족시키며 하나씩 줄어들거나 늘어나며 교차할 때 까지 연산하는 방식의 알고리즘
정의 - 2개의 포인터로 범위 지정 후 범위를 유지한 채로 이동하며 문제 해결
요약 - 정해진 윈도우 크기 안에서 포인터를 움직이며 작업 수행
정의 - 삽입과 삭제 연산이 후입선출로 이뤄지는 자료구조, list로 스택을 구현한다.
주로 DFS(Depth First Search)에서 사용
정의 - 삽입과 삭제 연산이 선입선출로 이뤄지는 자료구조, deque 라이브러리로 큐를 구현
주로 BFS(Breadth First Search)너비 우선 탐색에서 자주 사용
비슷한 이름으로 우선순위 큐(priority queue)가 있으나 deque가 아닌 heap을 이용해 구현하며 우선 순위가 높은 데이터가 먼저 나오는 자료 구조
정의 - 두 인접한 데이터의 크기를 비교해 정렬하는 방법으로 O(n**2)의 시간 복잡도를 가진다.
정렬 과정
swap이 한번도 발생하지 않았다면 이미 조건에 맞게 정렬되어 있으니 정렬할 필요가 없다.
정의 - 대상 데이터에서 최대나 최소 데이터를 데이터가 나열된 순으로 찾아가며 선택
시간복잡도 - O(N**2)으로 효율적이지 않아 잘 사용하지 않는다.
정렬 과정
정의 - 이미 정렬된 데이터 범위에 정렬되지 않은 데이터를 적절한 위치에 삽입시켜 정렬하는 방식
시간복잡도 - O(N**2)이나 구현하기가 쉬움
정렬 과정
정의 - 기준값(pivot)을 정해 해당 값보다 작은 데이터와 큰 데이터로 분류하는 작업을 반복해 정렬
시간복잡도 - O(nlogn) ~ O(n**2)
시간복잡도가 pivot 선택에 따라 달라지기 때문에 자주사용은 하지 않음
정렬 과정
정의 - 분할 정복 방식을 사용해 데이터를 분할하고 분할한 집합을 정렬하며 합치는 알고리즘
시간복잡도 - O(nlogn)
정렬과정
정의 - 값을 비교하지 않는 정렬로 값을 놓고 비교할 자릿수만 정한 뒤 자릿수만 비교(숫자만 가능)
시간복잡도 - O(kn) / k = 자릿수
시간복잡도가 가장 짧은 정렬로 활용도가 높음
정렬과정
정의 - 그래프의 시작 노드에서 출발해 최대 깊이까지 탐색을 마친 후 다른 분기로 이동해 다시 탐색을 수행하는 알고리즘
시간복잡도 - O(V + E) / V = 노드 수, E = 엣지 수(간선)
특징 - 재귀 함수(스택 오버 플로우 주의), 스택
정의 - 시작 노드에서 출발해 시작 노드를 기준으로 가까운 노드를 먼저 방문하며 탐색하는 알고리즘
시간복잡도 - O(V + E)
특징 - Queue, 선입선출
정의 - 데이터가 정렬된 상태에서 원하는 값을 찾아내는 알고리즘
시간복잡도 - O(logN)
탐색 과정
정의 - 현재 상태에서 취할 수 있는 선택지 중 최선의 선택을 하는 알고리즘
수행 과정
출처 : Do it! 알고리즘 코딩 테스트 - 파이썬 편