SlideShare a Scribd company logo
1 of 73
컴퓨터 알고리즘
게임 개발자 노대영
알아 볼것
• 알고리즘 정의 조건
• 복잡도
• 자료구조
• 탐색
• 정렬
• 최단 거리 검색
정의
주어진 문제를 해결하기 위한 여러 동작들의 모임이다.
유한성을 가지며 , 언젠가 끝내야하는 속성이 필요하다
알고리즘의 조건
입력과 출력 :
입력할 데이터 와 문제가 처리 되면 하나 이상의 결과 값이 출력되야 한다.
정확성: 수행과정이 모호하지 않고
정확해야한다.
유한성: 유한번의 연산을 수행하고
유한시간내에 종료되어야한다
효과성: 알고리즘의 모든 연산들이
사람이 유한한 시간안에
정확히 수행가능해야함
알고리즘 평가 기준
정확성 : 입력 데이터와 수행 후 기대되는 출력에
대해 정확히 이해/일반적으로 수학적 귀납법으로
증명이 되어야한다
작업량: 알고리즘이 수행되는 시간적 비용이
적으면 좋다
알고리즘 평가 기준
최적성 : 가장 알려진 알고리즘이 아닌,
가장 좋은 알고리즘을 선택
기억장소 사용량 : 공간적 비용 , 입력데이터에
따라 저장하기 위한 공간이 달라진다
알고리즘 속도 비교
알고리즘
입력 데이터
알고리즘 A 알고리즘 B
100 100 ms 7 ms
10,000 10 s 14 ms
1,000,000,000 11 day 32 ms
?
알고리즘 B 는 알고리즘 A보다
약 15배 빠르다?
입력 데이터에 따라서
그 차이가 달라진다
기존의 표기법으로는
속도를 비교할 수 없다
시간적 , 공간적 복잡도
알고리즘의 절대적 실행 시간을 나타내는 것이 아닌 수행하는데
연산이 몇 번 이루어지는 지를 숫자로 표기함.
수식으로 T(n) 으로 표기하며 n은 입력한 데이터의 개수를 나타낸다
Ex) 해당 문제를 풀기위해 n번의 연산이 일어날 경우 T(n)
시간적 복잡도는 최고차항을 표기한다
Ex)T( ) = ( )
공간적 복잡도는 입력데이터의 얼마만큼의 메모리영역을 쓰나
표기함
n x n 2차원 배열
Ex) 의 공간적 복잡도를 가짐
최근에는 하드웨어 성능이 많이 좋아져
시간적 복잡도에 신경을 더 많이 쓴다
𝑛2
+ 2𝑛 𝑛2
𝑛2
worse
better
데이터가 많아질 수록
기하급수적으로 늘어나는 것들은
피하는게 좋다
점근적 표기법
Big-오 : 최악의 성능 표시
Big-오메가: 최고의 성능 표시
Big-세타 : 근접한 한계 성능 표시
재귀
factorial(1)
ex) factorial(5)
factorial(2)
factorial(3)
factorial(4)
factorial(5)
호출 스택 LIFO
(last in first out)
분할정복
640
400
640 * 400 가장 큰 정사각 형으로 채우기?
작은것 부터 생각하자
400 * 400 만큼 사각형은
어차피 정사각형으로 채워질테니
영역에서 제외하고
240 * 400 의 영역
=> 240 * 160 의 영역
이렇게 반복하면
최종적으로 80 * 80의
정사각형의 공간을 얻을 수 있음
알고리즘은 작은데서 부터 시작하는게
매우 중요하다
자료 구조(간단하게 알아봅시다)
Data Data
Data Data
Data
Data
Data Data Data
Data
Data
Data
배열
1 5 12 16 20 25 28 32 48 50
대부분 언어에서 지원되는 가장 기본적인 순차 자료구조이다
여러데이터를 하나의 이름으로 그룹핑해서 사용한다
1차원 , 2차원 , 3차원 배열 등으로 공간을 만들 수 있다
• 특징
1. 인덱스를 통한 읽기 속도가 빠르다 O(1)
2. 크기 제한이이 있다
3. 삽입과 삭제가 느리다 O(n)
1 5 12 16 20 25 28 32 48 50
2 12 23 25 34 39 40 44 55 64
3 19 34 34 48 53 52 56 62 78
4 26 45 43 62 67 64 68 69 92
5 33 56 52 76 81 76 80 76 106
6 40 67 61 90 95 88 92 83 120
7 47 78 70 104 109 100 104 90 134
8 54 89 79 118 123 112 116 97 148
9 61 100 88 132 137 124 128 104 162
10 68 111 97 146 151 136 140 111 176
1차원 배열
2차원 배열
연결 리스트
데이터들을 노드를 이용하여 분산 저장한다
각 노드는 다음 노드의 주소를 저장한다
• 특징
1. 검색속도는 O(n)의 시간으로 느리다
2. 크기가 가변적
3. 노드를 참조하여 삽입과 삭제가 빠르다O(1)
4. 다음 데이터의 노드를 알아야해서 배열보다
용량이 더 필요하다
Data
0
Data
1
Data
2
Data
3
Data
4
Data
5
Null
Data
0
Data
1
Data
2
Data
3
Data
4
Data
5
Null
Data
0
Data
1
Data
2
Data
3
Data
4
Data
5
단순 연결리스트
이중 연결리스트
원형 연결리스트
스택
선형 자료구조로 끝 인덱스에서 삽입과 삭제
LIFO(last in first out) 일어나는 자료구조이다
push 를 통해 데이터를 입력하고
pop을 통해 데이터를 가져온다
ex) 함수 호출 스택에서 이용된다
Data3Data3
Data1
Data2
Data3
push pop
큐
스택과 반대로 먼저 들어간 데이터가
먼저 나오는 FIFO(first in first out)
의 구조를 가지고 있다
스택과 큐를 합친 특별한 큐로
dequeue라는 자료구조도 있다
앞 뒤에서 빼내기 가능
ex) 함수 호출 스택에서 이용된다
Data1
Data3
Data1
Data2
Data3
push
pop
해시맵
키를 넣고 해시함수를 통하여 데이터의 주소를 가지고 있는
burkets에 접근 한다 평균적으로 읽기속도가 빠르다 O(1)
하지만 삽입과 삭제는 느리다
해시맵을 읽기속도가 빠르기 위해서는 충돌을 피해야함
1. 해시가 골고루 분포한 해시함수를 쓰고(골고루 분포)
2. 사용율이 낮아야한다(리사이징 하여 충돌을 피함)
직접 값들을 추가하니 임계값 0.7 이상을 넘으면
해시맵 딕셔너리의 크기가 증가된다
*해시함수 : 임의의 값을 고정된 길이의 난수의 데이터(해시)를 생성
서로 다른 값은 다른 해시가 나온다
블랙핑크
트와이스
0 뚜두뚜두
1 빨간맛
2
3 Cheer Up!
4
hash
function
hash
map(value)
key
레드벨벳
그래프
객체간의 관계를 표현할 수 있는 자료구조를 뜻한다
V: 정점 노드를 뜻한다
E: 간선 정점을 정점끼리 연결하는것을 뜻한다
W: 가중치 간선의 가중치 값 Value를 뜻한다
인접 정점을 가진 정보를
행렬이나 리스트로 정리하여 연산을 한다
행렬은 빠른 접근이 가능하나 가용 메모리가 크다
리스트는 느리나 가용 메모리가 적다
비하여 간선의 개수가 적으면 리스트를 권장
에 비례하는 간선이 있는 그래프는 행렬을 권장
구로
국민
대
판교
우리
집
30
50
20
30
Edge
Vertex Weight
집 구로 국민 판교
집 0 50 30 ∞
구로 ∞ 0 ∞ 20
국민 ∞ ∞ 0 ∞
판교 ∞ 30 ∞ 0
집 구로 50 국민 30
판교 구로 30
구로 판교 20
국민
다양한 그래프
구로
국민
대
판교
우리
집
구로
국민
대
판교
우리
집
할아버지
아버지
나 동생
삼촌
사촌동생
양방향 그래프 무방향 그래프 트리
구로
국민
대
판교
우리
집
가중치 그래프
30
50
20
30
자료구조 시간적 복잡도
평균과 최악의 시간적복잡도에 따라 의도와 다른 경우를 가져올 수 있다
탐색 알고리즘
1 5 12 16 20 25 28 32 48 50
리스트에 50 있음?
주어진 데이터 집합에서 입력한 값을 찾는거다
단순 탐색과 이진 탐색에 대해서 알아보겠습니다
단순 탐색 (Linear Search)
1 5 12 16 20 25 28 32 48 50 리스트에 50 있음?
1 , 5 , 12….
50
가장 기초적인 탐색
첫 인덱스 부터 끝 인덱스까지 순차적으로 탐색한다
O(n)의 시간이 걸린다
반복문에서 인덱스를 높여가며 계속 검색한다
크기가 큰 데이터 일수록 그 탐색시간은
엄청 늘어나게 된다
O(n)
병뚜껑에는 1~ 50 사이에 숫자가 적혀있다
이 번호를 빨리 찾기 위해서는 어떻게 해야할까?
이진 탐색 (Binary Search)
1 5 12 16 20 25 28 32 48 50 리스트에 50 있음?
25 up
32 up
50 find
데이터 안에 값들이 정렬 되어있어야하는 조건이 필요하다
중간 부터 탐색을 시작하며
찾는 값과 비교하며 찾는 위치를 좁혀나간다
인덱스 중간부터 탐색을 시작하여
입력값과 비교하여 다음 값으로 이동한다
O( )𝑙𝑜𝑔2 𝑛
단순 vs 이진
0.1
1.
10.
100.
1000.
10000.
1 10 100 1000 10000
함수수행시간
데이터 개수
단순 이진
검색해야할 데이터 개수가 많을 수록
단순 탐색의 시간전 복잡도는 선형 비례하여 증가한다
정렬이 된 데이터라면 이진 탐색을 이용하는것이 바람직하다
이진 탐색 트리
10
5
1 6
17
1 61 61 61 61 6 1 614 21
7
7
이진 탐색이 적용된 트리이다
정점의 값을 기준으로 정점보다
값이 작으면 왼쪽 크면 오른쪽으로 보낸다
한 정점에 노드는 최대한 두개로 제한한다
남는 노드가 없을시 정점에 연결된 노드로 이동한 후
비어 있는 노드에 연결 된다
탐색 , 삽입 , 제거 속도는 평균적으로 O(log n)
정렬된 이진 트리에서는 최악도 O(log n)
완전 , 편향 이진트리
편 안
불 편 한쪽으로 노드가 밀집 되어있는 트리를 편향 트리라 한다
이진 탐색트리의 성능을 발휘할 수 없다
이러한 문제점을 해결하기 위해
B-Tree , Heap , red-black Tree , splay Tree
등으로 트리 노드를 재구성한다
데이터가 골고루 분포하게 되면
이진트리의 장점을 살릴 수가 있다
정렬 알고리즘
1 4 3 2
1 2 3 4
How?
선택 정렬
(단순하게)
최선 , 최악의 경우 O( )𝑛2
첫 인덱스 부터 끝 인덱스 까지
대소비교 하여 정렬을 한다
구현이 가장 간단하다
하지만 가장 느리기에
거의 쓰지 않는다
2 3 5 6 7 4 1
1 3 5 6 7 4 2
교환
교환
1 2 5 6 7 4 3
교환
1 2 3 6 7 4 5
교환
1 2 3 4 5 6 7
삽입 정렬
정렬된 부분에 있는 요소들과
정렬되지 않는 요소들을 비교해서
정렬된 부분위치에 삽입한다
퀵 정렬에 비해 느리지만
이미 정렬된 리스트에 다른 요소를 더해
다시 정렬할 때 쓰면 유용하다
최선O(n) , 최악의 경우 O( )𝑛2
2 3 5 6 7 4 1
1 2 3 4 5 6 7
2
3 5 6 7 4 12
5 6 7 4 12 3
12 3 5 6 7 4
8 4
버블 정렬
거품이 빠지는 모습과 유사하다하여 버블
인접한 요소들과 비교하며
최대값이 오른쪽으로 이동하게 된다
삽입 정렬과 마찬가지로 정열이 되있는
데이터에 소규모 데이터 삽입시
O(n)의 시간을 가진다
최선O(n) , 최악의 경우 O( )𝑛2
2 3 5 6 7 4 1
1 3 5 6 7 4 2
교환
교환
1 2 5 6 7 4 3
교환
1 2 3 6 7 4 5
교환
1 2 3 4 5 6 7
쉘 정렬
삽입 정렬과 유사한 형태이다
특정 간격(gap)을 둔 그룹끼리 대소비교를 하여
정렬을 한다.
간격을 점점 줄여나가 정렬을 진행한다
간격을 어떻게 두냐에 따라서 성능이 많이 달라진다
최선O(n) , 최악의 경우 O( )
2 3 5 6 7 4 1
1 3 4 2 7 5 6
1 3 4 2 7 5 6
1 2 4 3 6 5 7
1 2 4 3 6 5 7
1 2 3 4 5 6 7
(𝑛𝑙𝑜𝑔𝑛)2
쉘 정렬
shell = ⌊
𝑁
2 𝑘
⌋ prath =
3 𝑘
− 1
2
< [
𝑛
3
]
gap sequence Big-O
Gap 을 정하는 알고리즘에 따라 시간적 복잡도가 달라진다
병합 정렬
리스트를 두 부분으로 쪼개는 작업을 재귀적으로 호출
분할 정복 알고리즘의 일종이다
모두 쪼갠 후 쪼갠것을 합쳐가며 정렬을 한다
최선O(n log n) , 최악의 경우 O( n logn )
5 3 2 6 4 1
5 3 2 6 4 1
5 3 2 6 4 1
3 5 2 64 1
2 3 5 1 4 6
1 2 3 4 5 6
퀵 정렬
병합정렬과 같은 분할정복 정렬 알고리즘이다
기준값을 정하고 기준값을 기준으로
작은값과 큰값을 분리하고 다시 분리한 값에서
기준값을 다시 산정해서 잘개 쪼갠다
평균 시간적복잡도 O(nlog n) 정렬알고리즘중
가장 빠르다(Heap , Merge)
최선O(nlogn) , 최악의 경우 O( )𝑛2
4 3 2 6 5 1 7
3 2 1 4 6 5 7
1 2 3 4 6 5 7
1 2 3 4 5 6 7
기준값 선택
왼쪽 정렬
오른쪽 정렬
기본적인 동작 내용은 이렇다
하지만 리스트를 복사해서
이어붙이는 경우 메모리를 많이
쓰기 때문에 내부에서 정렬하게
구현하는게 좋다
퀵 정렬
20 48 24 43 17 15 25 54 1 4 8 67
Lpivot RR
20 8 24 43 17 15 25 54 1 4 48 67
pivot L과 R이 만날때까지 수행L R
정렬 함수는 재귀적으로 호출되며 탐색 범위를 벗어나면 종료
왼쪽 인덱스와 오른쪽 인덱스를 분리하여 탐색
왼쪽 인덱스는 피벗값보다 큰 값을 찾을때 까지 오른쪽으로 이동
오른쪽 인덱스는 피벗값보다 작은 값을 찾을때 까지 왼쪽으로 이동
왼쪽 과 오른쪽 값을 교환
값을 찾을때 까지 왼쪽 인덱스가 오른쪽 인덱스와 같거나 크게 되면
이전 동작 수행 x ,피벗값과 오른쪽 인덱스 값을 변경한다
20 8 24 43 17 15 25 54 1 4 48 67
pivot L R
20 8 4 43 17 15 25 54 1 24 48 67
pivot L R
퀵 정렬
20 8 4 43 17 15 25 54 1 24 48 67
pivot L R
20 8 4 1 17 15 25 54 43 24 48 67
pivot LR
20 8 4 1 17 15 25 54 43 24 48 67
pivot L RLR
15 8 4 1 17 20 25 54 43 24 48 67
pivot p = 5
15 8 4 1 17 20 25 54 43 24 48 67
pivot LRL
1 8 4 15 17 20 25 54 43 24 48 67
pivot p = 3
1 8 4 15 17 20 25 54 43 24 48 67
p L
R
R
1 8 4 15 17 20 25 54 43 24 48 67
p LR
탐색 범위가 좁아짐
R과 피벗의 위치는 같기 때문에 교환 x
1 8 4 15 17 20 25 54 43 24 48 67
p =0 h = 2 , p =0 quick_sort( a , 0 , -1) <= 재귀를 빠져나온다
quick_sort(a, 1 ,2 )
?
h = 11, p = 5, quick_sort( a , 0 , 4)
quick_sort(a, 6 , 11)
h = 4, p = 3, quick_sort( a , 0 , p -1)
quick_sort(a, 4, 4) => 재귀 빠져나옴
1 8 4 15 17 20 25 54 43 24 48 67
p RL L과 R 위치가 같음 R과 p 값 교환
1 4 8 15 17 20 25 54 43 24 48 67
l=1,h = 2 , p =2 quick_sort( a , 1 , 1) <= 재귀를 빠져나온다
quick_sort(a, 3 ,2 ) <= 재귀를 빠져나옴
다음장에서 마무리
L >= R L과 R 교환 x
L >= R p와 R 교환
퀵 정렬
1 4 8 15 17 20 25 54 43 24 48 67
quick_sort(a, 6 , 11)
p L RR
1 4 8 15 17 20 25 24 43 54 48 67
p LR
pivot 보다 작은 값은 없다
1 4 8 15 17 20 24 25 43 54 48 67
p LRL >= R p와 R 교환
1 4 8 15 17 20 24 25 43 54 48 67
p LR
l=6,h = 11 , p =6 quick_sort( a , 6 , 6) <= 재귀를 빠져나온다
quick_sort(a, 7 ,11 )
1 4 8 15 17 20 24 25 43 54 48 67
Rp L
l=7,h = 11 , p =7 quick_sort( a , 7 , 6) <= 재귀를 빠져나온다
quick_sort(a, 8 ,11 )
1 4 8 15 17 20 24 25 43 54 48 67
Rp Lpivot 보다 작은 값은 없다
l=8,h = 11 , p =8 quick_sort( a , 8 , 7) <= 재귀를 빠져나온다
quick_sort(a, 9 ,11 )
1 4 8 15 17 20 24 25 43 54 48 67
R LL >= R p와 R 교환
1 4 8 15 17 20 24 25 43 48 54 67
l=9,h = 11 , p =9 quick_sort( a , 9 , 8) <= 재귀를 빠져나온다
quick_sort(a, 10 ,11 )
p
1 4 8 15 17 20 24 25 43 48 54 67
LpRL >= R p와 R의 위치는 같다
l=10 , h = 11 , p =10 quick_sort( a , 10 , 10) <= 재귀를 빠져나온다
quick_sort(a, 11 ,11 ) < = 재귀 종료, 정렬 함수가 모두 종료된다
퀵 정렬 최악의 경우
1 4 8 15 17 20 24 25 43 48 54 67
기준이 되는 값이 리스트에서 가장 작을 경우 불균형을 이룬다
최악의 경우 퀵 정렬이라해도 O( )
시간적 복잡도를 가진다
1 4 8 15 17 20 24 25 43 48 54 67
𝑛2
1 4 8 15 17 20 24 25 43 48 54 67
1 4 8 15 17 20 24 25 43 48 54 67
O(nlog n) 속도를 가진
병합 정렬 , 힙 정렬 보다
좋은 평균 속도를 가진다
이미 정렬된 리스트라면
삽입 정렬 , 버블 정렬을 쓰는게
O(n)의 시간을 가질 수 있다.
힙 정렬
완전 이진 힙트리 특성을 이용한 정렬이다
완전 이진 힙트리 특성은 다음과 같다
각 정점은 부모보다 큰 값을 가질 수 없다
각 정점은 최대 두개의 자식을 가질 수 있다
마지막 레벨 노드는 왼쪽 부터 채워진다
맨 위에 부터 차례대로 뽑아내서 가져오면
정렬이 가능하게 된다
최악 O(nlogn)의 준수한 성능을 보장한다
계수 정렬
1 0 0 1 1 2 2 3 0 4 0 1
0 1 2 3 4
4 4 2 1 1
0 0 0 0 1 1 1 1 2 2 3 4
이전에 녀석들은 비교가 필요했던 정렬알고리즘이다
하지만 계수 정렬은 비교 없이 리스트의 요소 개수
만큼 배열을 만들고 그 요소들을 끝까지 계수한 후
차례대로 정렬하는 알고리즘이다
선형시간을 가지는 효율적인 알고리즘이다
O(n + k) => 최대값 k가 무한히 클경우 무한의 시간
최대값이 정해져야하며 => 크기가 크면 메모리낭비가 심
max값 산출이 선행되야한다 먼저
기수 정렬
120 432 541 49 8 35
0 1 2 3 4 5 6 7 8 9
120 541 432 35 08 49
0 1 2 3 4 5 6 7 8 9
008 120 432 035 541 049
0 1 2 3 4 5 6 7 8 9
8 35 49 120 432 541
비교가 필요없는 정렬알고리즘
시간복잡도 O(kn) 을 가진다
k => 버킷수
정렬 레코드 타입 제한이 필요하다
각자리의 비트값에 따라 버킷에 넣고
최대 자릿수 비교 할때까지 반복한다
문자열 정렬할때 사용하면 좋다
버킷 정렬
대상 데이터를 분포 특성을 활용하여 O(n)수준으로
개선 시키는 목적으로 사용하는 알고리즘 , 버킷 정렬
데이터가 고루 분포 되어있을 때 좋은 속도를 가진다
버킷 리스트에 정렬이 필요하다. 버킷의 특성에 의하
여
순서대로 담는거이기 때문에 정렬을 해줘야함
버킷내에서
그 이후 정렬된 버킷을 순서대로 합치면
정렬된 리스트를 얻을 수 있다.
정렬 알고리즘 속도 비교
최단거리 탐색 알고리즘
최단 경로
A
CB
D E
F
앞에서 그래프에서 정점과 간선의 정보를
인접 행렬 혹은 인접 리스트로 구현한다고 했습니다
저는 인접리스트로 구현해서 설명을 하겠습니다
*set : python에서 중복값이 없는 자료형
A B C
B A D E
C B C
D B
E B F
F C E
정점당 간선의 정보를 리스트로 저장
너비 우선 탐색 (BFS) , 깊이 우선 탐색
(DFS)
Breadth
Depth
깊이 레이어를 나누어 차례로 탐색 선택한 정점에서 가장 깊은 곳을 먼저 탐색
DFSBFS
A
CB
D E
F
A
CB
D E
F
너비 우선 탐색 (BFS)
1
32
5 4
6
너비 우선 탐색 (BFS)
A
C
B
A Bqueue A C
시작점과 연결된 정점을 찾고
탐색 큐에 저장한다
,
B C
A
CB
D E
F
너비 우선 탐색 (BFS)
A
C
B
queue
F
A B A C FB F
D
E
Dqueue A B D E A B E
A C FF
A
CB
D E
F
너비 우선 탐색 (BFS)
A
C
B
F
D
E
Dqueue A B D F A B E F
A C FF
result A C FF
경로가 없음
도착
A
CB
D E
F
너비 우선 탐색 (BFS)
A
C
B
F
D
E
queue F A B E F
result A C FF F A B E F
A
CB
D E
F
깊이 우선 탐색 (DFS)
1
25
6 4
3
깊이 우선 탐색 (DFS)
A
B
A Bstack
시작점과 연결된 정점을 찾고
탐색 스택에 저장한다
B
C
A CC
A
CB
D E
F
깊이 우선 탐색 (DFS)
A
C
B
stack
F
A BB
D
E
D
stack
A B D
E A B EA CC
A CC
A
CB
D E
F
깊이 우선 탐색 (DFS)
A
C B
D E
F
A
C
B
F
D
E
D
stack
A B D
E A B EA CC
stack F A B E FA CC
깊이 우선 탐색 (DFS)
A
C B
D E
F
A
C
B
F
D
E
queue F A B E F
result F A B E F
A CC
깊이 우선 탐색 (DFS)
A
C B
D E
F
A
C
B
F
D
E
queue
result A B E F
A CC
queue A C FF
A C F
깊이 우선 탐색 (DFS)
A
C B
D E
F
A
C
B
F
D
E
queue
result A B E F
A CC
queue A C FF
A C F
다익스트라 알고리즘
A
C
B
D
F
30
15
20
10
E
20
5
20
5
A에서 F로 가기 위한 최단경로는?
다익스트라 알고리즘 구
현
시작점에서 이어진 모든 간선의 코스트를 업데이트하고
코스트가 가장 적은 녀석들 부터 다음 간선까지의 비용을 업데이트한다
계산한 비용이 이전 리스트에 저장한 비용보다 적다면 새로운 경로와 비용을 업데이트한다
다익스트라 알고리즘
A
C
B
D
F
30
15
20
10
E
20
5
20
5
A B C D E F
A 0 None ∞ None ∞ None ∞ None ∞ None ∞
B
A 10
C
A 30
D
A 15
A B C D E F
A 0 A 10 A 30 A 15 None ∞ None ∞
다익스트라 알고리즘
A
C
B
D
F
30
15
20
10
E
20
5
20
5
A B C D E F
A 0 A 10 A 30 A 15 None ∞ None ∞
E
B 20
A B C D E F
A 0 A 10 A 30 A 15 B 30 None ∞
B
A 10
E
B 30
다익스트라 알고리즘
A
C
B
D
F
30
15
20
10
E
20
5
20
5
A B C D E F
A 0 A 10 A 30 A 15 B 30 None ∞
A B C D E F
A 0 A 10 D 20 A 15 B 30 None ∞
C
D 5
D
A 15
C
D 20
다익스트라 알고리즘
A
C
B
D
F
30
15
20
10
E
20
5
20
5
A B C D E F
A 0 A 10 A 30 A 15 B 20 None ∞
A B C D E F
A 0 A 10 D 20 A 15 B 30 C 25
F
C 5
C
D 20
F
C 25
다익스트라 알고리즘
A
C
B
D
F
30
15
20
10
E
20
5
20
5
A B C D E F
A 0 A 10 D 20 A 15 B 30 C 35
F
C 35
C
D 20
D
A 15
가장 적게 비용이 드는 경로를 가져오면
최단 경로는 A->D->C->F
정리
• 자료 구조는 읽기 ,삽입 , 삭제에 따라 맞는 자료구조를 이용하
면 좋다
• 이진 탐색은 단순 탐색 보다 빠르게 탐색 가능 하지마 정렬이
필요
• 정렬은 최악 , 최적 시간적 복잡도가 다르므로 상황에 따라 쓰
는게 중요
• 큰 문제를 작은 곳 부터 시작하는 분할 정복이 알고리즘의 핵
심
더 공부해야할 것들
A *알고리즘
탐욕 알고리즘
NP문제
KNN 알고리즘
문자열 다루기 등
다음기회에…
QA
문의 : ndy192@gmail.com
발표를 들어주셔서 감사합
니다

