Hướng dẫn tự học cấu trúc dữ liệu và giải thuật
Hướng dẫn này sẽ tập trung vào việc giúp bạn hiểu về cấu trúc dữ liệu và thuật toán. Về phần áp dụng thì bạn lên LeetCode, Hackerrank hoặc bất cứ nền tảng nào. Bạn cũng có thể sử dụng Algorithms Visualizer để có thể xem cách thuật toán vận hành.
Kiến thức nền tảng
Toán rời rạc
Đọc hết trong cuốn Giáo trình toán rời rạc - Tổ hợp và đồ thị. Một số các chủ đề có thể kể đến
- Các quy tắc đếm cơ bản
- Xác suất
- Hoán vị & Tổ hợp
- Lý thuyết đồ thị
Đại cương
Được trích dẫn từ series Algorithms Design Techniques trên Viblo.
- Cùng ôn lại các khái niệm về Cấu trúc dữ liệu, Giải thuật, Độ phức tạp thuật toán.
- Tìm hiểu về giải thuật Đệ Quy
- Tìm hiểu về giải thuật Chia để Trị (Divide and Conquer)
Muốn "cưỡi ngựa xem hoa" một chút, đọc 8 kiểu cấu trúc dữ liệu mà mọi lập trình viên cần phải biết
Lập trình "cơ bản"
Bạn có thể viết bằng mã giả (pseudocode) hoặc một ngôn ngữ bất kì, thường là Java hoặc Python.
Tài nguyên khác
Phần lớn các bài viết được dẫn nguồn tới Viblo, và đây là một số nguồn bằng Tiếng Việt khác
Cấu trúc dữ liệu
Arrays và Linked Lists
Stacks và Queues
- Ngăn xếp và Hàng đợi (Stack & Queue) - Bài đọc trên Viblo
- Stack và Stack Implementations của Ông Dev
- Queue và Queue Implementations
Cây
- Cây
- Tree là gì? Lý thuyết về Binary Tree
- Treeee - Video của ông Dev
- Cây nhị phân
- Tree là gì? Lý thuyết về Binary Tree
- Cấu trúc dữ liệu và thuật toán #17: Binary Tree (DS&A)
- Cây tìm kiếm nhị phân:
- Cây tìm kiếm nhị phân
- Cấu trúc dữ liệu và thuật toán #18: Binary Search Tree (BST - DS&A) và xem video code của Ông Dev
- B-tree
- Cấu trúc dữ liệu B+Tree và ứng dụng trong bài toán xử lý tập có thứ tự
- AVL trees
- Duyệt cây nhị phân (Tree traversal: inorder, preorder, postorder)
- Đọc: Lý thuyết về Duyệt cây nhị phân
- Video: 2. Duyệt cây
Hash Tables và Sets:
Trích từ kho video của ông Dev:
- Cấu trúc dữ liệu và thuật toán #20: Hash table, hash function
- Cấu trúc dữ liệu và thuật toán #21: Hashtable Separate Chaining
- Cấu trúc dữ liệu và thuật toán #23: Hashtable Open Addressing
- Cấu trúc dữ liệu và thuật toán #24: Hashtable Linear Probing | DS&A
- Cấu trúc dữ liệu và thuật toán #25: Hashtable Quadratic Probing | DS&A
- Cấu trúc dữ liệu và thuật toán #26: Hashtable Double Hashing | DS&A
- Cấu trúc dữ liệu và thuật toán #27: HT Open Addressing Removal | DS&A
Đồ thị
- Adjacency matrix and adjacency list representation
- Graph traversal (BFS, DFS)
- BFS:
- DFS:
- Bài toán cây khung nhỏ nhất (Kruskal's, Prim's)
- Đọc Bài toán cây khung nhỏ nhất - Bài viết này đã bao gồm cả về bài toán Kruskal và bài toán Prim.
- Kruskal:
- Prim:
- Thuật toán tìm đường đi ngắn nhất (Dijkstra's, Bellman-Ford)
- Thuật toán Dijkstra và ứng dụng
- Thuật toán Bellman Ford và ứng dụng
Giải thuật
Thuật toán sắp xếp
Ta sẽ tập trung học sắp xếp dựa trên so sánh (Comparison-based sorting. Bao gồm: Bubble Sort, Selection Sort, Insertion Sort, Merge Sort, Heap Sort, Quick Sort) và sắp xếp không dựa trên so sánh (Non-comparison based sorting. Bao gồm Counting Sort, Radix Sort).
- Bubble Sort
- Thuật toán sắp xếp nổi bọt (bubble sort)
- Video Bubble Sort Algorithm | Thuật toán sắp xếp Bubble
- Selection Sort
- Bài đọc: Thuật Toán Selection Sort Đơn Giản
- Video: Thuật Toán Sắp Xếp Chọn (Selection Sort)
- Insertion Sort
- Bài đọc: Thuật Toán Insertion Sort Đơn Giản
- Video: Insertion Sort Algorithm | Thuật toán sắp xếp chèn
- Merge Sort
- Bài đọc: Merge Sort
- Video:
- Heap Sort
- Bài đọc: Sắp xếp vun đống
- Video: Heap Sort Algorithm | Thuật toán sắp xếp vun đống @@
- Quicksort
- Bài đọc: Thuật toán sắp xếp nhanh (Quick sort)
- Video: Quick Sort Algorithm | Thuật toán sắp xếp nhanh
- Counting Sort
- Bài đọc: Sắp xếp bằng đếm phân phối (Counting Sort)
- Video: [Bài 4] Đếm Phân phối | Counting sort
- Radix Sort
- Bài đọc: Tìm hiểu về Radix sort và cách implement thuật toán này trong Swift
- Video: Radix Sort Algorithm | Thuật toán sắp xếp theo cơ số - Video
Đọc thêm:
Thuật toán tìm kiếm
- Linear Search
- Binary Search
- Interpolation Search
- Các thuật toán tìm kiếm nâng cao (Ternary Search, Exponential Search)
Advanced Graph Algorithms:
- Topological Sort
- Strongly Connected Components (Tarjan's algorithm)
- Maximum Flow (Ford-Fulkerson algorithm)
Dynamic Programming:
- Memoization and tabulation
- Solving problems using dynamic programming (Knapsack problem, Longest Common Subsequence, Matrix Chain Multiplication)
-
Backtracking:
- Solving constraint satisfaction problems (N-Queens, Sudoku, Subset Sum)
-
Pruning the search space
-
Greedy Algorithms:
- Activity Selection Problem, Huffman Coding, Fractional Knapsack Problem