시간복잡도 #
알고리즘 로직에서 입력값이 전체 연산의 시간에 미치는 영향을 알기 위한 방법
- big-O
상한 점근법으로 최대 걸리는 시간을 알 수 있다. 아래는 대표적인 시간이다.$O(1)$ - 단일 작업
$O(n)$ - 입력에 대한 모든 작업
$O(n^2)$ - 입력에 대한 모든 작업의 재반복
$O(log(n))$ - 입력에서 이진 탐색하는 방법 -
big-omega
하한 점근법으로 최선의 경우에서 시간을 알 수 있다. - big-theta
상*하한 점근법의 평균
list #
LIFO(last in first out) 모델
static list #
일반적인 정적 리스트 범위를 미리 지정하고 넘어가면 추가 할당함
linked list #
리스트 요소마다 연결되는 형식 처럼 제작한 리스트
from collections import deque
queue = deque()
stack #
LIFO(last in first out) 모델
- push()
데이터 입력 - pop()
데이터 출력(+삭제) - top(), peek()
데이터 출력
Queue #
FIFO(first in first out) 모델
- push(), offer(), add()
데이터 입력 - pop(), poll()
데이터 출력(+삭제) - peek()
데이터 출력
hash(Dictionary,Set in python) #
데이터를 빠르게 저장하고 가져오는 기법으로 key를 연산을 통해 value를 알 수 있다
sorting #
정렬을 하는방법으로 동일한 값이 기존서순대로 나열 되는 stable sort와 그렇지 않은 unstable sort로 나뉘어진다.
- binary search
정렬된 값에서 중앙값을 찾고 중앙을 기준으로 나눠서 유사한값이 해당하는 집합에서 다시 중앙값을 찾아 나가는 방법 - bubble sort(stable)
순서대로 다음값과의 순서를 비교하여 정렬하는법 $O(n^2)$ - insert sort(stable)
순서대로 다음값을 포함하여 포함한 집합에서 순서를 비교하여 정렬하는법 $O(n^2)$ - merge sort(stable)
각 개별로 분할하고 다시 짝찌어 돌아가면서 정렬하는법 $O(n log(n))$ - quick sort(unstable)
임의의 pivot값을 정하고 pivot보다 크거나 작은 값을 재배치하는것을 반복함 $O(n log(n))$ ~ $O(n^2)$
재귀함수 #
자기 자신을 재호출하여 사용하는 함수의 방식, 시스템 자원의 효율이 조금 떨어짐
base case, recurrence relation으로 이루어지며 base case로 모든 문제가 해결이 되어야한다.
tree #
데이터의 계층적 구조를 나타내며 하나의 노드가 여러 노드들을 가르킬 수있습니다.
- binary tree
트리 구조에서 자식 노드를 최대 두개까지 가지는 구조 - tree search
- preorder 방식
루트를 방문 후 왼쪽 자식 노드, 오른쪽 자식 노드 순으로 진행되며 자식 노드를 루트 노드화 하며 심층적 탐색을 한다. - inorder 방식
왼쪽 자식 노드를 가고 루트를 방문한 후 오른쪽 자식 노드로 이동하는 방법으로 자식 노드를 루트 노드화 하며 심층적 탐색을 한다. - postorder 방식
왼쪽 자식 노드를 가고 오른쪽 자식 노드로 이동한 다음 루트를 방문하는 방법으로 자식 노드를 루트 노드화 하며 심층적 탐색을 한다.
- preorder 방식
- binary tree search
중복된 값이 없이 루트의 왼쪽에는 루트보다 작은값 오른쪽에는 루트보다 큰값으로 구성이된다.(중위 탐색 기법으로 구성)
데이터 삭제시 왼쪽의 최대값 또는 오른쪽의 최소값과 교체한다.
heap #
완전 이진트리의 구조를 가지며 데이터 찾기$O(1)$와 추가,삭제$O(log(n))$가 빠르다.
- max heap
루트 노드가 자식 노드보다 크거나 같음 - min heap
루트 노드가 자식 노드보다 작거나 같음 - priority queue
들어온 순서와 상관없이 우선 순위가 높은 데이터 순으로 처리 - heapify(O(n))
데이터가 추가(O(logn)) 및 삭제(O(logn))될때 힙 구조를 유지하기 위한 로직
import heapq
min_heap=[1,4,6,3,7,8,2]
heapq.heapify(min_heap)
heapq.heappop(min_heap)
heapq.heappush(min_heap)
graph #
vertex(노드)와 edge(연결선)으로 구성이되며 2차원 행렬 관계도 또는 인접 리스트 관계도로 표현이 가능하다.
- 방향 그래프
edge에 방향성을 추가한 그래프 - 가중치 그래프
edge에 가중치를 추가한 그래프 -
순환 그래프
vertex에서 edge를 거쳐 되돌아 올 수 있는 방향 그래프 - adjacency matrix(인접 행렬)
연결된 vertex는 1 연결이 안된 vertex는 0으로 나타내는 행렬(메모리 비효율) - adjacency list(인접 리스트)
연결된 vertex를 나열한 리스트를 모은 dictinary -
implicit graph(암시적 그래프)
- 그래프 탐색
- DFS(depth-first-search)
깊이 우선 탐색법으로 stack을 이용하거나 preorder inorder postorder를 사용 가능하다. - BFS(breadth-first-search)
너비 우선 탐색법으로 queue사용가능, 가까운것을 먼저 검색한다고 볼 수 있다.(이미 방문한 노드는 재진입 하지 않는다.)
- DFS(depth-first-search)
- 위상정렬
비순환 그래프를 순서대로 출력하는 방법- Queue(진입 차수) 활용
진입 차수는 노드에 들어오는 edge의 수를 의미하며 진입 차수가 0인 노드들을 queue에 넣고 순차적으로 빼면서 연결된 edge를 제거하며 해당 노드를 넣는것을 반복한다. - stack(DFS) 활용
깊이가 깊은 곳부터 순차적으로 stack을 쌓고 모든 데이터가 전부 쌓이고 나면 추출하는 방식.
- Queue(진입 차수) 활용
- 그래프의 최단거리
- 다익스트라(Dijkstra)
노드에서 노드끼리 최단 경로를 찾는 방법으로 edge의 가중치는 양수로 이루어 진다.
- 다익스트라(Dijkstra)
DP #
동적 계산법으로 재귀함수에서 하위의 함수가 중복될때 사용
피보나치의 경우 $O(2^n)$에서 $O(n)$으로 감소
구하려는것부터 시작하는 top-down, 아는것 부터 시작하는 bottom-up방식이 있다.
cache #
데이터를 임시로 저장하는 저장소
- LRU(Least Recently Used)
가장 예전에 사용한 데이터를 삭제하는 방법 - LFU(Least Frequently Used)
가장 사용빈도가 작은 데이터를 삭제하는 방법