Thuật toán là gì? Học thuật toán làm quái gì?

Tôi là một lập trình viên có trên 15 năm kinh nghiệm tay nghề. Những năm tiên phong ( từ cấp 3 ), tôi học và làm nhiều về thuật toán. Cho đến cả khi ra trường, tôi cũng luôn điều tra và nghiên cứu và có đam mê với nó. Đồ án tốt nghiệp của tôi mang tính học thuật khá nhiều : “ Xây dựng quy mô ngôn từ cho tiếng Việt ”. Ra trường, tôi nung nấu dự tính đi du học và theo con đường nghiên cứu và điều tra. Tuy nhiên, sau quãng thời hạn đi làm 1 năm, tôi thấy thích làm loại sản phẩm / ứng dụng hơn là điều tra và nghiên cứu. Tôi chuyển hướng học về công nghệ tiên tiến, kĩ thuật hơn là thuật toán. Nói như vậy để bạn hiểu rằng, hiện tại tôi không còn là Fan Hâm mộ hay thần thánh hoá thuật toán nữa. Tuy nhiên, cá thể tôi cho rằng, thuật toán vẫn là thứ gì đó khá quan trọng vs đối lập trình viên. Sau này lúc đi dạy học hay khuynh hướng san sẻ với những lập trình viên trẻ, cũng có khá nhiều người hỏi tôi có cần học giải thuật / thuật toán hay không ? Câu vấn đáp của tôi luôn luôn là có. Vì sao ?

Thuật toán là gì?

Thuật toán hay giải thuật ( tiếng anh là Algorithm ) có khá nhiều định nghĩa phức tạp. Bạn hoàn toàn có thể đọc ở nhiều nguồn để hiểu thêm về nó. Cá nhân tôi định nghĩa dễ hiểu rằng, thuật toán là “ thuật ” ( chiêu thức ) để xử lý 1 bài toán. Nói dễ hiểu hơn, mỗi một bài toán giống như một chiếc hòm tiềm ẩn kho tàng ( hiệu quả, đáp án ), và chiếc chìa khoá để mở cái hòm đó chính là “ giải thuật ”. Nếu dùng sai chìa khoá, bạn vẫn hoàn toàn có thể mở được hòm, nhưng mà sẽ mất nhiều thời hạn, hoặc mở được hòm thì kho tàng ở bên trong bị méo mó, không toàn vẹn. Sử dụng đúng chìa khoá, sẽ giúp bạn lấy được kho tàng 1 cách thuận tiện, nhanh gọn. Tất nhiên mỗi chiếc hòm sẽ luôn cần loại chìa khoá khác nhau, giống như một bài toán luôn có những giải thuật xác lập. Không có chiếc chìa khoá nào mở được toàn bộ những hòm, cũng như không có giải thuật nào giải được hàng loạt những bài toán .

Tại sao cần dùng thuật toán?

Lập trình chính là để nhu yếu, thông tư máy triển khai, xử lý 1 việc làm, bài toán đơn cử nào đó của đời sống. Mỗi bài toán thực tiễn sẽ có cách xử lý khác nhau. Am hiểu và sử dụng đúng thuật toán, sẽ giúp bạn xử lý một cách thuận tiện, cùng với độ đúng chuẩn cao trong thời hạn ngắn nhất. Bỏ qua thuật toán sắp xếp những số trong dãy số nguyên hay thuật toán tìm số nguyên tố đi nhé, bài đó chỉ dùng để học và minh hoạ về thuật toán thôi. Ở đây, mình muốn trình làng với những bạn những thuật toán có tính ứng dụng khá lớn trong những mẫu sản phẩm / mạng lưới hệ thống ứng dụng hiện tại nhé :

  • Đầu tiên là thuật toán tìm đường đi ngắn nhất. Đại khái cho bạn một danh sách các đường đi giữa các địa điểm, hãy tìm đường đi ngắn nhất (về khoảng cách) hoặc chi phí tối thiểu khi đi từ điểm X đến điểm Y.
    Bạn biết thuật toán này dùng ở đâu rồi chứ? Hiện tại tôi nghĩ, bạn có thể sẽ biết nó xuất hiện trong các phần mềm chỉ đường và ứng dụng liên quan tới ngành giao thông vận tải (ví dụ google map, grab, uber, giao hàng nhanh, ….), nhưng bạn có biết nó còn dùng ở đâu nữa không? Xin nói với các bạn rằng, trong các hệ thống mạng, viễn thông người ta cũng dùng thuật toán này để định hướng đường truyền và tín hiệu. Cuộc điện thoại từ 1 người ở thành phố Hà Nội gọi cho 1 người ở thành phố Hồ Chí Minh đi qua các cột thu phát sóng, dữ liệu internet từ máy tính của bạn đi tới máy chủ của nhà cung cấp mạng cũng phải sử dụng thuật toán này để đạt được tốc độ tối đa.
  • Tiếp theo, một thuật toán khá nổi tiếng khác là thuật toán tìm kiếm. Bạn có thể nhìn thấy nó ở khá nhiều sản phẩm phần mềm hiện tại, điển hình như Google. Bạn có thể nghĩ rằng, tìm kiếm khá là đơn giản, khi bạn lần lượt soi vào từng ô, từng dòng dữ liệu xem có thứ mà mình tìm kiếm hay không? Nhưng hãy đặt địa vị, bạn có hàng tỷ tỷ món đồ dùng được vứt lộn xộn trong 1 căn nhà, bạn sẽ mất bao nhiêu lâu để tìm được món đồ mà bạn mong muốn. Hãy biết chắc chắn rằng, việc Google trả ra được kết quả mà bạn yêu cầu tìm kiếm trong vòng 1 vài giây là vô cùng khó. Điều ấy yêu cầu 1 thuật toán cực mạnh, và vẫn liên tục cần cải tiến cho đến ngày hôm nay.
  • Các thuật toán mã hoá được sử dụng để mã hoá thông tin, được sử dụng nhiều trong việc truyền nhận và lưu trữ giữ liệu, giúp bảo vệ thông tin cá nhân và tổ chức khỏi các cuộc tấn công hay khai thác.

Bỏ qua những thuật toán cao siêu như bên trên vì bạn ít có cơ hội làm những sản phẩm như vậy, trong quá trình làm phần mềm, bạn cũng có thể sẽ gặp các bài toán hay vấn đề nhỏ yêu cầu bạn phải chọn đúng giải thuật để giải, ví dụ như:

  • Hãy tìm kiếm 1 cái máy tính có giá từ X->Y, đáp ứng tối đa các tiêu chí của người dùng chỉ trong 1 cái click chuột
  • Hãy đưa ra các bài viết hoặc sản phẩm mà người dùng quan tâm dựa trên lịch sử truy cập của họ

Khi bạn lập trình đủ lâu và đủ nhiều, tôi nghĩ chắc chắn bạn sẽ gặp nhiều bài toán khó hơn tôi. Trong quá trình phát triển sản phẩm CodeLearn, tôi và những đồng đội cũng đôi lúc phải giải quyết những bài toán kiểu như thế này:

  • Hãy tính toán và sắp xếp thứ hạng của người dùng dựa trên lịch sử học và làm bài
  • Đếm số lượng truy cập của người dùng trong 1 khoảng thời gian để dự đoán tấn công
  • Đưa ra gợi ý các bài tập mà người dùng nên làm dựa vào lịch sử truy cập và thao tác của họ trên hệ thống

Tất nhiên những bài toán trên là không khó với tập dữ liệu và người dùng nhỏ. Nhưng hãy thử tưởng tượng, khi mạng lưới hệ thống có hàng nghìn hàng vạn người cùng truy vấn và bạn phải trả về tác dụng là cực kỳ nhanh, bạn sẽ làm như thế nào để bảo vệ điều đó ? Thực tế đã vấn đáp chúng tôi rằng, khi chọn đúng giải thuật, vận tốc xử lí hoàn toàn có thể tăng lên từ hàng chục tới hàng trăm lần. Và tôi nghĩ rằng, một ngày nào đó, chúng tôi vẫn sẽ phải tăng cấp thuật toán để xử lý bài toán với lượng tài liệu và người dùng lớn hơn .

Và không học thuật toán được không?

Không phải là 1 Fan Hâm mộ của thuật toán, không thần thánh hoá thuật toán, nên tôi nghĩ rằng không học thuật toán vẫn làm được thậm chí còn làm tốt ứng dụng. Nếu những bạn không làm những bài toán có độ phức tạp cao, có tài liệu người dùng lớn, cần phải ra đáp án nhanh với độ đúng mực cao, tôi nghĩ bạn vẫn hoàn toàn có thể xử lý được yếu tố với vốn thuật toán hạn chế. Hay ví dụ nếu bạn làm 1 website đa phần là nội dung, nếu bạn làm 1 ứng dụng điện thoại cảm ứng chỉ xử lí những logic thường thì, thuật toán không giúp ích nhiều cho bạn trong trường hợp ấy. Kể cả khi bạn làm những mẫu sản phẩm rất lớn, sử dụng những công nghệ tiên tiến rất mới và hot như AI, BigData hay Blockchain, dù không thành thạo thuật toán nào cả, bạn vẫn kiến thiết xây dựng đc mạng lưới hệ thống. Trong trường hợp này, bạn chỉ cần hiểu rõ cách sử dụng và ứng dụng của công nghệ tiên tiến, chứ không cần nằm hay hiểu rõ thuật toán bên trong công nghệ tiên tiến ấy .

Đặc biệt là, với 1 số phần mềm đơn giản có yêu cầu hay thay đổi, dẫn đến việc thay đổi code thường xuyên. Lúc này, thuật toán hay, code chạy nhanh không quan trọng bằng việc hiểu đúng yêu, tổ chức dữ liệu, thiết kế cấu trúc code, viết code sao cho dễ đọc, dễ hiểu và dễ bảo trì.

Rốt cuộc thì thuật toán quan trọng hay không?

Có 1 thực sự rằng, đa số những loại sản phẩm ứng dụng ngày này thành công xuất sắc mà không cần hay sử dụng rất ít thuật toán bên trong nó. Tuy nhiên những loại sản phẩm có hàm lượng thuật toán cao, trí tuệ lớn, thật sự tạo ra sự độc lạ và thành công xuất sắc lớn hơn những loại sản phẩm thông thường. Sản phẩm như Google thành công xuất sắc vì có thuật toán tìm kiếm can đảm và mạnh mẽ bậc nhất quốc tế. Sản phẩm như Facebook hay Youtube cũng phải sử dụng nhiều thuật toán như tìm kiếm, gợi ý người dùng, gợi ý nội dung, … Nhưng thuật toán lại không phải yếu tố cốt lõi quyết định hành động thành công xuất sắc của mẫu sản phẩm này. Do đó, việc học thuật toán, sự quan trọng của thuật toán phụ thuộc vào vào mẫu sản phẩm, ứng dụng mà bạn làm. Dù có giỏi hay không giỏi thuật toán, bạn vẫn hoàn toàn có thể thành công xuất sắc nếu vận dụng đúng kiến thức và kỹ năng, hiểu biết của mình vào nghành nghề dịch vụ mà bạn làm. Cá nhân tôi luôn khuyên và nhắn nhủ những bạn lập trình viên hãy luôn học và rèn luyện thuật toán. Với tôi, thuật toán giúp bạn rèn luyện tư duy xử lý yếu tố, cùng với tâm lý về việc luôn tối ưu và làm mẫu sản phẩm một cách tối ưu và tổng quát. Có những lúc, thực sự bế tắc trong việc làm ( không chỉ là lập trình ), tôi vẫn thường vào làm 1 số bài tập thuật toán để khai thông và thôi thúc sự tâm lý. Sau đó tôi thấy mình minh mẫn và xử lý việc làm cũ 1 cách thuận tiện hơn .

Học thuật toán từ đâu? Như thế nào?

Nếu bạn học CNTT ở trong trường ĐH, tôi nghĩ bạn nên học tốt môn học này từ những thầy giáo và những bạn đồng trang lứa. Nếu không có điều kiện kèm theo ấy, tôi nghĩ rằng bạn nên tìm kiếm 1 cuốn sách dạy về giải thuật như thể cuốn “ Cấu trúc tài liệu và giải thuật ” của thầy Đinh Mạnh Tường .
Nếu bạn giỏi tiếng Anh, hãy tìm kiếm những khoá học cơ bản trên mạng giống như là trang :

https://www.geeksforgeeks.org/fundamentals-of-algorithms/ 

À ngoài những thì, nếu hoàn toàn có thể, hãy thử làm bài tập và học thử những khoá học tương quan tới thuật toán ở đường dẫn :
https://mindovermetal.org/Learning/Detail/3477 hay https://mindovermetal.org/Learning/Detail/133067 .
Bằng tổng thể tâm lý cùng đam mê của tôi và tập sự, sẽ cố gắng nỗ lực giúp những bạn học tốt thuật toán nếu những bạn cần và hứng thú với nó .

Source: https://mindovermetal.org
Category: Wiki là gì

Rate this post
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments