Coursera Standford University Algorithms 분야의 두 번째 강의인 Graph Search, Shortest Paths, and Data Structures의 수강을 완료했다. 수강 기간은 2020년 1월 29일 ~ 2020년 2월 21일.
- Divide and Conquer, Sorting and Searching, and Randomized Algorithms
- Graph Search, Shortest Paths, and Data Structures
- Greedy Algorithms, Minimum Spanning Trees, and Dynamic Programming
- Shortest Paths Revisited, NP-Complete Problems and What To Do About Them
첫 번째 강의보다 쉽고 재밌었다. 알고리즘보다 자료구조를 좋아하는 성향 때문인 것 같기도 하고, 수식이 덜 나와서 그런 것 같기도 하고, 무엇보다 Programming Assignment가 가장 재미있어서 매주 할당된 강의를 다 소화하기도 전에 관련 내용 공부가 끝나면 바로 도전했다. 이번에도 역시 Go언어를 사용했고 그 과정은 즐거웠다.
공부한 주제들 중 비중있는 녀석들의 제목만 추려보면 다음과 같다.
- Graph Search
- Connected Components
- Shortest Paths
- Dijkstra’s Algorithm
- Heap
- Balanced Binary Search Tree
- Red-Black Tree
- Hash Table
- Bloom Filter
2월 13일 아내의 복직 이후로 육아를 전담하게 되면서, 아이가 깨어나기 전 새벽에, 낮잠 잘 때, 잠든 후 밤 늦게 틈틈히 공부한다고 눈 앞에 보이는 주제에만 겨우 집중했는데, 4주 과정을 다 종합해보니 이렇게 많이 다뤘나 싶다.
Correctness에 대한 Proof, Performance에 대한 Analysis 그리고 틀린 시험 문제 등 100% 이해하지 못하고 넘어가는 부분들이 꺼림직하게 느껴질 때도 있지만, ‘공부를 이어나가는 게 어딘가’ 하는 핑계를 대어본다. 그래도 허락된 시간 안에서는 관련 자료도 찾아보면서 이해하려고 애썼던 기억이 난다. ‘회사에 있을 때 동료들과 같이 강의를 소화하면서 서로 모르는 것 물어보고 토론할 수 있었다면 더 좋았을텐데’ 하는 아쉬움이 남는다.
지금까지 3개의 Programming Assignment에서 Graph를 사용했는데, 3개의 Graph를 별도로 구현해야했다. 필요한 operation이 서로 다르고, 각 operation에 대하여 최적의 실행시간을 제공하기 위해선 내부 자료구조도 다를 수 밖에 없었기 때문이다. 반면에 최근 몇년간 업무에서 사용했던 자료구조는 대부분 프로그래밍 언어에서 제공하는 Hash Table을 확장한 수준을 벗어나지 못했다. 개발자로서 실력을 유지하려면 PS를 취미로 하는 등 별도의 개인적인 노력이 필요할 것 같다고 느꼈다.
세 번째 강의를 듣기 전에 2~3주 정도의 공백을 두려고 한다. 그 사이에는 Dijkstra’s Algorithm에서 Heap을 사용하는 버전을 Go언어로 구현해보고, 이 강의를 들으면서 시간 부족으로 중단했던 <Go 언어를 활용한 마이크로서비스 개발>의 진도를 뽑아볼 생각이다. Dijkstra’s Algorithm에서 사용하는 Heap은 중간 노드를 삭제할 수 있는 operation이 필요해서 직접 구현해야 하기 때문에 좋은 공부가 될 것 같다.