Bỏ qua

Tóm tắt

Điểm lại trọng tâm

  • Thuật toán hiện hữu ở khắp mọi nơi trong cuộc sống hàng ngày và không phải là kiến thức cao siêu, xa vời. Thực tế, chúng ta đã học được nhiều thuật toán từ lúc nào không hay và quen áp dụng chúng để giải quyết các vấn đề lớn nhỏ trong cuộc sống.
  • Nguyên lý tra từ điển tương đồng với thuật toán tìm kiếm nhị phân. Tìm kiếm nhị phân thể hiện tư tưởng thuật toán quan trọng là chia để trị.
  • Quy trình sắp xếp quân bài rất giống với thuật toán sắp xếp chèn. Sắp xếp chèn phù hợp để sắp xếp các tập dữ liệu nhỏ.
  • Các bước trả tiền thừa về bản chất là thuật toán tham lam, trong đó mỗi bước đều đưa ra lựa chọn tốt nhất dựa trên tình huống hiện tại.
  • Thuật toán là một tập hợp các chỉ thị hoặc các bước thao tác nhằm giải quyết một vấn đề cụ thể trong một khoảng thời gian hữu hạn, trong khi cấu trúc dữ liệu là cách thức tổ chức và lưu trữ dữ liệu trong máy tính.
  • Cấu trúc dữ liệu và thuật toán liên kết mật thiết với nhau. Cấu trúc dữ liệu là nền tảng của thuật toán, còn thuật toán thổi bùng sức sống vào cấu trúc dữ liệu.
  • Chúng ta có thể so sánh cấu trúc dữ liệu và thuật toán với trò chơi lắp ráp mô hình: các mảnh ghép đại diện cho dữ liệu, hình dạng và phương thức liên kết của chúng đại diện cho cấu trúc dữ liệu, và các bước thao tác để lắp ráp tương ứng với thuật toán.

Q & A

Q: Là một lập trình viên, tôi chưa từng sử dụng thuật toán để giải quyết vấn đề trong công việc hàng ngày, các thuật toán thông dụng đều đã được ngôn ngữ lập trình đóng gói sẵn và có thể gọi dùng trực tiếp. Phải chăng điều này có nghĩa là các vấn đề trong công việc của chúng ta vẫn chưa đạt đến mức độ cần dùng thuật toán?

Nếu ví kỹ năng công việc cụ thể như "chiêu thức" trong võ thuật, thì các môn học nền tảng sẽ giống như "nội công".

Tôi tin rằng ý nghĩa của việc học thuật toán (và các môn học nền tảng khác) không phải là để bạn tự triển khai chúng từ con số không trong công việc, mà là dựa vào những kiến thức đã học, bạn có thể đưa ra phản xạ và phán đoán chuyên nghiệp khi giải quyết vấn đề, từ đó nâng cao chất lượng tổng thể của công việc. Hãy lấy một ví dụ đơn giản, mỗi ngôn ngữ lập trình đều tích hợp sẵn hàm sắp xếp:

  • Nếu chưa từng học cấu trúc dữ liệu và thuật toán, khi có bất kỳ dữ liệu nào, chúng ta có thể chỉ việc đưa nó vào hàm sắp xếp này để xử lý. Chương trình chạy trơn tru, hiệu năng tốt và dường như không có vấn đề gì.
  • Nhưng nếu đã học thuật toán, chúng ta sẽ biết rằng độ phức tạp thời gian của hàm sắp xếp tích hợp sẵn là \(O(n \log n)\); còn nếu dữ liệu đầu vào là các số nguyên có số chữ số cố định (như mã số sinh viên), thì chúng ta có thể sử dụng "sắp xếp cơ số" có hiệu năng cao hơn để xử lý, giúp giảm độ phức tạp thời gian xuống còn \(O(nk)\), trong đó \(k\) là số chữ số. Khi lượng dữ liệu rất lớn, thời gian chạy tiết kiệm được có thể tạo ra giá trị lớn (giảm chi phí, trải nghiệm tốt hơn, v.v.).

Trong lĩnh vực kỹ thuật, phần lớn các vấn đề đều khó đạt được lời giải tối ưu, và nhiều vấn đề chỉ được giải quyết ở mức "tạm ổn". Độ khó của một vấn đề một mặt phụ thuộc vào bản chất của chính vấn đề đó, mặt khác phụ thuộc vào vốn kiến thức của người xem xét nó. Kiến thức của một người càng toàn diện, kinh nghiệm càng phong phú thì việc phân tích vấn đề sẽ càng sâu sắc, và vấn đề sẽ được giải quyết một cách tinh tế hơn.