More Related Content

What's hot

Efficient linear skyline algorithm in two dimensional space
Efficient linear skyline algorithm in two dimensional spaceEfficient linear skyline algorithm in two dimensional space
Efficient linear skyline algorithm in two dimensional space희수 박
 
Algorithms summary korean
Algorithms summary koreanAlgorithms summary korean
Algorithms summary koreanYoung-Min kang
 
8. Logistic Regression
8. Logistic Regression8. Logistic Regression
8. Logistic RegressionJungkyu Lee
 
제어-물리적시스템의 수학적모델링
제어-물리적시스템의 수학적모델링제어-물리적시스템의 수학적모델링
제어-물리적시스템의 수학적모델링jdo
 
3 Generative models for discrete data
3 Generative models for discrete data3 Generative models for discrete data
3 Generative models for discrete dataJungkyu Lee
 
R 프로그래밍 기본 문법
R 프로그래밍 기본 문법R 프로그래밍 기본 문법
R 프로그래밍 기본 문법Terry Cho
 
[Algorithm] Selection Sort
[Algorithm] Selection Sort[Algorithm] Selection Sort
[Algorithm] Selection SortBill Kim
 
Support Vector Machine Tutorial 한국어
Support Vector Machine Tutorial 한국어Support Vector Machine Tutorial 한국어
Support Vector Machine Tutorial 한국어Jungkyu Lee
 
5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)hyun soomyung
 
머피의 머신러닝 : Gaussian Processes
머피의 머신러닝 : Gaussian Processes머피의 머신러닝 : Gaussian Processes
머피의 머신러닝 : Gaussian ProcessesJungkyu Lee
 
머피's 머신러닝: Latent Linear Model
머피's 머신러닝: Latent Linear Model머피's 머신러닝: Latent Linear Model
머피's 머신러닝: Latent Linear ModelJungkyu Lee
 
[Algorithm] Counting Sort
[Algorithm] Counting Sort[Algorithm] Counting Sort
[Algorithm] Counting SortBill Kim
 
Random walk, brownian motion, black scholes equation
Random walk, brownian motion, black scholes equationRandom walk, brownian motion, black scholes equation
Random walk, brownian motion, black scholes equation창호 손
 

What's hot (18)

Efficient linear skyline algorithm in two dimensional space
Efficient linear skyline algorithm in two dimensional spaceEfficient linear skyline algorithm in two dimensional space
Efficient linear skyline algorithm in two dimensional space
 
Algorithms summary korean
Algorithms summary koreanAlgorithms summary korean
Algorithms summary korean
 
8. Logistic Regression
8. Logistic Regression8. Logistic Regression
8. Logistic Regression
 
(Lisp)
(Lisp)(Lisp)
(Lisp)
 
