|
@@ -75,12 +75,12 @@ Thêm vào đó, nếu bạn muốn trở thành một kỹ sư hệ thống (Sy
|
|
|
- Sắp xếp chọn vun đống (Heapsort)
|
|
|
- Sắp xếp nhanh (Quicksort)
|
|
|
- Sắp xếp trộn (Merge Sort)
|
|
|
-- [Graphs](#graphs)
|
|
|
- - directed
|
|
|
- - undirected
|
|
|
- - adjacency matrix
|
|
|
- - adjacency list
|
|
|
- - traversals: BFS, DFS
|
|
|
+- [Đồ thị](#đồ-thị)
|
|
|
+ - có hướng
|
|
|
+ - vô hướng
|
|
|
+ - ma trận kề
|
|
|
+ - danh sách kề
|
|
|
+ - duyệt đồ thị: BFS, DFS
|
|
|
- [Even More Knowledge](#even-more-knowledge)
|
|
|
- [Recursion](#recursion)
|
|
|
- [Object-Oriented Programming](#object-oriented-programming)
|
|
@@ -911,5 +911,69 @@ Nếu bạn muốn biết thêm chi tiết trong chủ đề này, xem qua phầ
|
|
|
> TODO replace sections anchor after translate "Additional Detail on Some Subjects"
|
|
|
|
|
|
|
|
|
+## Đồ thị
|
|
|
+
|
|
|
+Đồ thị có thể được sử dụng để miêu tả nhiều bài toán trong khoa học máy tính, vậy nên phần này cũng khá dài, tương đương với [Cây](#cây) và [Sắp xếp](#sắp-xếp).
|
|
|
+
|
|
|
+- Ghi chú từ Yegge:
|
|
|
+ - Có 3 cách cơ bản để thể hiện một đồ thị trong bộ nhớ:
|
|
|
+ - Các đối tượng (objects) và con trỏ (pointers)
|
|
|
+ - Ma trận
|
|
|
+ - Danh sách kề (adjacency list)
|
|
|
+ - Hãy làm quen với mỗi cách thể hiện và nắm vững ưu, nhược của nó.
|
|
|
+ - BFS và DFS - biết về độ phức tạp tính toán của chúng, ước lượng những sự được và mất khi sử dụng, và cài đặt chúng như thế nào
|
|
|
+ - Khi được trao cho một bài toán, hãy thử tìm một giải thuật sử dụng đồ thị trước khi nghĩ đến các hướng giải quyết khác.
|
|
|
+
|
|
|
+- [ ] Các bài giảng của giáo sư Skiena, tốt để dẫn nhập:
|
|
|
+ - [ ] [CSE373 2012 - Lecture 11 - Graph Data Structures (video)](https://www.youtube.com/watch?v=OiXxhDrFruw&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=11)
|
|
|
+ - [ ] [CSE373 2012 - Lecture 12 - Breadth-First Search (video)](https://www.youtube.com/watch?v=g5vF8jscteo&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=12)
|
|
|
+ - [ ] [CSE373 2012 - Lecture 13 - Graph Algorithms (video)](https://www.youtube.com/watch?v=S23W6eTcqdY&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=13)
|
|
|
+ - [ ] [CSE373 2012 - Lecture 14 - Graph Algorithms (con't) (video)](https://www.youtube.com/watch?v=WitPBKGV0HY&index=14&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)
|
|
|
+ - [ ] [CSE373 2012 - Lecture 15 - Graph Algorithms (con't 2) (video)](https://www.youtube.com/watch?v=ia1L30l7OIg&index=15&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)
|
|
|
+ - [ ] [CSE373 2012 - Lecture 16 - Graph Algorithms (con't 3) (video)](https://www.youtube.com/watch?v=jgDOQq6iWy8&index=16&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b)
|
|
|
+
|
|
|
+- [ ] Đồ thị (ôn tập và mở rộng) (tên video được giữ nguyên vì có quá nhiều thuật ngữ và viết tắt):
|
|
|
+ - [ ] [6.006 Single-Source Shortest Paths Problem (video)](https://www.youtube.com/watch?v=Aa2sqUhIn-E&index=15&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
|
|
|
+ - [ ] [6.006 Dijkstra (video)](https://www.youtube.com/watch?v=2E7MmKv0Y24&index=16&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
|
|
|
+ - [ ] [6.006 Bellman-Ford (video)](https://www.youtube.com/watch?v=ozsuci5pIso&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=17)
|
|
|
+ - [ ] [6.006 Speeding Up Dijkstra (video)](https://www.youtube.com/watch?v=CHvQ3q_gJ7E&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=18)
|
|
|
+ - [ ] [Aduni: Graph Algorithms I - Topological Sorting, Minimum Spanning Trees, Prim's Algorithm - Lecture 6 (video)]( https://www.youtube.com/watch?v=i_AQT_XfvD8&index=6&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
|
|
|
+ - [ ] [Aduni: Graph Algorithms II - DFS, BFS, Kruskal's Algorithm, Union Find Data Structure - Lecture 7 (video)]( https://www.youtube.com/watch?v=ufj5_bppBsA&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=7)
|
|
|
+ - [ ] [Aduni: Graph Algorithms III: Shortest Path - Lecture 8 (video)](https://www.youtube.com/watch?v=DiedsPsMKXc&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=8)
|
|
|
+ - [ ] [Aduni: Graph Alg. IV: Intro to geometric algorithms - Lecture 9 (video)](https://www.youtube.com/watch?v=XIAQRlNkJAw&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=9)
|
|
|
+ - [ ] [CS 61B 2014 (starting at 58:09) (video)](https://youtu.be/dgjX4HdMI-Q?list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd&t=3489)
|
|
|
+ - [ ] [CS 61B 2014: Weighted graphs (video)](https://www.youtube.com/watch?v=aJjlQCFwylA&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd&index=19)
|
|
|
+ - [ ] [Greedy Algorithms: Minimum Spanning Tree (video)](https://www.youtube.com/watch?v=tKwnms5iRBU&index=16&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
|
|
|
+ - [ ] [Strongly Connected Components Kosaraju's Algorithm Graph Algorithm (video)](https://www.youtube.com/watch?v=RpgcYiky7uw)
|
|
|
+
|
|
|
+- Khóa học đầy đủ về đồ thị trên Coursera:
|
|
|
+ - [ ] [Các thuật toán trên đồ thị (video)](https://www.coursera.org/learn/algorithms-on-graphs/home/welcome)
|
|
|
+
|
|
|
+- Yegge: Nếu bạn có cơ hội, hãy thử nghiên cứu các thuật toán đẹp hơn:
|
|
|
+ - [ ] Thuật toán tìm đường đi ngắn nhất của Dijkstra - xem phần trên - 6.006
|
|
|
+ - [ ] A*
|
|
|
+ - [ ] [Thuật toán tìm kiếm A sao (A*)](https://en.wikipedia.org/wiki/A*_search_algorithm)
|
|
|
+ - [ ] [Hướng dẫn cài đặt thuật toán tìm đường đi A* - video](https://www.youtube.com/watch?v=KNXfSOx4eEE)
|
|
|
+ - [ ] [Thuật toán tìm đường A* (E01: giải thích thuật toán) - video](https://www.youtube.com/watch?v=-L-WgKMFuhE)
|
|
|
+
|
|
|
+- Tôi sẽ viết mã cài đặt:
|
|
|
+ - [ ] DFS với danh sách kề (đệ quy)
|
|
|
+ - [ ] DFS với danh sách kề (lặp với stack)
|
|
|
+ - [ ] DFS với ma trận kề (adjacency matrix) (đệ quy)
|
|
|
+ - [ ] DFS với ma trận kề (adjacency matrix) (lặp với stack)
|
|
|
+ - [ ] BFS với danh sách kề
|
|
|
+ - [ ] BFS với ma trận kề
|
|
|
+ - [ ] Đường đi ngắn nhất từ một nút đến các nút khác (single-source shortest path) (Dijkstra)
|
|
|
+ - [ ] Cây khung (spanning tree) nhỏ nhất
|
|
|
+ - Các thuật toán dựa trên DFS (xem lại các video của Aduni):
|
|
|
+ - [ ] tìm chu trình (đường đi mà trên đó tồn tại một nút được ghé qua ít nhất 2 lần) trong đồ thị (cần thiết cho sắp xếp topo (topological sort), vì tôi sẽ kiểm tra có chu trình không trước khi bắt đầu sắp xếp)
|
|
|
+ - [ ] Sắp xếp topo (topological sort)
|
|
|
+ - [ ] Đếm các thành phần liên thông trong một đồ thị
|
|
|
+ - [ ] Liệt kê các thành phần liên thông mạnh
|
|
|
+ - [ ] Kiểm tra tính song phương của đồ thị (Bipartite graph: dạng đồ thị mà tập định có thể chia thành 2 tập con không chứa phần tử chung, sao cho không có cặp 2 điểm nào trong cùng một tập hợp là kề nhau).
|
|
|
+
|
|
|
+Bạn sẽ biết thêm nhiều ứng dụng của đồ thị trong sách của Skiena (xem danh mục sách bên dưới) và các sách về phỏng vấn.
|
|
|
+
|
|
|
+> TODO Add anchors link for the "danh mục sách"
|
|
|
|
|
|
> In progress
|