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: Các quy tắc đếm cơ bản - Trường THPT chuyên Hà Nội - Amsterdam
- Xác suất: Chương 4: Xác suất - Tài liệu học tập
- Hoán vị & Tổ hợp: Hoán vị - Chỉnh hợp - Tổ hợp - ToanMath.vn
- Lý thuyết đồ thị: Chương 1: Các khái niệm cơ bản về lý thuyết đồ thị - Tài liệu Bách Khoa
Đạ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¶
- Arrays: Mảng (Array) trong C++ và ứng dụng
- Linked Lists: LinkedList trong Java và các thao tác cơ bản
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: Cây AVL - Lý thuyết và cài đặt
- 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:¶
- Hash Tables: Tìm hiểu về cấu trúc dữ liệu HashTable
- Sets: Set trong C++
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: Biểu diễn đồ thị trong C++ (Adjacency Matrix và Adjacency List)
- 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: Thuật toán tìm kiếm tuyến tính (Linear Search) trong C++
- Binary Search: Thuật toán tìm kiếm nhị phân (Binary Search)
- Interpolation Search: Tìm kiếm nội suy (Interpolation Search)
- Các thuật toán tìm kiếm nâng cao (Ternary Search, Exponential Search):
- Ternary Search: Tìm kiếm tam phân (Ternary Search)
- Exponential Search: Exponential Search (Bài viết tiếng Anh, bạn có thể tìm thêm tài liệu tiếng Việt nếu cần)
Advanced Graph Algorithms:¶
- Topological Sort: Thuật toán sắp xếp Topo (Topological Sort)
- Strongly Connected Components (Tarjan's algorithm): Thuật toán Tarjan tìm các thành phần liên thông mạnh
- Maximum Flow (Ford-Fulkerson algorithm): Bài toán luồng cực đại và thuật toán Ford-Fulkerson
Dynamic Programming:¶
- Memoization and tabulation: Memoization và Tabulation trong Dynamic Programming
- Solving problems using dynamic programming (Knapsack problem, Longest Common Subsequence, Matrix Chain Multiplication)
- Tất cả những gì bạn cần là quy hoạch động
3. Backtracking:¶
- Solving constraint satisfaction problems (N-Queens, Sudoku, Subset Sum)
- Pruning the search space
- Backtracking: Thuật toán Backtracking (quay lui) và ứng dụng
4. Greedy Algorithms:¶
- Activity Selection Problem, Huffman Coding, Fractional Knapsack Problem
- Greedy Algorithms: Thuật toán tham lam (Greedy Algorithm)
Tài nguyên¶
Theo như một bình luận trên Reddit thì:
So there are some that try to advocate for standardizing pseudocode, but personally I think it's a terrible idea. If the code doesn't actually run, how can you be sure it's unambiguous and correct? There are famous examples of pseudocode in textbooks and papers having subtle bugs in them.
Nên có thêm một số phần mềm hỗ trợ trực quan hóa thuật toán, hai công cụ mà mình khá thích là: