산포된 데이터를 정합하는 직선을 찾는 것으로 이해해도 무방합니다. 주어진 데이터를 이용해 기울기와 절편을 구하는 방법입니다.
먼저 행렬연산을 통해 구하는 방법을 설명합니다. 그리고 퍼셉트론에 사용된 것과 같은 방법을 다시 설명하므로 선택적으로 듣기 바랍니다.
설명된 예제에 대한 C 언어 코드를 제공합니다. Tensorlow 코드는 정합 과정을 시각화하여 보여줍니다.
산포된 데이터를 정합하는 직선을 찾는 것으로 이해해도 무방합니다. 주어진 데이터를 이용해 기울기와 절편을 구하는 방법입니다.
먼저 행렬연산을 통해 구하는 방법을 설명합니다. 그리고 퍼셉트론에 사용된 것과 같은 방법을 다시 설명하므로 선택적으로 듣기 바랍니다.
설명된 예제에 대한 C 언어 코드를 제공합니다. Tensorlow 코드는 정합 과정을 시각화하여 보여줍니다.
Introduce shortest path algorithms(Korean)Wonjae Kim
Introduce shortest path algorithms(Korean) in Hongik University.
1. Bellman-Ford
2. Dijkstra
3. Floyd-Warshall
Extra) A*
In this slide, Source of graph images is stackexchange
1. http://cs.stackexchange.com/questions/18138/dijkstra-algorithm-vs-breadth-first-search-for-shortest-path-in-graph
2. http://cs.stackexchange.com/questions/14248/what-is-the-significance-of-negative-weight-edges-in-a-graph
If it is a problem or can be, Let me know it ( wonjaek36@gmail.com )
Introduce shortest path algorithms(Korean)Wonjae Kim
Introduce shortest path algorithms(Korean) in Hongik University.
1. Bellman-Ford
2. Dijkstra
3. Floyd-Warshall
Extra) A*
In this slide, Source of graph images is stackexchange
1. http://cs.stackexchange.com/questions/18138/dijkstra-algorithm-vs-breadth-first-search-for-shortest-path-in-graph
2. http://cs.stackexchange.com/questions/14248/what-is-the-significance-of-negative-weight-edges-in-a-graph
If it is a problem or can be, Let me know it ( wonjaek36@gmail.com )
4. 위상 정렬(Topological Sorting)
2020 AL林 정기 스터디 4
의존성이 있는 작업들이 주어질 때, 수행해야 하는 순서
유향 그래프의 정점을 방향을 거스르지 않도록 나열하는 것
(유향 그래프의 정점을 정렬하는 것)
“간선 (i, j)가 존재하면 정렬 결과에서 정점 i는 반드시 정점 j보다 앞에 위치해야 한다.”
5. 위상 정렬(Topological Sorting)
2020 AL林 정기 스터디 5
“간선 (i, j)가 존재하면 정렬 결과에서 정점 i는 반드시 정점 j보다 앞에 위치해야 한다.”
정렬할 그래프는
1. 유향 그래프이며
2. 사이클이 없어야 합니다. (위 성질을 만족할 수 없죠)
6. ※ 참고
2020 AL林 정기 스터디 6
이러한 그래프를
DAG(Directed Acyclic Graph)라고 합니다.
※ 의존성 그래프(dependency graph)라고 하기도 합니다
정렬할 그래프는
1. 유향 그래프이며
2. 사이클이 없어야 합니다.
7. 위상 정렬의 예
2020 AL林 정기 스터디 7
1. 대학의 선수과목
2. 요리
3. 스타크래프트
등등...
11. 풀어볼 문제 줄 세우기(BOJ 2252번)
2020 AL林 정기 스터디 11
https://www.acmicpc.net/problem/2252
N명의 학생들을 키 순서대로 줄을 세우려고 한다.
각 학생의 키를 직접 재서 정렬하면 간단하겠지만, 마땅한 방법이 없어서 두 학생의 키를 비교하는 방법을 사용하
기로 하였다. 그나마도 모든 학생들을 다 비교해 본 것이 아니고, 일부 학생들의 키만을 비교해 보았다.
일부 학생들의 키를 비교한 결과가 주어졌을 때, 줄을 세우는 프로그램을 작성하시오.
12. 풀어볼 문제 줄 세우기(BOJ 2252번)
2020 AL林 정기 스터디 12
[입력]
N = 3
M = 2
1 < 3
2 < 3
학생들의 번호는 1번부터 N번, M은 키를 비교한 회수
답이 여러 가지인 경우에는 아무거나 출력한다.
[출력]
1 2 3
13. 풀어볼 문제 줄 세우기(BOJ 2252번)
2020 AL林 정기 스터디 13
[입력]
N = 8, M = 6
1 4
2 3
2 4
4 5
6 7
5 8
[출력]
1 2 3 4 6 5 7 8
24. 위상 정렬 알고리즘 ① : Queue
2020 AL林 정기 스터디 24
아이디어는 쉽습니다.
하지만 어떻게 구현해야 효율적일까요?
25. 위상 정렬 알고리즘 ① : Queue
2020 AL林 정기 스터디 25
for i ← 1 to n {
① 진입 간선이 없는 정점 u를 선택한다.
② A[i] = u
③ 정점 u와 u의 진출 간선을 모두 제거한다.
}
return A[]
26. 위상 정렬 알고리즘 ① : Queue
2020 AL林 정기 스터디 26
Q = Queue()
INDEGREE = [0, 0, ..., 0]
1. 각 정점마다 진입 간선의 수를 INDEGREE에 저장한다.
2. 진입 간선이 없는 정점(INDEGREE[i] == 0)을 모두 Q에 넣는다.
27. 위상 정렬 알고리즘 ① : Queue
2020 AL林 정기 스터디 27
result = List()
while (Q is not empty) {
① u = Q.pop()
② result.push(u)
③ for (u에 인접한 정점 v에 대해서){
INDEGREE[v] -= 1
if (INDEGREE[v] == 0) Q.push(v)
}
}
return result
28. 위상 정렬 알고리즘 ① : 소스코드(python)
2020 AL林 정기 스터디 28
29. 위상 정렬 알고리즘 ① : 소스코드(python)
2020 AL林 정기 스터디 29
30. 위상 정렬 알고리즘 ① : 소스코드(python)
2020 AL林 정기 스터디 30
Queue 풀이 (소스코드 전체)
http://boj.kr/e6f76e4167714f60852b3cf559aaefad
31. 위상 정렬 알고리즘 ② : DFS
2020 AL林 정기 스터디 31
사실 방금까지 한 위상 정렬은
DFS 종료 순서를 뒤집기만 하면 됩니다.
32. 위상 정렬 알고리즘 ② : DFS
2020 AL林 정기 스터디 32
DFS(u) {
visited[u] = True
for (u에 인접한 정점 v에 대해서)
if (visited[v] = False) DFS(v)
result.push(u)
}
33. 위상 정렬 알고리즘 ② : DFS
2020 AL林 정기 스터디 33
result = List()
for (모든 정점 u에 대해서)
visited[u] = False
for (모든 정점 u에 대해서)
if (visited[u] = False) DFS(u)
reverse(result) // result 를 뒤집는다.
return result
34. 위상 정렬 알고리즘 ② : 소스코드(python)
2020 AL林 정기 스터디 34
35. 위상 정렬 알고리즘 ② : 소스코드(python)
2020 AL林 정기 스터디 35
36. 위상 정렬 알고리즘 ② : 소스코드(python)
2020 AL林 정기 스터디 36
DFS 풀이 (소스코드 전체)
http://boj.kr/1db6303b1a6a47c48abc2723cf2b7cd9
37. 위상 정렬 알고리즘 ② : DFS
2020 AL林 정기 스터디 37
이 방법은 먼저 알아본 방법에 비해서
상당히 비직관적입니다.
이 알고리즘의 정당성을 증명해볼까요?
38. 위상 정렬 알고리즘 ② : DFS 정당성
2020 AL林 정기 스터디 38
귀류법으로 증명합니다. (알고리즘 문제 해결 전략 831페이지를 참고했습니다.)
위상 정렬 결과에서 역행하는 간선 (u,v)가 있다고 가정해봅시다.
위상 정렬 결과의 예 : {3, 2, ... , v, ... ,u, ..., 9, ...}
이 결과가 나오기 위해서는 dfs(u)가 종료한 후 dfs(v)가 종료했다는 것입니다.
dfs(u)는 종료 전에 인접한 간선을 모두 보기 때문에 (u,v) 또한 검사했을 것입니다.
39. 위상 정렬 알고리즘 ② : DFS 정당성
2020 AL林 정기 스터디 39
이때 dfs(u)에서
1. visited[v]가 거짓일 경우
dfs(u)를 dfs(v)를 재귀 호출했을 것입니다.
따라서 dfs(v)가 종료된 후에 dfs(u)가 종료되었을 것이고 v는 u의 왼쪽에 있을 수 없습니다.
2. visited[v]가 참일 경우
dfs(v)는 이미 한번 호출되었어야 합니다.
그런데 dfs(v)가 dfs(u)보다 늦게 끝나기 위해서는, dfs(v)가 현재 실행 중이어야 합니다.
이렇게 되기 위해서는 v에서 u로 가는 경로가 필요합니다. (dfs(v) -> dfs(u)로 재귀호출)
하지만 그렇다면 그래프는 사이클을 형성합니다.
40. 위상 정렬 알고리즘 ② : DFS
2020 AL林 정기 스터디 40
따라서 DFS로 얻어낸 위상 정렬의 결과에서
(u, v)인 간선이 있을 경우
u는 v의 왼쪽에 있을 수 밖에 없습니다!
42. 다시보기
2020 AL林 정기 스터디 42
result = List()
while (Q is not empty) {
① u = Q.pop()
② result.push(u)
③ for (u에 인접한 정점 v에 대해서){
INDEGREE[v] -= 1
if (INDEGREE[v] == 0) Q.push(v)
}
}
return result
43. 큐의 크기를 통해서 알 수 있는 것
2020 AL林 정기 스터디 43
① 중간에 큐가 비어버리면 (루프가 N번 진행되지 않으면)
위상 정렬이 불가능한데 이 경우는 사이클이 있는 경우입니다.
(사이클이 있으면 위상정렬을 할 수 없다고 했죠.)
② 중간에 큐의 크기가 2 이상인 경우가 있다면
위상 정렬의 결과가 2개 이상입니다.
(큐에서 pop할 때 빼낼 수 있는 원소가 여러개라서 그렇습니다.)
44. Queue(BFS) vs DFS
2020 AL林 정기 스터디 44
일단 Queue를 이용한 방법이 더 직관적이고
딱히 DFS를 이용하지 않아도 위상 정렬 문제들은 풀립니다.
(저는 위상정렬 문제 대부분 Queue 써서 풀었습니다.)
하지만 알고리즘 대회를 준비한다면
DFS를 이용한 위상 정렬도 알아두는게 좋습니다.
(2-SAT에서 SCC DAG 위상 정렬할 때 써요)
45. earliest time
2020 AL林 정기 스터디 45
DP + Topological Sort
연습문제 : 작업 (BOJ 2056 ), ACM Craft (BOJ 1005)
https://www.acmicpc.net/problem/2056
https://www.acmicpc.net/problem/1005
46. critical path(임계경로)
2020 AL林 정기 스터디 46
A critical path is a longest path through the DAG, corresponding to the
longest time to perform any sequence of jobs. Thus, the weight of a critical
path provides a lower bound on the total time to perform all the jobs.
연습문제 : 임계경로 (BOJ 1948)
https://www.acmicpc.net/problem/1948