Có bao giờ bạn đặt câu hỏi: liệu làm lập trình viên có cần phải giỏi thuật toán không? Bài viết này chúng ta cùng nhau bàn luận các thuật toán trong lập trình nhé!
Cuộc sống là chuỗi những vấn đề cần phải giải quyết. Khi ta giải quyết vấn đề và càng đi sâu thì càng nảy sinh nhiều vấn đề khác.
Nhưng chính điều đó lại làm cuộc sống ta trở nên thú vị hơn. Đặc biệt là các bạn developer, phải tiếp xúc với các vấn đề, thuật toán hàng ngày. Việc sáng tạo trong thuật toán và lập trình không hề dễ dàng.
Không cần phải nghĩ đâu xa, xung quanh bạn luôn có rất nhiều vấn đề cần phải giải quyết như: quản lí tài chính gia đình, tìm kiếm tuyến đường ngắn nhất mà không bị kẹt xe để đến công ty mỗi sáng, phân loại quần áo cho vợ giặt…
Thật may mắn, với sự trợ giúp của các thuật toán và cùng với sự sáng tạo của chúng ta, mỗi ngày các hoạt động đó đều trở nên thú vị hơn rất nhiều.
Nếu như bạn thấy các thuật toán thật thú vị, thì bạn có thể bỏ bài viết này mà đi thẳng xuống cuối bài viết để đọc tài liệu nâng cao về thuật toán.
Còn nếu không, hãy để mình lấy đi một vài phút của bạn để giải đáp cũng như khai thông về thuật toán cho bạn nhé.
>>Bạn có thể hứng thú với: Học được gì từ kinh nghiệm lập trình của một cao nhân
Trước khi chúng ta bàn về những điều to lớn của thuật toán, mời bạn đọc qua khái niệm thuận toán. Xem thuật toán là gì đã nhé.
Nội dung chính của bài viết
Thuật toán là gì?
Algorithm là gì? Thuật toán (tiếng anh là Algorithm) là một khái niệm của Toán học và Tin học.
Hiểu nôm na, thuật toán là một tập hợp những các chỉ dẫn để làm một công việc nào đó.Có một điều quan trọng của thuật toán đó là số bước hướng dẫn phải hữu hạn. Không có một thuật toán nào mà có vô số bước, mà không thể đếm được.
Việc nghiên cứu thuật toán rất quan trọng trong ngành khoa học máy tính nói chung, hay lập trình phần mềm nói riêng.
Một thuật toán cơ bản phải đảm bảo đầy đủ những tính chất sau:
- Tính chính xác: Đây là tính chất tiên quyết phải có của một thuật toán. Thuật toán phải giải quyết bài toán và cho ra một kết quả chính xác, chứ lại giải sai bài toán thì coi như bỏ đi.
- Tính rõ ràng: Các bước hướng dẫn trong thuật toán phải rõ ràng, dễ hiểu và sắp xếp theo một trình tự nhất định
- Tính khách quan: tức là với một thuật toán thì dù cho máy tính hay con người thực hiện theo đều cho ra một kết quả duy nhất.
- Tính phổ biến: thuật toán đó không chỉ giải quyết được một bài toán duy nhất. Mà nó còn có tính ứng dụng cho nhiều trường hợp tương tự khác nữa.
- Tính kết thúc: một thuật toán chỉ gồm hữu hạn các bước thực hiện. Phải kết thúc khi tìm ra kết quả phù hợp.
Bạn đã bao giờ sử dụng các thuật toán A* vào công việc?
Định nghĩa ngắn nhất về nghề lập trình mà mình từng gặp đó là nghề viết code. Ta luôn phải tìm cách giải quyết các vấn đề và tìm ra giải pháp hiệu quả nhất cho cùng một vấn đề.
Để có thể tìm ra giải pháp hiệu quả nhất thì trước hết bạn phải có kiến thức cơ bản về vấn đề mà bạn cần giải quyết. Đồng thời bạn cũng cần phải rõ những cách mà người đi trước đã giải quyết để mình có thể cải tiến nó
Mình lấy ví dụ: Để xây dựng ứng dụng có thể tìm đường đi nhanh nhất (nhanh nhất chứ không phải ngắn nhất) từ vị trí người dùng tới công ty.
Mình sẽ không thể tìm được giải pháp tốt nhất nếu mình không hiểu rõ hệ thống giao thông “ma trận” ở Việt Nam, không hiểu được những giải pháp mà người ta đang áp dụng…
Đặc biệt, nếu bạn đang làm việc trong các ngành như AI, Big data, Deep Learning… thì thuật toán đóng một vai trò cực kỳ quan trọng.
>>Nếu bạn tò mò thì dành cho bạn đây: Big data là gì? học big data cần chuẩn bị những gì
Học thuật toán trong lập trình có khó không?
Tất nhiên rồi, đặc biệt là với bạn nào lần đầu đụng tới thuật toán. Việc nghiên cứu các thuật toán yêu cầu bạn phải kiên nhẫn và kiên cường.
Nếu bạn cảm thấy choáng ngợp khi dự án của bạn phải sử dụng nhiều thuật toán để giải quyết vấn đề, thì điều này hoàn toàn bình thường nhé. Ai cũng thế thôi!
Hãy thư giãn và đừng lo lắng.
Có cần phải lên danh sách những thuật toán trong lập trình cần phải học trước tiên không?
Lúc mới bắt đầu học thuật toán, chắc hẳn bạn sẽ có dự định tìm kiếm xem mình phải học những thuật toán nào trước tiên. Cố gắng tìm kiếm danh sách những thuật toán cần phải biết.
Một số bạn thì cho rằng thuật toán sắp xếp là cần thiết phải học trước. Số khác lại thấy việc học thuật toán tìm kiếm và mã hóa cần thiết hơn.
Tốt nhất là bạn không theo ai cả, chỉ đơn giản là bạn tự chọn cho mình một thuật toán mà bạn thấy có ích và dễ dàng với bạn nhất. Có như vậy bạn mới không bị nản chí ngay từ đầu
Đừng cố gắng đi theo lối mòn của người khác. Nghĩa là nếu ai đó đã triển khai các thuật toán và bạn là người đến sau thì bạn cũng không cần phải cố gắng thử và phát triển phiên bản của riêng bạn.
Để học thuật toán trong lập trình tốt, mình có cần phải giỏi toán học không?
Mình tin chắc rằng nhiều bạn developer sẽ có câu hỏi này? Vì các bạn ấy cứ áy náy về thành tích môn toán “khủng khiếp” thời cấp 3.
Câu trả lời là: Cần mà cũng không phải cần. Nghĩa là chỉ cần bạn biết ở mức cơ bản là đủ. Không cần phải là siêu nhân toán học thì mới có thể học thuật toán.
Cũng giống như việc bài viết này sẽ hữu ích nếu như ít nhất bạn đã biết cơ bản về thuật toán là gì.
Nếu không, bạn sẽ cảm thấy bài viết này thật “nhảm xít”.
Mình ví dụ như việc bạn nhận ra việc tính tích phân có thể được định nghĩa là tìm giới hạn và tính tổng. Toán học cao cấp cũng không có vẻ đáng sợ lắm, phải không?
Mình là developer và mình có cần phải giỏi thuật toán không?
Câu trả lời của mình là giỏi thuật toán thì tốt, còn không thì cũng không sao.
Tài liệu tham khảo
Cuối cùng, mình gợi ý một số tài liệu kinh điển giới thiệu về các thuật toán để bạn có thể nâng cao trình độ.
- Thomas H. Cormen, Algorithms unlocked
- SPOJ website
- Stanford University algorithms course at Coursera
Hi vọng bài viết này giúp các bạn có cái nhìn khác về thuật toán trong nghề lập trình.
Mình rất muốn nghe ý kiến của bạn về vấn đề này, hãy để lại bình luận bên dưới nhé
Bình luận. Cùng nhau thảo luận nhé!