sort algorithim
sort algorithimsort algorithim
sort algorithim
 
06. sorting
06. sorting06. sorting
06. sorting
 
6. Sorting
6. Sorting6. Sorting
6. Sorting
 
제어-물리적시스템의 수학적모델링
제어-물리적시스템의 수학적모델링제어-물리적시스템의 수학적모델링
제어-물리적시스템의 수학적모델링
 
3 Generative models for discrete data
3 Generative models for discrete data3 Generative models for discrete data
3 Generative models for discrete data
 
R 프로그래밍 기본 문법
R 프로그래밍 기본 문법R 프로그래밍 기본 문법
R 프로그래밍 기본 문법
 
[Algorithm] Selection Sort
[Algorithm] Selection Sort[Algorithm] Selection Sort
[Algorithm] Selection Sort
 
Support Vector Machine Tutorial 한국어
Support Vector Machine Tutorial 한국어Support Vector Machine Tutorial 한국어
Support Vector Machine Tutorial 한국어
 
5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)
 
머피의 머신러닝 : Gaussian Processes
머피의 머신러닝 : Gaussian Processes머피의 머신러닝 : Gaussian Processes
머피의 머신러닝 : Gaussian Processes
 
머피's 머신러닝: Latent Linear Model
머피's 머신러닝: Latent Linear Model머피's 머신러닝: Latent Linear Model
머피's 머신러닝: Latent Linear Model
 
[Algorithm] Counting Sort
[Algorithm] Counting Sort[Algorithm] Counting Sort
[Algorithm] Counting Sort
 
TAOCP 2.2.6
TAOCP 2.2.6TAOCP 2.2.6
TAOCP 2.2.6
 
Random walk, brownian motion, black scholes equation
Random walk, brownian motion, black scholes equationRandom walk, brownian motion, black scholes equation
Random walk, brownian motion, black scholes equation
 

Similar to [데브루키]노대영_알고리즘 스터디

Data Structure 2
Data Structure 2Data Structure 2
Data Structure 2yonsei
 
Computational Complexity
Computational ComplexityComputational Complexity
Computational Complexityskku_npc
 
2.linear regression and logistic regression
2.linear regression and logistic regression2.linear regression and logistic regression
2.linear regression and logistic regressionHaesun Park
 
