Chuyên đề thuật toán này không sắp xếp kiến thức theo thứ tự giáo trình mà được tổng hợp theo lộ trình luyện bài phỏng vấn thực tế: trước tiên làm rõ độ phức tạp, sau đó nắm các template thường gặp như binary search, two pointers, sliding window, DFS/BFS, backtracking, dynamic programming, greedy, Top K, cuối cùng dùng các bài về string, linked list, sorting và danh sách bài LeetCode để ôn tập.
- Java80
- Database46
- Computer Basics36
- System Design16
- AI15
- Phát triển ứng dụng AI14
- Computer Science Basics14
- Distributed13
- Framework13
- Công cụ phát triển11
- Tuyển tập bài viết kỹ thuật11
- Knowledge Planet10
- AI Coding thực chiến10
- Đến gần tác giả9
- High Performance9
- High Availability8
- Chuẩn bị phỏng vấn8
- AI Application Development8
- Tuyển tập bài viết kỹ thuật chọn lọc8
- Distributed Systems6
- Lộ trình học6
- Computer Fundamentals6
- Tuyển tập bài viết kỹ thuật chất lượng cao6
- Hệ thống phân tán5
- Dự án mã nguồn mở5
- Sách máy tính4
- Tìm hiểu dự án4
- Chất lượng code4
- Hiệu năng cao3
- AI Coding Principles3
- Cơ sở máy tính3
- Kiến thức cơ bản về máy tính3
- Interview Preparation2
- Dự án open source2
- AI application development2
- Thực chiến AI Coding2
- Kỹ thuật AI Coding2
- Kiến thức máy tính cơ bản2
- Phân tán2
- Distributed system2
- Performance cao2
- System design2
- Về tác giả1
- Lập trình AI1
- Sách Computer1
- Sách Computer Science1
- Computer Books1
- High availability1
- High-performance1
- Hành trình lập trình1
- Làm quen với dự án1
- Open-source Projects1
- Java Interview Guide1
- Kỹ thuật lập trình AI1
- AI coding thực chiến1
- Thực hành lập trình AI1
- Thực chiến AI coding1
- AI coding1
- AI Coding1
- AI Programming Principles1
- Nguyên lý AI coding1
- Lập trình AI thực chiến1
- CS Basics1
- Kiến thức máy tính1
- Kiến thức cơ sở máy tính1
- Bộ sưu tập bài viết kỹ thuật đặc sắc1
Đặc điểm của bài toán Backtracking rất rõ ràng: đề bài yêu cầu bạn tìm tất cả phương án, tất cả đường đi, tất cả combination, hoặc thử các lựa chọn trong một tập hợp. Nó rất giống DFS, điểm khác biệt là Backtracking nhấn mạnh hơn vào “chọn -> đệ quy -> hủy lựa chọn”.
Khi viết Backtracking trong phỏng vấn, điều quan trọng nhất là trước tiên phải nêu rõ ý nghĩa của hàm đệ quy. Khi đã xác định rõ ý nghĩa của hàm, tham số, điều kiện kết thúc và thao tác hủy lựa chọn sẽ ít bị rối hơn.
Điểm dễ khiến bạn mắc lỗi nhất khi làm binary search không nằm ở ý tưởng mà ở việc xử lý biên. left, right, mid, điều kiện vòng lặp và giá trị trả về, chỉ cần chưa hiểu rõ ý nghĩa của một yếu tố là bạn rất dễ viết thành vòng lặp vô hạn hoặc bỏ sót đáp án.
Đừng học thuộc các ý tưởng thuật toán một cách tách rời. Cách hỏi hữu ích hơn trong phỏng vấn là: tín hiệu nào cho thấy nên dùng nó? Điểm nào trong template dễ viết sai nhất? Nếu interviewer thay đổi điều kiện, bạn nên bắt đầu điều chỉnh từ biến hoặc state nào?
Danh sách bài này được tổ chức theo ý tưởng. Mỗi nhóm đều đưa ra “tín hiệu nhận diện, template thường dùng, bài tiêu biểu, trọng tâm ôn tập”. Số lượng bài được giới hạn trong phạm vi đủ để đại diện cho template; hiểu rõ những bài này trước sẽ hiệu quả hơn việc máy móc giải thêm nhiều bài.
Khi làm bài về cấu trúc dữ liệu, không nên chỉ luyện từ Easy đến Hard theo độ khó. Cách vững hơn là phân loại dạng bài theo từng cấu trúc: array tập trung vào index và khoảng, linked list tập trung vào pointer, stack và queue tập trung vào ràng buộc thứ tự, tree và graph tập trung vào traversal, heap tập trung vào priority, hash table tập trung vào định vị nhanh.
Complexity analysis là bước đầu tiên trong phỏng vấn thuật toán. Interviewer không nhất thiết yêu cầu bạn trình bày phần chứng minh thật chặt chẽ, nhưng sẽ muốn bạn nói rõ: đoạn code này thực thi bao nhiêu lần, dùng thêm bao nhiêu space, quy mô input tăng thì điều gì xảy ra.
Trước hết cần làm rõ một điểm: complexity analysis thường xét xu hướng tăng trưởng khi quy mô input rất lớn, không phải runtime chính xác. O(n) không có nghĩa chắc chắn nhanh hơn O(nlogn), vì constant, quy mô dữ liệu, cache hit và chi tiết implementation đều ảnh hưởng đến thời gian thực tế. Tuy nhiên, trong phỏng vấn, trước tiên chỉ cần nói rõ growth order theo Big O, sau đó bổ sung một câu về giới hạn trong thực tế là đủ.
Dynamic programming khó không phải vì code luôn dài, mà vì chỉ cần state definition sai thì transition equation, initialization và thứ tự duyệt phía sau đều sai theo.
Trong phỏng vấn, đừng vội học thuộc template ngay từ đầu. Trước tiên hãy tự hỏi hai câu: bài toán này có thể tách thành các bài toán con không? Đáp án hiện tại có phụ thuộc vào các đáp án đã tính trước đó không? Nếu cả hai câu trả lời đều là có, hãy cân nhắc DP.
Bài toán Top K rất thường gặp trong phỏng vấn backend, vì vừa có thể kiểm tra thuật toán, vừa dễ liên hệ với các tình huống kỹ thuật: bảng xếp hạng, thống kê từ khóa phổ biến, median của data stream, mã lỗi xuất hiện nhiều nhất trong log đều có thể quy về Top K.
Với nhóm bài này, không nên chỉ ghi nhớ một cách viết. Interviewer thường hỏi tiếp: Nếu dữ liệu rất lớn thì phải làm thế nào? Nếu là data stream thì sao? Nếu yêu cầu K phần tử có tần suất cao nhất thì sao? Phương án sẽ thay đổi theo từng điều kiện.
Hệ thống kiến thức cấu trúc dữ liệu này tổ chức nội dung theo các chủ đề phỏng vấn và tình huống kỹ thuật Java backend: trước tiên hiểu dữ liệu được lưu trữ thế nào, sau đó tìm hiểu complexity của các thao tác thường gặp, cuối cùng liên hệ các cấu trúc với những vấn đề kỹ thuật như Java Collections, MySQL index, Redis, cache và message queue.
Đồ thị là một cấu trúc phi tuyến tương đối phức tạp. Tại sao nói đồ thị tương đối phức tạp?
Dựa trên nội dung trước đó, chúng ta biết:
- Các phần tử của cấu trúc dữ liệu tuyến tính thỏa mãn quan hệ tuyến tính duy nhất, mỗi phần tử (trừ phần tử đầu tiên và cuối cùng) chỉ có một phần tử đứng trước trực tiếp và một phần tử đứng sau trực tiếp.
- Giữa các phần tử của cấu trúc dữ liệu dạng cây có quan hệ phân cấp rõ ràng.