Amugona study 1회 jjw
Amugona study 1회 jjwAmugona study 1회 jjw
Amugona study 1회 jjw정완 전
 
Amugona study 1회 jjw
Amugona study 1회 jjwAmugona study 1회 jjw
Amugona study 1회 jjw정완 전
 
Python3 brief summary
Python3 brief summaryPython3 brief summary
Python3 brief summaryHoChul Shin
 
하스켈 성능 튜닝
하스켈 성능 튜닝하스켈 성능 튜닝
하스켈 성능 튜닝민석 이
 
R 기초 : R Basics
R 기초 : R BasicsR 기초 : R Basics
R 기초 : R BasicsYoonwhan Lee
 
amugona study 2nd
amugona study 2ndamugona study 2nd
amugona study 2ndwho7117
 
Neural network (perceptron)
Neural network (perceptron)Neural network (perceptron)
Neural network (perceptron)Jeonghun Yoon
 
[Swift] Data Structure - Heap
[Swift] Data Structure - Heap[Swift] Data Structure - Heap
[Swift] Data Structure - HeapBill Kim
 
퀵 정렬 알고리즘 기초
퀵 정렬 알고리즘 기초퀵 정렬 알고리즘 기초
퀵 정렬 알고리즘 기초Dongyi Kim
 
이산치수학 Project4
이산치수학 Project4이산치수학 Project4
이산치수학 Project4KoChungWook
 
Lecture 4: Neural Networks I
Lecture 4: Neural Networks ILecture 4: Neural Networks I
Lecture 4: Neural Networks ISang Jun Lee
 
이산치수학 Project7
이산치수학 Project7이산치수학 Project7
이산치수학 Project7KoChungWook
 
Differentiable Neural Computer
Differentiable Neural ComputerDifferentiable Neural Computer
Differentiable Neural ComputerTaehoon Kim
 

Similar to [데브루키]노대영_알고리즘 스터디 (20)

Data Structure 2
Data Structure 2Data Structure 2
Data Structure 2
 
알고리즘
알고리즘알고리즘
알고리즘
 
Computational Complexity
Computational ComplexityComputational Complexity
Computational Complexity
 
2.linear regression and logistic regression
2.linear regression and logistic regression2.linear regression and logistic regression
2.linear regression and logistic regression
 
Amugona study 1회 jjw
Amugona study 1회 jjwAmugona study 1회 jjw
Amugona study 1회 jjw
 
Amugona study 1회 jjw
Amugona study 1회 jjwAmugona study 1회 jjw
Amugona study 1회 jjw
 
Python3 brief summary
Python3 brief summaryPython3 brief summary
Python3 brief summary
 
하스켈 성능 튜닝
하스켈 성능 튜닝하스켈 성능 튜닝
하스켈 성능 튜닝
 
R 기초 : R Basics
R 기초 : R BasicsR 기초 : R Basics
R 기초 : R Basics
 
amugona study 2nd
amugona study 2ndamugona study 2nd
amugona study 2nd
 
Neural network (perceptron)
Neural network (perceptron)Neural network (perceptron)
Neural network (perceptron)
 
[Swift] Data Structure - Heap
[Swift] Data Structure - Heap[Swift] Data Structure - Heap
[Swift] Data Structure - Heap
 
BOJ10547
BOJ10547BOJ10547
BOJ10547
 
2012 Ds 02
2012 Ds 022012 Ds 02
2012 Ds 02
 
퀵 정렬 알고리즘 기초
퀵 정렬 알고리즘 기초퀵 정렬 알고리즘 기초
퀵 정렬 알고리즘 기초
 
자료구조02
자료구조02자료구조02
자료구조02
 
이산치수학 Project4
이산치수학 Project4이산치수학 Project4
이산치수학 Project4
 
Lecture 4: Neural Networks I
Lecture 4: Neural Networks ILecture 4: Neural Networks I
Lecture 4: Neural Networks I
 
이산치수학 Project7
이산치수학 Project7이산치수학 Project7
이산치수학 Project7
 
Differentiable Neural Computer
Differentiable Neural ComputerDifferentiable Neural Computer
Differentiable Neural Computer
 

More from 대영 노

Dev rookie codecomplete-1
Dev rookie codecomplete-1Dev rookie codecomplete-1
Dev rookie codecomplete-1대영 노
 
Google c++codingconvention
Google c++codingconventionGoogle c++codingconvention
Google c++codingconvention대영 노
 
Umg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation BoxUmg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation Box대영 노
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern대영 노
 
[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)
[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)
[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)대영 노
 

More from 대영 노 (7)

Dev rookie codecomplete-1
Dev rookie codecomplete-1Dev rookie codecomplete-1
Dev rookie codecomplete-1
 
Unrealjs
UnrealjsUnrealjs
Unrealjs
 
Google c++codingconvention
Google c++codingconventionGoogle c++codingconvention
Google c++codingconvention
 
Umg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation BoxUmg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation Box
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern
 
Start unreal
Start unrealStart unreal
Start unreal
 
[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)
[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)
[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)
 

[데브루키]노대영_알고리즘 스터디

  • 2. 알아 볼것 • 알고리즘 정의 조건 • 복잡도 • 자료구조 • 탐색 • 정렬 • 최단 거리 검색
  • 3. 정의 주어진 문제를 해결하기 위한 여러 동작들의 모임이다. 유한성을 가지며 , 언젠가 끝내야하는 속성이 필요하다
  • 4. 알고리즘의 조건 입력과 출력 : 입력할 데이터 와 문제가 처리 되면 하나 이상의 결과 값이 출력되야 한다. 정확성: 수행과정이 모호하지 않고 정확해야한다. 유한성: 유한번의 연산을 수행하고 유한시간내에 종료되어야한다 효과성: 알고리즘의 모든 연산들이 사람이 유한한 시간안에 정확히 수행가능해야함
  • 5. 알고리즘 평가 기준 정확성 : 입력 데이터와 수행 후 기대되는 출력에 대해 정확히 이해/일반적으로 수학적 귀납법으로 증명이 되어야한다 작업량: 알고리즘이 수행되는 시간적 비용이 적으면 좋다
  • 6. 알고리즘 평가 기준 최적성 : 가장 알려진 알고리즘이 아닌, 가장 좋은 알고리즘을 선택 기억장소 사용량 : 공간적 비용 , 입력데이터에 따라 저장하기 위한 공간이 달라진다
  • 7. 알고리즘 속도 비교 알고리즘 입력 데이터 알고리즘 A 알고리즘 B 100 100 ms 7 ms 10,000 10 s 14 ms 1,000,000,000 11 day 32 ms ? 알고리즘 B 는 알고리즘 A보다 약 15배 빠르다? 입력 데이터에 따라서 그 차이가 달라진다 기존의 표기법으로는 속도를 비교할 수 없다
  • 8. 시간적 , 공간적 복잡도 알고리즘의 절대적 실행 시간을 나타내는 것이 아닌 수행하는데 연산이 몇 번 이루어지는 지를 숫자로 표기함. 수식으로 T(n) 으로 표기하며 n은 입력한 데이터의 개수를 나타낸다 Ex) 해당 문제를 풀기위해 n번의 연산이 일어날 경우 T(n) 시간적 복잡도는 최고차항을 표기한다 Ex)T( ) = ( ) 공간적 복잡도는 입력데이터의 얼마만큼의 메모리영역을 쓰나 표기함 n x n 2차원 배열 Ex) 의 공간적 복잡도를 가짐 최근에는 하드웨어 성능이 많이 좋아져 시간적 복잡도에 신경을 더 많이 쓴다 𝑛2 + 2𝑛 𝑛2 𝑛2
  • 9. worse better 데이터가 많아질 수록 기하급수적으로 늘어나는 것들은 피하는게 좋다
  • 10. 점근적 표기법 Big-오 : 최악의 성능 표시 Big-오메가: 최고의 성능 표시 Big-세타 : 근접한 한계 성능 표시
  • 12. 분할정복 640 400 640 * 400 가장 큰 정사각 형으로 채우기? 작은것 부터 생각하자 400 * 400 만큼 사각형은 어차피 정사각형으로 채워질테니 영역에서 제외하고 240 * 400 의 영역 => 240 * 160 의 영역 이렇게 반복하면 최종적으로 80 * 80의 정사각형의 공간을 얻을 수 있음 알고리즘은 작은데서 부터 시작하는게 매우 중요하다
  • 13. 자료 구조(간단하게 알아봅시다) Data Data Data Data Data Data Data Data Data Data Data Data
  • 14. 배열 1 5 12 16 20 25 28 32 48 50 대부분 언어에서 지원되는 가장 기본적인 순차 자료구조이다 여러데이터를 하나의 이름으로 그룹핑해서 사용한다 1차원 , 2차원 , 3차원 배열 등으로 공간을 만들 수 있다 • 특징 1. 인덱스를 통한 읽기 속도가 빠르다 O(1) 2. 크기 제한이이 있다 3. 삽입과 삭제가 느리다 O(n) 1 5 12 16 20 25 28 32 48 50 2 12 23 25 34 39 40 44 55 64 3 19 34 34 48 53 52 56 62 78 4 26 45 43 62 67 64 68 69 92 5 33 56 52 76 81 76 80 76 106 6 40 67 61 90 95 88 92 83 120 7 47 78 70 104 109 100 104 90 134 8 54 89 79 118 123 112 116 97 148 9 61 100 88 132 137 124 128 104 162 10 68 111 97 146 151 136 140 111 176 1차원 배열 2차원 배열
  • 15. 연결 리스트 데이터들을 노드를 이용하여 분산 저장한다 각 노드는 다음 노드의 주소를 저장한다 • 특징 1. 검색속도는 O(n)의 시간으로 느리다 2. 크기가 가변적 3. 노드를 참조하여 삽입과 삭제가 빠르다O(1) 4. 다음 데이터의 노드를 알아야해서 배열보다 용량이 더 필요하다 Data 0 Data 1 Data 2 Data 3 Data 4 Data 5 Null Data 0 Data 1 Data 2 Data 3 Data 4 Data 5 Null Data 0 Data 1 Data 2 Data 3 Data 4 Data 5 단순 연결리스트 이중 연결리스트 원형 연결리스트
  • 16. 스택 선형 자료구조로 끝 인덱스에서 삽입과 삭제 LIFO(last in first out) 일어나는 자료구조이다 push 를 통해 데이터를 입력하고 pop을 통해 데이터를 가져온다 ex) 함수 호출 스택에서 이용된다 Data3Data3 Data1 Data2 Data3 push pop
  • 17. 큐 스택과 반대로 먼저 들어간 데이터가 먼저 나오는 FIFO(first in first out) 의 구조를 가지고 있다 스택과 큐를 합친 특별한 큐로 dequeue라는 자료구조도 있다 앞 뒤에서 빼내기 가능 ex) 함수 호출 스택에서 이용된다 Data1 Data3 Data1 Data2 Data3 push pop
  • 18. 해시맵 키를 넣고 해시함수를 통하여 데이터의 주소를 가지고 있는 burkets에 접근 한다 평균적으로 읽기속도가 빠르다 O(1) 하지만 삽입과 삭제는 느리다 해시맵을 읽기속도가 빠르기 위해서는 충돌을 피해야함 1. 해시가 골고루 분포한 해시함수를 쓰고(골고루 분포) 2. 사용율이 낮아야한다(리사이징 하여 충돌을 피함) 직접 값들을 추가하니 임계값 0.7 이상을 넘으면 해시맵 딕셔너리의 크기가 증가된다 *해시함수 : 임의의 값을 고정된 길이의 난수의 데이터(해시)를 생성 서로 다른 값은 다른 해시가 나온다 블랙핑크 트와이스 0 뚜두뚜두 1 빨간맛 2 3 Cheer Up! 4 hash function hash map(value) key 레드벨벳
  • 19. 그래프 객체간의 관계를 표현할 수 있는 자료구조를 뜻한다 V: 정점 노드를 뜻한다 E: 간선 정점을 정점끼리 연결하는것을 뜻한다 W: 가중치 간선의 가중치 값 Value를 뜻한다 인접 정점을 가진 정보를 행렬이나 리스트로 정리하여 연산을 한다 행렬은 빠른 접근이 가능하나 가용 메모리가 크다 리스트는 느리나 가용 메모리가 적다 비하여 간선의 개수가 적으면 리스트를 권장 에 비례하는 간선이 있는 그래프는 행렬을 권장 구로 국민 대 판교 우리 집 30 50 20 30 Edge Vertex Weight 집 구로 국민 판교 집 0 50 30 ∞ 구로 ∞ 0 ∞ 20 국민 ∞ ∞ 0 ∞ 판교 ∞ 30 ∞ 0 집 구로 50 국민 30 판교 구로 30 구로 판교 20 국민
  • 20. 다양한 그래프 구로 국민 대 판교 우리 집 구로 국민 대 판교 우리 집 할아버지 아버지 나 동생 삼촌 사촌동생 양방향 그래프 무방향 그래프 트리 구로 국민 대 판교 우리 집 가중치 그래프 30 50 20 30
  • 21. 자료구조 시간적 복잡도 평균과 최악의 시간적복잡도에 따라 의도와 다른 경우를 가져올 수 있다
  • 22. 탐색 알고리즘 1 5 12 16 20 25 28 32 48 50 리스트에 50 있음? 주어진 데이터 집합에서 입력한 값을 찾는거다 단순 탐색과 이진 탐색에 대해서 알아보겠습니다
  • 23. 단순 탐색 (Linear Search) 1 5 12 16 20 25 28 32 48 50 리스트에 50 있음? 1 , 5 , 12…. 50 가장 기초적인 탐색 첫 인덱스 부터 끝 인덱스까지 순차적으로 탐색한다 O(n)의 시간이 걸린다
  • 24. 반복문에서 인덱스를 높여가며 계속 검색한다 크기가 큰 데이터 일수록 그 탐색시간은 엄청 늘어나게 된다 O(n)
  • 25. 병뚜껑에는 1~ 50 사이에 숫자가 적혀있다 이 번호를 빨리 찾기 위해서는 어떻게 해야할까?
  • 26. 이진 탐색 (Binary Search) 1 5 12 16 20 25 28 32 48 50 리스트에 50 있음? 25 up 32 up 50 find 데이터 안에 값들이 정렬 되어있어야하는 조건이 필요하다 중간 부터 탐색을 시작하며 찾는 값과 비교하며 찾는 위치를 좁혀나간다
  • 27. 인덱스 중간부터 탐색을 시작하여 입력값과 비교하여 다음 값으로 이동한다 O( )𝑙𝑜𝑔2 𝑛
  • 28. 단순 vs 이진 0.1 1. 10. 100. 1000. 10000. 1 10 100 1000 10000 함수수행시간 데이터 개수 단순 이진 검색해야할 데이터 개수가 많을 수록 단순 탐색의 시간전 복잡도는 선형 비례하여 증가한다 정렬이 된 데이터라면 이진 탐색을 이용하는것이 바람직하다
  • 29. 이진 탐색 트리 10 5 1 6 17 1 61 61 61 61 6 1 614 21 7 7 이진 탐색이 적용된 트리이다 정점의 값을 기준으로 정점보다 값이 작으면 왼쪽 크면 오른쪽으로 보낸다 한 정점에 노드는 최대한 두개로 제한한다 남는 노드가 없을시 정점에 연결된 노드로 이동한 후 비어 있는 노드에 연결 된다 탐색 , 삽입 , 제거 속도는 평균적으로 O(log n) 정렬된 이진 트리에서는 최악도 O(log n)
  • 30. 완전 , 편향 이진트리 편 안 불 편 한쪽으로 노드가 밀집 되어있는 트리를 편향 트리라 한다 이진 탐색트리의 성능을 발휘할 수 없다 이러한 문제점을 해결하기 위해 B-Tree , Heap , red-black Tree , splay Tree 등으로 트리 노드를 재구성한다 데이터가 골고루 분포하게 되면 이진트리의 장점을 살릴 수가 있다
  • 31. 정렬 알고리즘 1 4 3 2 1 2 3 4 How?
  • 32. 선택 정렬 (단순하게) 최선 , 최악의 경우 O( )𝑛2 첫 인덱스 부터 끝 인덱스 까지 대소비교 하여 정렬을 한다 구현이 가장 간단하다 하지만 가장 느리기에 거의 쓰지 않는다 2 3 5 6 7 4 1 1 3 5 6 7 4 2 교환 교환 1 2 5 6 7 4 3 교환 1 2 3 6 7 4 5 교환 1 2 3 4 5 6 7
  • 33. 삽입 정렬 정렬된 부분에 있는 요소들과 정렬되지 않는 요소들을 비교해서 정렬된 부분위치에 삽입한다 퀵 정렬에 비해 느리지만 이미 정렬된 리스트에 다른 요소를 더해 다시 정렬할 때 쓰면 유용하다 최선O(n) , 최악의 경우 O( )𝑛2 2 3 5 6 7 4 1 1 2 3 4 5 6 7 2 3 5 6 7 4 12 5 6 7 4 12 3 12 3 5 6 7 4 8 4
  • 34. 버블 정렬 거품이 빠지는 모습과 유사하다하여 버블 인접한 요소들과 비교하며 최대값이 오른쪽으로 이동하게 된다 삽입 정렬과 마찬가지로 정열이 되있는 데이터에 소규모 데이터 삽입시 O(n)의 시간을 가진다 최선O(n) , 최악의 경우 O( )𝑛2 2 3 5 6 7 4 1 1 3 5 6 7 4 2 교환 교환 1 2 5 6 7 4 3 교환 1 2 3 6 7 4 5 교환 1 2 3 4 5 6 7
  • 35. 쉘 정렬 삽입 정렬과 유사한 형태이다 특정 간격(gap)을 둔 그룹끼리 대소비교를 하여 정렬을 한다. 간격을 점점 줄여나가 정렬을 진행한다 간격을 어떻게 두냐에 따라서 성능이 많이 달라진다 최선O(n) , 최악의 경우 O( ) 2 3 5 6 7 4 1 1 3 4 2 7 5 6 1 3 4 2 7 5 6 1 2 4 3 6 5 7 1 2 4 3 6 5 7 1 2 3 4 5 6 7 (𝑛𝑙𝑜𝑔𝑛)2
  • 36. 쉘 정렬 shell = ⌊ 𝑁 2 𝑘 ⌋ prath = 3 𝑘 − 1 2 < [ 𝑛 3 ] gap sequence Big-O Gap 을 정하는 알고리즘에 따라 시간적 복잡도가 달라진다
  • 37. 병합 정렬 리스트를 두 부분으로 쪼개는 작업을 재귀적으로 호출 분할 정복 알고리즘의 일종이다 모두 쪼갠 후 쪼갠것을 합쳐가며 정렬을 한다 최선O(n log n) , 최악의 경우 O( n logn ) 5 3 2 6 4 1 5 3 2 6 4 1 5 3 2 6 4 1 3 5 2 64 1 2 3 5 1 4 6 1 2 3 4 5 6
  • 38. 퀵 정렬 병합정렬과 같은 분할정복 정렬 알고리즘이다 기준값을 정하고 기준값을 기준으로 작은값과 큰값을 분리하고 다시 분리한 값에서 기준값을 다시 산정해서 잘개 쪼갠다 평균 시간적복잡도 O(nlog n) 정렬알고리즘중 가장 빠르다(Heap , Merge) 최선O(nlogn) , 최악의 경우 O( )𝑛2 4 3 2 6 5 1 7 3 2 1 4 6 5 7 1 2 3 4 6 5 7 1 2 3 4 5 6 7 기준값 선택 왼쪽 정렬 오른쪽 정렬 기본적인 동작 내용은 이렇다 하지만 리스트를 복사해서 이어붙이는 경우 메모리를 많이 쓰기 때문에 내부에서 정렬하게 구현하는게 좋다
  • 39. 퀵 정렬 20 48 24 43 17 15 25 54 1 4 8 67 Lpivot RR 20 8 24 43 17 15 25 54 1 4 48 67 pivot L과 R이 만날때까지 수행L R 정렬 함수는 재귀적으로 호출되며 탐색 범위를 벗어나면 종료 왼쪽 인덱스와 오른쪽 인덱스를 분리하여 탐색 왼쪽 인덱스는 피벗값보다 큰 값을 찾을때 까지 오른쪽으로 이동 오른쪽 인덱스는 피벗값보다 작은 값을 찾을때 까지 왼쪽으로 이동 왼쪽 과 오른쪽 값을 교환 값을 찾을때 까지 왼쪽 인덱스가 오른쪽 인덱스와 같거나 크게 되면 이전 동작 수행 x ,피벗값과 오른쪽 인덱스 값을 변경한다 20 8 24 43 17 15 25 54 1 4 48 67 pivot L R 20 8 4 43 17 15 25 54 1 24 48 67 pivot L R
  • 40. 퀵 정렬 20 8 4 43 17 15 25 54 1 24 48 67 pivot L R 20 8 4 1 17 15 25 54 43 24 48 67 pivot LR 20 8 4 1 17 15 25 54 43 24 48 67 pivot L RLR 15 8 4 1 17 20 25 54 43 24 48 67 pivot p = 5 15 8 4 1 17 20 25 54 43 24 48 67 pivot LRL 1 8 4 15 17 20 25 54 43 24 48 67 pivot p = 3 1 8 4 15 17 20 25 54 43 24 48 67 p L R R 1 8 4 15 17 20 25 54 43 24 48 67 p LR 탐색 범위가 좁아짐 R과 피벗의 위치는 같기 때문에 교환 x 1 8 4 15 17 20 25 54 43 24 48 67 p =0 h = 2 , p =0 quick_sort( a , 0 , -1) <= 재귀를 빠져나온다 quick_sort(a, 1 ,2 ) ? h = 11, p = 5, quick_sort( a , 0 , 4) quick_sort(a, 6 , 11) h = 4, p = 3, quick_sort( a , 0 , p -1) quick_sort(a, 4, 4) => 재귀 빠져나옴 1 8 4 15 17 20 25 54 43 24 48 67 p RL L과 R 위치가 같음 R과 p 값 교환 1 4 8 15 17 20 25 54 43 24 48 67 l=1,h = 2 , p =2 quick_sort( a , 1 , 1) <= 재귀를 빠져나온다 quick_sort(a, 3 ,2 ) <= 재귀를 빠져나옴 다음장에서 마무리 L >= R L과 R 교환 x L >= R p와 R 교환
  • 41. 퀵 정렬 1 4 8 15 17 20 25 54 43 24 48 67 quick_sort(a, 6 , 11) p L RR 1 4 8 15 17 20 25 24 43 54 48 67 p LR pivot 보다 작은 값은 없다 1 4 8 15 17 20 24 25 43 54 48 67 p LRL >= R p와 R 교환 1 4 8 15 17 20 24 25 43 54 48 67 p LR l=6,h = 11 , p =6 quick_sort( a , 6 , 6) <= 재귀를 빠져나온다 quick_sort(a, 7 ,11 ) 1 4 8 15 17 20 24 25 43 54 48 67 Rp L l=7,h = 11 , p =7 quick_sort( a , 7 , 6) <= 재귀를 빠져나온다 quick_sort(a, 8 ,11 ) 1 4 8 15 17 20 24 25 43 54 48 67 Rp Lpivot 보다 작은 값은 없다 l=8,h = 11 , p =8 quick_sort( a , 8 , 7) <= 재귀를 빠져나온다 quick_sort(a, 9 ,11 ) 1 4 8 15 17 20 24 25 43 54 48 67 R LL >= R p와 R 교환 1 4 8 15 17 20 24 25 43 48 54 67 l=9,h = 11 , p =9 quick_sort( a , 9 , 8) <= 재귀를 빠져나온다 quick_sort(a, 10 ,11 ) p 1 4 8 15 17 20 24 25 43 48 54 67 LpRL >= R p와 R의 위치는 같다 l=10 , h = 11 , p =10 quick_sort( a , 10 , 10) <= 재귀를 빠져나온다 quick_sort(a, 11 ,11 ) < = 재귀 종료, 정렬 함수가 모두 종료된다
  • 42. 퀵 정렬 최악의 경우 1 4 8 15 17 20 24 25 43 48 54 67 기준이 되는 값이 리스트에서 가장 작을 경우 불균형을 이룬다 최악의 경우 퀵 정렬이라해도 O( ) 시간적 복잡도를 가진다 1 4 8 15 17 20 24 25 43 48 54 67 𝑛2 1 4 8 15 17 20 24 25 43 48 54 67 1 4 8 15 17 20 24 25 43 48 54 67 O(nlog n) 속도를 가진 병합 정렬 , 힙 정렬 보다 좋은 평균 속도를 가진다 이미 정렬된 리스트라면 삽입 정렬 , 버블 정렬을 쓰는게 O(n)의 시간을 가질 수 있다.
  • 43. 힙 정렬 완전 이진 힙트리 특성을 이용한 정렬이다 완전 이진 힙트리 특성은 다음과 같다 각 정점은 부모보다 큰 값을 가질 수 없다 각 정점은 최대 두개의 자식을 가질 수 있다 마지막 레벨 노드는 왼쪽 부터 채워진다 맨 위에 부터 차례대로 뽑아내서 가져오면 정렬이 가능하게 된다 최악 O(nlogn)의 준수한 성능을 보장한다
  • 44. 계수 정렬 1 0 0 1 1 2 2 3 0 4 0 1 0 1 2 3 4 4 4 2 1 1 0 0 0 0 1 1 1 1 2 2 3 4 이전에 녀석들은 비교가 필요했던 정렬알고리즘이다 하지만 계수 정렬은 비교 없이 리스트의 요소 개수 만큼 배열을 만들고 그 요소들을 끝까지 계수한 후 차례대로 정렬하는 알고리즘이다 선형시간을 가지는 효율적인 알고리즘이다 O(n + k) => 최대값 k가 무한히 클경우 무한의 시간 최대값이 정해져야하며 => 크기가 크면 메모리낭비가 심 max값 산출이 선행되야한다 먼저
  • 45. 기수 정렬 120 432 541 49 8 35 0 1 2 3 4 5 6 7 8 9 120 541 432 35 08 49 0 1 2 3 4 5 6 7 8 9 008 120 432 035 541 049 0 1 2 3 4 5 6 7 8 9 8 35 49 120 432 541 비교가 필요없는 정렬알고리즘 시간복잡도 O(kn) 을 가진다 k => 버킷수 정렬 레코드 타입 제한이 필요하다 각자리의 비트값에 따라 버킷에 넣고 최대 자릿수 비교 할때까지 반복한다 문자열 정렬할때 사용하면 좋다
  • 46. 버킷 정렬 대상 데이터를 분포 특성을 활용하여 O(n)수준으로 개선 시키는 목적으로 사용하는 알고리즘 , 버킷 정렬 데이터가 고루 분포 되어있을 때 좋은 속도를 가진다 버킷 리스트에 정렬이 필요하다. 버킷의 특성에 의하 여 순서대로 담는거이기 때문에 정렬을 해줘야함 버킷내에서 그 이후 정렬된 버킷을 순서대로 합치면 정렬된 리스트를 얻을 수 있다.
  • 49. 최단 경로 A CB D E F 앞에서 그래프에서 정점과 간선의 정보를 인접 행렬 혹은 인접 리스트로 구현한다고 했습니다 저는 인접리스트로 구현해서 설명을 하겠습니다 *set : python에서 중복값이 없는 자료형 A B C B A D E C B C D B E B F F C E 정점당 간선의 정보를 리스트로 저장
  • 50. 너비 우선 탐색 (BFS) , 깊이 우선 탐색 (DFS) Breadth Depth 깊이 레이어를 나누어 차례로 탐색 선택한 정점에서 가장 깊은 곳을 먼저 탐색 DFSBFS A CB D E F A CB D E F
  • 51. 너비 우선 탐색 (BFS) 1 32 5 4 6
  • 52. 너비 우선 탐색 (BFS) A C B A Bqueue A C 시작점과 연결된 정점을 찾고 탐색 큐에 저장한다 , B C A CB D E F
  • 53. 너비 우선 탐색 (BFS) A C B queue F A B A C FB F D E Dqueue A B D E A B E A C FF A CB D E F
  • 54. 너비 우선 탐색 (BFS) A C B F D E Dqueue A B D F A B E F A C FF result A C FF 경로가 없음 도착 A CB D E F
  • 55. 너비 우선 탐색 (BFS) A C B F D E queue F A B E F result A C FF F A B E F A CB D E F
  • 56. 깊이 우선 탐색 (DFS) 1 25 6 4 3
  • 57. 깊이 우선 탐색 (DFS) A B A Bstack 시작점과 연결된 정점을 찾고 탐색 스택에 저장한다 B C A CC A CB D E F
  • 58. 깊이 우선 탐색 (DFS) A C B stack F A BB D E D stack A B D E A B EA CC A CC A CB D E F
  • 59. 깊이 우선 탐색 (DFS) A C B D E F A C B F D E D stack A B D E A B EA CC stack F A B E FA CC
  • 60. 깊이 우선 탐색 (DFS) A C B D E F A C B F D E queue F A B E F result F A B E F A CC
  • 61. 깊이 우선 탐색 (DFS) A C B D E F A C B F D E queue result A B E F A CC queue A C FF A C F
  • 62. 깊이 우선 탐색 (DFS) A C B D E F A C B F D E queue result A B E F A CC queue A C FF A C F
  • 64. 다익스트라 알고리즘 구 현 시작점에서 이어진 모든 간선의 코스트를 업데이트하고 코스트가 가장 적은 녀석들 부터 다음 간선까지의 비용을 업데이트한다 계산한 비용이 이전 리스트에 저장한 비용보다 적다면 새로운 경로와 비용을 업데이트한다
  • 65. 다익스트라 알고리즘 A C B D F 30 15 20 10 E 20 5 20 5 A B C D E F A 0 None ∞ None ∞ None ∞ None ∞ None ∞ B A 10 C A 30 D A 15 A B C D E F A 0 A 10 A 30 A 15 None ∞ None ∞
  • 66. 다익스트라 알고리즘 A C B D F 30 15 20 10 E 20 5 20 5 A B C D E F A 0 A 10 A 30 A 15 None ∞ None ∞ E B 20 A B C D E F A 0 A 10 A 30 A 15 B 30 None ∞ B A 10 E B 30
  • 67. 다익스트라 알고리즘 A C B D F 30 15 20 10 E 20 5 20 5 A B C D E F A 0 A 10 A 30 A 15 B 30 None ∞ A B C D E F A 0 A 10 D 20 A 15 B 30 None ∞ C D 5 D A 15 C D 20
  • 68. 다익스트라 알고리즘 A C B D F 30 15 20 10 E 20 5 20 5 A B C D E F A 0 A 10 A 30 A 15 B 20 None ∞ A B C D E F A 0 A 10 D 20 A 15 B 30 C 25 F C 5 C D 20 F C 25
  • 69. 다익스트라 알고리즘 A C B D F 30 15 20 10 E 20 5 20 5 A B C D E F A 0 A 10 D 20 A 15 B 30 C 35 F C 35 C D 20 D A 15 가장 적게 비용이 드는 경로를 가져오면 최단 경로는 A->D->C->F
  • 70. 정리 • 자료 구조는 읽기 ,삽입 , 삭제에 따라 맞는 자료구조를 이용하 면 좋다 • 이진 탐색은 단순 탐색 보다 빠르게 탐색 가능 하지마 정렬이 필요 • 정렬은 최악 , 최적 시간적 복잡도가 다르므로 상황에 따라 쓰 는게 중요 • 큰 문제를 작은 곳 부터 시작하는 분할 정복이 알고리즘의 핵 심
  • 71. 더 공부해야할 것들 A *알고리즘 탐욕 알고리즘 NP문제 KNN 알고리즘 문자열 다루기 등 다음기회에…