Categories
Dev's Corner

Đừng chỉ viết code, hãy tập giải quyết vấn đề

Những lần gặp khó khăn khi code là những lần ta tích lũy kinh nghiệm, nhận ra được các mẫu có tính lặp lại và khám phá những chiến lược nhất định. Nếu phân loại được đoạn code và những vấn đề tương tự sẽ giúp ích rất nhiều cho lập trình viên.

Tập trung giải quyết vấn đề
Tập trung giải quyết vấn đề để cải thiện kỹ năng lập trình. Ảnh: lloorraa – Pixabay

Việc học giải quyết vấn đề theo hệ thống như vậy đã được thảo luận từ rất lâu.

Gambaru xin giới thiệu với các bạn một trong những nhà toán học tuyệt vời đã chia sẻ về vấn đề này, George Polya, qua cuốn sách nổi tiếng How to solve it, a new aspect of mathematical method xuất bản lần đầu năm 1945.

Không rõ George Polya có mong đợi lập trình viên thế kỷ 21 đọc được tác phẩm toán của mình hay không, nhưng tôi mong các bạn nhận ra được những góc nhìn của ông có giá trị đến thế nào.

George Polya
Nhà toán học George Polya. Ảnh: Alchetron
How to Solve it
Sách How to Solve it – A new aspect of mathematical method viết bởi George Polya. Ảnh: Amazon

Giải quyết vấn đề không phải là một năng khiếu

“Giải toán là một kỹ năng thực tế như bơi lội. Chúng ta thành thục được bất kỳ kỹ năng nào bằng cách bắt chước và thực hành. Khi tập bơi, bạn bắt chước theo cách mọi người dùng tay và chân để giữ cho đầu ở trên mặt nước và cuối cùng, bạn biết bơi nhờ tập luyện. Khi tập giải toán, bạn quan sát và bắt chước những gì người khác làm khi giải toán và cuối cùng, bạn biết giải toán nhờ thực hành.”

George Polya, How to solve it

Giải quyết vấn đề không chỉ là về “trí óc”

“Dạy giải toán chính là sự rèn luyện ý chí. Để giải quyết những bài khó, người học sẽ học cách kiên trì vượt qua thất bại, trân trọng những tiến bộ nhỏ, chờ đợi ý tưởng cần thiết và tập trung hết sức khi ý tưởng xuất hiện.”

George Polya, How to solve it

Quyết tâm và cảm xúc đóng một vai trò quan trọng khi giải quyết các vấn đề khó.

Quy trình giải quyết vấn đề

Bất cứ khi nào thực hiện quá trình giải quyết vấn đề, hãy ghi nhớ bốn bước sau:

  • Hiểu vấn đề
  • Lập kế hoạch
  • Thực hiện kế hoạch
  • Nhìn lại và đánh giá

1. Hiểu vấn đề

Hiểu vấn đề
“Thật ngớ ngẩn khi trả lời một câu hỏi bạn không hiểu. Thật đáng buồn khi làm việc để ra một kết quả bạn không mong muốn.” – George Polya, How to solve it. Nguồn ảnh: Rawpixel

Trước khi đi tìm giải pháp, cần phải trình bày được tất cả các yếu tố của vấn đề để hiểu nó rõ hơn.

Bạn có thể nêu vấn đề trong một câu không?

Bài tập nhỏ này rất hữu ích: thuyết phục bản thân rằng bạn đã hiểu mục tiêu và không tốn quá nhiều năng lượng để hiểu nó nữa khi đang tập trung giải quyết vấn đề.

Như được đề cập trong sách The Pragmatic Programmer, khi lập trình viên debug với “vịt cao su” chính là buộc bản thân phải hiểu rõ vấn đề để có thể dạy nó cho người khác.

Debug bằng vịt cao su
Kỹ thuật debug đỉnh cao với vịt cao su: Bạn có giải thích được vấn đề cho người khác

Có những ràng buộc nào cần phải đáp ứng không?

Những ràng buộc cần đáp ứng
“Trước hết, hãy hiểu vấn đề một cách tổng thể. Từ đó, ta mới có thể đánh giá những điểm cụ thể nào là quan trọng nhất. Sau khi xem xét một hoặc hai điểm trọng yếu, ta mới có thể đánh giá xem chi tiết nào đáng để điều tra kỹ hơn. Hãy đi vào sâu chi tiết và phân tích vấn đề dần dần, nhưng không đi xa hơn mức mình cần.” – George Polya, How to solve it. Ảnh: Freepik

Những hạn chế trong vấn đề bạn đang giải quyết là gì?

Hãy viết chúng ra. Nó có thể là một comment phía trên dòng đầu tiên của một hàm bạn viết, một danh sách các gạch đầu dòng trên đầu tài liệu thiết kế.

Điều quan trọng là phải tập trung vào chúng khi cố gắng tìm giải pháp.

Gỡ bỏ nhiều ràng buộc khỏi bộ não cũng là một cách loại bỏ một số quả bóng khi tâm trí ta chơi trò “tung hứng” trong khi cố gắng đưa ra một ý tưởng hay.

Ngoài ra, hãy cẩn thận nếu có quá nhiều ràng buộc.

Theo Polya, nếu xem xét quá nhiều chi tiết cùng một lúc, bạn có thể lạc lối. Chúng có thể khiến bạn mất tập trung vào điểm chính yếu hoặc thậm chí không nhìn thấy điểm chính yếu đó.

Bạn có thể vẽ hình minh họa hay một hệ thống ký hiệu phù hợp?

Vẽ minh họa hay hệ thống ký hiệu
Vẽ minh họa hay hệ thống ký hiệu “Một bước quan trọng khi giải toán là chọn hệ thống ký hiệu. Điều này cần được thực hiện một cách cẩn thận. Làm được ta sẽ tiết kiệm thời gian cho sau này do tránh được những do dự và nhầm lẫn không đáng.” – George Polya, How to solve it. Nguồn ảnh: Sarah Pflug – Burst

Các bản vẽ hay phác thảo sẽ giúp bỏ bớt một số suy nghĩ ra giấy và tạo nhiều khoảng trống hơn cho bộ não tập trung vào những phần khó.

Hãy chọn hệ thống ký hiệu giúp bạn hiểu rõ mọi thứ hơn: diagram, flowchart….

2. Lập kế hoạch

Lập kế hoạch
“Ta có kế hoạch khi biết, hoặc ít nhất là biết sơ bộ, mình phải thực hiện những phép tính, thuật toán hoặc cấu trúc nào để tìm ra lời giải. Con đường từ hiểu vấn đề đến hình thành một kế hoạch có thể dài và quanh co. Thành tựu chính khi tìm ra giải pháp là hình thành ý tưởng về một kế hoạch.” – George Polya, How to solve it. Nguồn ảnh: ThisIsEngineering – Pexels

Giải quyết vấn đề trên giấy trước. Việc viết code luôn có vẻ dễ dàng hơn trong đầu và trở nên phức tạp hơn nhiều khi làm nó chạy được.

Đừng làm cả hai việc cùng một lúc. Đầu tiên, hãy giải quyết vấn đề. “Chạy thử” một ví dụ trên sổ hoặc trên pseudocode. Sau đó, chạy trên máy.

Bạn có biết một vấn đề liên quan?

Bạn cần biết ít nhất loại vấn đề hoặc nhóm vấn đề bạn đang giải quyết. Đối với dân phần mềm, hãy thử trả lời những câu hỏi sau:

  • Đây có phải là vấn đề kiến ​​trúc không?
  • Có những mẫu kiến ​​trúc nào thường được sử dụng trong kịch bản này không?
  • Vấn đề này có nhiều hơn ở cấp độ của một giải thuật không?
  • Có giải thuật đã được chứng minh có thể giải quyết loại vấn đề này không?

Khi có thể tìm thấy một vấn đề liên quan đến vấn đề của mình và đã được giải quyết trước đó, bạn nên ăn mừng.

Đặt tiếp câu hỏi: “Mình có thể sử dụng nó không?”

Nhiều vấn đề có thể có một số điểm chung, nhưng những vấn đề có chung các yêu cầu hoặc nền tảng cốt lõi nhất có lẽ sẽ hữu ích nhất.

Bạn có thể trình bày lại vấn đề được không?

Bạn có thể nhìn nhận vấn đề ở một góc độ khác? Có thể bỏ một phần điều kiện hoặc một số yêu cầu không? Có thể nêu vấn đề này theo một kịch bản cụ thể hơn không?

Nếu đang viết các bài test, hãy thử nghĩ đến các ví dụ đơn giản được tạo ra chỉ bởi các điều kiện cụ thể của vấn đề để tìm ra giải pháp cuối cùng, tổng quát hơn.

Điều này dẫn chúng ta đến…

Nếu không thể giải quyết vấn đề được đề xuất, hãy cố giải quyết một số vấn đề liên quan trước tiên

Hoặc một vấn đề liên quan và đơn giản hơn.

Giống như viết phần mềm hiệu quả, việc thực hiện giải quyết vấn đề hiệu quả có thể được coi là một quá trình mang tính tịnh tiến.

Đừng cố làm mọi thứ cùng một lúc.

Xây dựng code cuối cùng hoặc thậm chí là các sơ đồ và ý tưởng thiết kế hệ thống là một quá trình sẽ mang lại lợi ích rất nhiều từ việc thực hiện điều tương tự cho các vấn đề quy mô nhỏ hơn.

3. Thực hiện kế hoạch

Thực hiện kế hoạch
“Đề ra phương án, hình thành ý tưởng giải pháp không hề đơn giản. Ta cần rất nhiều yếu tố để thành công: kiến ​​thức tích lũy, thói quen tư duy, sự tập trung và may mắn. Thực hiện kế hoạch lại dễ hơn nhiều; yếu tố chủ chốt là kiên nhẫn.” – George Polya, How to solve it. Nguồn ảnh: Pixabay

Phiên bản dành cho lập trình viên của câu trên là “Nghĩ trước, code sau”. Khi đã hiểu các bước của giải thuật hoặc thiết kế hệ thống, việc triển khai sẽ dễ dàng hơn rất nhiều.

Polya cho rằng những người giải toán giỏi có khả năng kiểm tra từng bước trong giải pháp sau khi hoàn thành và chất vấn từ đầu đến cuối.

Chỉ một dòng suy nghĩ về phân tích, phép toán sai sẽ làm hỏng mọi thứ.

Điều này có vẻ không mang đến nguy hiểm tức thì trong lập trình phần mềm, nhưng nó có thể là nguy hiểm chí mạng, vì bug nghiêm trọng sẽ xuất hiện trong thời điểm tồi tệ nhất – và có thể trong trường hợp rất cụ thể.

Điều này có nghĩa là cần có phạm vi kiểm thử tốt.

Nếu không kiểm thử, bạn sẽ không chất vấn, cứ tự tin coi giải pháp của mình là hoàn hảo.

Rất hữu ích khi có tư duy “Nó sẽ có lỗi chứ?” và liên tục đưa ra tất cả các kịch bản thất bại khác nhau trong giải pháp của mình và tư duy này sẽ được thể hiện rõ trong các bài test phần mềm.

4. Nhìn lại

Nhìn lại
“Ngay cả học sinh khá giỏi, khi đã có được lời giải bài toán và viết xong các lập luận, các bạn liền đóng tập lại. Các bạn đã bỏ lỡ một giai đoạn quan trọng. Khi nhìn lại bài giải, xem xét và nhìn nhận lại kết quả và con đường dẫn đến nó, các bạn có thể củng cố kiến ​​thức và phát triển khả năng giải quyết vấn đề của mình.” – George Polya, How to solve it. Nguồn ảnh: Reshot

Không nhìn lại và đánh giá sự đánh đổi của giải pháp thường xảy ra khi mọi thứ được thực hiện trong vội vàng.

Nếu đó là một giải thuật, bạn có thể nói rõ độ phức tạp về thời gian và không gian không? Code có đọc tốt không?

Nếu đang đưa ra quyết định sẽ có tác động đến toàn hệ thống, hãy ghi ra những đánh đổi.

Dành một giờ để xem xét lại kết quả công việc sẽ giúp bạn tiết kiệm hơn rất nhiều sau này.

Bạn có thể nghỉ ngơi rồi quay lại với nó sau. Việc đắm chìm sâu vào vấn đề đang giải quyết có thể sẽ khiến bạn quên mất những chi tiết liên quan.

Ngoài ra, giải pháp cho vấn đề cụ thể đó có thể được tổng quát hóa để được sử dụng trong nhiều tình huống.

Dùng sự nhạy bén và tư duy cẩn thận để tạo ra những abstraction mới là một cách giải quyết vấn đề đó cho những người khác đối mặt với nó sau này.

Kết

Dù là một cuốn sách dạy giải toán, nhưng How to solve it của George Polya với những lời khuyên vượt thời gian của ông lại hữu ích với dân lập trình như tôi khi tập giải quyết vấn đề bởi lập trình thực sự là một quá trình sử dụng nhiều tư duy và kỹ năng giải quyết vấn đề hiệu quả.

Theo Douglas Navarro

Categories
Gambaru News

5 Xu hướng phát triển phần mềm cần năm 2021

Làm việc từ xa và giãn cách xã hội ảnh hưởng lớn đến hầu hết mọi người; song khi nói đến chuyển đổi kỹ thuật số và phần mềm, mọi thứ vẫn diễn ra sôi nổi hơn bao giờ hết.

Đại dịch đã buộc rất nhiều doanh nghiệp phải thay đổi và thích ứng sự hiện diện trực tuyến của mình bằng cách này hay cách khác.

Đồng thời, các dịch vụ phát triển phần mềm trở nên ngày càng quan trọng.

Đây là lý do tại sao việc cập nhật các xu hướng hiện tại đang diễn ra trong ngành là vô cùng cần thiết.

5 Xu hướng phát triển phần mềm thống trị năm 2021

Dưới đây là một số xu hướng dự đoán sẽ thống trị lĩnh vực phát triển phần mềm cho năm 2021. Hãy cùng Gambaru cập nhật và thảo luận!

1. Điện toán không máy chủ (Serverless Architecture)

Serverless Architecture
Serverless Architecture. Ảnh: AWS Amazon

Điện toán không máy chủ là sự kết hợp của Chức năng như một Dịch vụ (stateless Function as a Service – FasS), chẳng hạn như AWS Lambda và Máy chủ lưu trữ như một Dịch vụ (stateful storage Backend as a Service – BaaS), chẳng hạn như AWS S3.

“Theo định nghĩa của chúng tôi, một dịch vụ được coi là không có máy chủ khi nó cho phép thanh toán dựa trên mức độ sử dụng, tự động mở rộng quy mô mà không cần cấp quyền thủ công.”

– A Berkeley View on Serverless Computing
  • Điện toán không máy chủ là nơi các dịch vụ đám mây được quản lý hoàn toàn. Nó cho phép ta viết code để phát triển ứng dụng mà không cần quản lý hoặc duy trì các cơ sở hạ tầng, chẳng hạn như máy chủ.
  • Điện toán không máy chủ hỗ trợ phương thức thanh toán: dùng bao nhiêu thanh toán bấy nhiêu. So với các nền tảng điện toán truyền thống, điện toán không máy chủ cho phép người dùng lựa chọn phương thức thanh toán dựa trên các tình huống cụ thể, giúp giảm chi phí.
  • Điện toán không máy chủ hướng đến ứng dụng, khác với các nền tảng điện toán hướng đến tài nguyên, chẳng hạn như các máy ảo và container.

Tham khảo sơ đồ kiến ​​trúc của một ứng dụng không máy chủ 100% để biết thêm cách thức hoạt động.

2. Framework đa nền tảng (Multi-Platform Frameworks)

Với lập trình đa nền tảng, cùng một đoạn code sẽ có khả năng chạy được trên nhiều nền tảng khác nhau.

Đa nền tảng ngày càng trở nên phổ biến vì ta có thể sử dụng lại rất nhiều code của dev và các công việc khác.

Ví dụ, một ứng dụng có thể dùng Kotlin/JVM cho back-end và Kotlin/JS cho front-end.

Điều này mang đến một số lợi ích: ngoài cú pháp, nó còn cho phép chia sẻ library và paradigm (chẳng hạn như sử dụng coroutines), trên cả front-endback-end.

Sử dụng Kotlin cũng giúp viết các lớp và hàm có thể được sử dụng cho cả JVM và JS.

Ta còn có thể sử dụng KMM (Kotlin Multiplatform Mobile) để tạo một ứng dụng di động hoạt động trên cả iOS và Android!

Kotlin Multiplatform Mobile
Kotlin Multiplatform Mobile. Nguồn ảnh: Kotlin
Phát triển ứng dụng hoàn chỉnh mà chỉ sử dụng 1 ngôn ngữ lập trình
Ta hoàn toàn có thể phát triển một ứng dụng hoàn chỉnh chỉ sử dụng một ngôn ngữ lập trình. Nguồn ảnh: Freepik

3. Công nghệ Low-Code/No-Code

Lập trình low-code cho phép doanh nghiệp nhanh chóng xây dựng và triển khai các ứng dụng phần mềm mà không cần đến một lập trình viên chuyên nghiệp.

Thay vì viết từng dòng code cho một ứng dụng nhất định, người dùng của nền tảng low code hoặc no code có thể xây dựng các dự án bằng giao diện point-and-click.

Bằng cách này, doanh nghiệp có thể tạo website từ các building block được lập trình sẵn, thiết lập trao đổi dữ liệu với các giải pháp CRM, bổ sung tính năng thanh toán trực tuyến qua Stripe và thậm chí thu thập phản hồi của khách hàng qua Google Forms hoặc một nhà cung cấp khác.

Công nghệ Low Code / No Code
Các doanh nghiệp có thể tiết kiệm thời gian và nguồn lực với công nghệ low code/no code. Ảnh: Rawpixel

Gartner dự đoán rằng hơn một nửa số doanh nghiệp vừa đến lớn sẽ áp dụng các nền tảng ứng dụng low-code trong vòng hai năm tới.

Các công cụ như Salesforce Flow Builder giúp người dùng tạo quy trình làm việc kỹ thuật số từ đầu đến cuối.

Công cụ này cũng tự động hóa các quy trình.

Nó có các thành phần và dịch vụ để người dùng lựa chọn và sử dụng lại.

Cộng đồng các nhà phát triển ứng dụng của Salesforce Flow Builder là một cộng đồng lớn, được hỗ trợ tích cực.

4. Sự thống trị của Native App

Sự thống trị của Native app
Native App mang đến trải nghiệm người dùng xuất sắc. Ảnh: cottonbro – Pexels

Trước xu hướng cross-platform và sự nổi lên của Flutter hiện nay, sẽ thật lạ khi tôi đưa ra dự đoán trên; nhưng quả thực, khi nói đến việc cung cấp trải nghiệm người dùng tốt hơn và hiệu suất mạnh mẽ hơn, bạn phải sử dụng native app.

Ngày càng có nhiều doanh nghiệp đầu tư vào các ứng dụng gốc cho iOS và Android để mang đến cho người dùng trải nghiệm xuất sắc.

Tuy nhiên, tôi thực sự cảm thấy rằng Flutter có một tương lai rất hứa hẹn. Flutter đã có cú chạy đà tốt và kết quả rất khả quan.

Tham khảo thêm bài so sánh chuyên sâu về Flutter và các ứng dụng gốc tại đây.

Nếu là dev về native app và chịu khó học thêm về Flutter thì bạn sẽ càng có nhiều lợi thế.

Với sự thống trị ngày càng tăng của hệ điều hành iOS và Android trên thị trường, việc đầu tư vào phát triển ứng dụng dường như khó mà suy giảm.

5. AI và ML

Artificial Intelligence – trí tuệ nhân tạoMachine Learning – học máy đã trở thành tâm điểm nóng trong một thời gian dài – và sẽ tiếp tục như vậy vì rất nhiều tiềm năng khả thi chúng mang lại.

AI và Machine Learning
Tiềm năng vô hạn từ Artificial Intelligence và Machine Learning. Nguồn ảnh: Alex Knight – Unsplash

Chúng ta chỉ mới bắt đầu khám phá các khả năng đó mà thôi.

Ví dụ, ta đang hướng tới một tương lai với xe hơi không người lái, hay sử dụng drone không người lái để giám sát tình hình giãn cách xã hội trong thời kỳ đại dịch.

Klarna, một trong những start-up kỳ lân lớn nhất châu Âu, đã sử dụng AI và ML để cá nhân hóa trải nghiệm thanh toán cho khách hàng.

Các công cụ và nền tảng AI đã sẵn sàng để giúp các doanh nghiệp nắm bắt cách khách hàng của mình đang thích ứng ra sao với thực tại mới hậu đại dịch.

“Nghiên cứu AI mới nhất của chúng tôi cho thấy 86% doanh nghiệp hiện đang gặt hái được những lợi ích từ trải nghiệm khách hàng tốt hơn thông qua AI và 25% doanh nghiệp áp dụng AI sẽ có doanh thu tăng trong năm 2021 nhờ vào công nghệ này. Đại dịch COVID-19 đã hé mở những giá trị của AI, hoàn toàn phù hợp với việc cải thiện các nhiệm vụ liên quan đến lập kế hoạch nguồn nhân lực, lập mô phỏng và dự báo nhu cầu.”

– Rohan Amin, CIO của Chase

Trong năm 2021 này, khả năng bổ sung các năng lực AI tiên tiến vào các dự án và quy trình kinh doanh sẽ là cực kỳ quan trọng đối với các doanh nghiệp, đặc biệt với doanh nghiệp mong muốn đạt được những bước tiến đột phá trong ngành.

Tham khảo:

  1. Kotlin MPP
  2. Gartner report
  3. Serverless days 2020

Theo Manish Jain

Categories
Dev's Corner

Các thuật toán tìm kiếm

Mục đích chính của thuật toán tìm kiếm là để kiểm tra một phần tử hoặc truy xuất nó từ bất kỳ cấu trúc dữ liệu nào. Các thuật toán tìm kiếm này được phân loại thành hai phần, thường là dựa trên kiểu tìm kiếm.

1. Tìm kiếm tuần tự (Sequential search)

Danh sách hoặc mảng được duyệt qua (traverse) tuần tự và mọi phần tử đều được kiểm tra. Ví dụ: Tìm kiếm tuyến tính

2. Tìm kiếm theo khoảng thời gian (Interval search)

Được thiết kế cho các cấu trúc dữ liệu được sắp xếp và hiệu quả hơn giải thuật tìm kiếm tuần tự vì giải thuật này liên tục nhắm đến trung tâm của cấu trúc dữ liệu và chia đôi không gian tìm kiếm. Ví dụ: Tìm kiếm nhị phân

Trong bài viết này, chúng ta sẽ thảo luận về hai thuật toán tìm kiếm: tìm kiếm tuyến tínhtìm kiếm nhị phân.

Tìm kiếm tuyến tính (Linear Search)

Tim kiếm tuyến tính (Linear search)
Tim kiếm tuyến tính (Linear search). Ảnh: GeeksforGeeks

Giải thuật này rất đơn giản, độ phức tạp là O(N). Một tìm kiếm tuần tự được thực hiện cho từng phần tử trong cấu trúc dữ liệu.

Nếu kết quả phù hợp được tìm thấy, nó sẽ được trả về; nếu không, quá trình tìm kiếm sẽ tiếp tục cho đến hết cấu trúc dữ liệu.

Cách tìm kiếm tuyến tính hoạt động

Giả sử ta muốn tìm giá trị x trong mảng A.

Cách tìm kiếm tuyến tính hoạt động
Cách tìm kiếm tuyến tính hoạt động

Pseudocode

Tìm kiếm tuyến tính - Pseudocode
Tìm kiếm tuyến tính – Pseudocode

Java code

Tìm kiếm tuyến tính - Java code
Tìm kiếm tuyến tính – Java code

Tìm kiếm nhị phân (Binary Search)

Tìm kiếm nhị phân - Binary search.Tìm kiếm nhị phân - Binary search.Tìm kiếm nhị phân - Binary search.
Tìm kiếm nhị phân – Binary search. Ảnh: GeeksforGeeks

Đây là một giải thuật tìm kiếm nhanh độ phức tạp là O(logN).

Giải thuật O(logN) được xem là có tính hiệu quả cao vì tỷ lệ giữa số lượng hoạt động so với kích thước của input giảm và có xu hướng bằng không khi N tăng lên. (N là kích thước input tính bằng đơn vị bit cần để đại diện cho input đó).

Việc thu thập dữ liệu phải ở dạng được sắp xếp để giải thuật này hoạt động chính xác.

Cách tìm kiếm nhị phân hoạt động

Tìm kiếm nhị phân tìm kiếm một phần tử cụ thể bằng cách so sánh với phần tử nằm ở ngay chính giữa của mảng.

Nếu kết quả tìm kiếm khớp, thì index của phần tử này sẽ được trả về. Nếu kết quả không khớp, nó sẽ kiểm tra xem phần tử ở giữa có lớn hơn item này hay không, sau đó nó sẽ tìm kiếm phần tử này trong mảng con bên trái của phần tử ở giữa.

Trường hợp phần tử ở giữa nhỏ hơn, nó sẽ tìm kiếm phần tử trong mảng con ở bên phải của phần tử ở giữa. Cho đến khi kích thước mảng con giảm xuống còn 0, quá trình này sẽ tiếp tục tại mảng con.

Để tìm kiếm nhị phân hoạt động, mảng phải được sắp xếp trước.

Giải thuật

Giả sử ta muốn tìm giá trị x trong mảng A đã sắp xếp.

Cách tìm kiếm nhị phân hoạt động
Cách tìm kiếm nhị phân hoạt động

Pseudocode

Tìm kiếm nhị phân - Pseudocode
Tìm kiếm nhị phân – Pseudocode

Java code

Tìm kiếm nhị phân - Jave code
Tìm kiếm nhị phân – Jave code

Đây là hai giải thuật tìm kiếm được sử dụng phổ biến nhất. Hãy cùng theo dõi các bài viết tiếp theo và thảo luận cùng Gambaru các giải thuật hữu ích khác.

Theo Pulsara Sandeepa

Categories
All about Japan

Doanh nghiệp Nhật Bản sử dụng AI để chống lãng phí thực phẩm

Các công ty Nhật Bản đang tăng cường sử dụng trí tuệ nhân tạo (AI) và các công nghệ tiên tiến khác để giảm thiểu lượng thực phẩm lãng phí và cắt giảm chi phí trong đại dịch COVID-19, đồng thời hướng đến đạt được các mục tiêu bền vững trong quá trình này.

Nhật Bản cần tìm giải pháp cho bài toán lãng phí thực phẩm.
Nhật Bản cần tìm giải pháp cho bài toán lãng phí thực phẩm. Ảnh: Falco Negenman – Unsplash

Báo cáo dữ liệu của chính phủ Nhật cho thấy, việc bỏ hơn 6 triệu tấn rác thải thực phẩm ở quốc gia này khiến nền kinh tế thứ 3 thế giới lãng phí khoảng 2 nghìn tỷ yên (19 tỷ USD) mỗi năm.

Với tình trạng lãng phí thực phẩm trên đầu người cao nhất ở châu Á, chính phủ Nhật Bản vừa ban hành bộ luật mới để giảm một nửa chi phí trước năm 2030, thúc đẩy các công ty tìm kiếm giải pháp cho bài toán trên.

Chống lãng phí thực phẩm bằng công nghệ AI

Lawson Inc

Chuỗi cửa hàng tiện lợi Lawson Inc đã bắt đầu sử dụng AI của công ty DataRobot của Hoa Kỳ để ước tính lượng sản phẩm trên kệ, như cơm nắm onigiri, sandwich trứng và cá ngừ, có thể không bán hết được hoặc cung không đủ cầu.

Lawson đặt mục tiêu giảm lượng hàng dư thừa xuống 30% ở những khu vực có sản phẩm đã tung ra thị trường và muốn giảm một nửa lượng thực phẩm bị lãng phí tại tất cả các cửa hàng của mình vào năm 2030 so với mức của năm 2018.

Xử lý chất thải thực phẩm là chi phí lớn nhất đối với các chủ sở hữu nhượng quyền của Lawson chỉ sau chi phí nhân công.

Suntory Beverage & Food Ltd

Nhà sản xuất đồ uống Suntory Beverage & Food Ltd đang thử nghiệm một sản phẩm AI khác của Fujitsu Ltd để xác định xem các sản phẩm như chai trà ô long và nước khoáng có bị hư hỏng trong quá trình vận chuyển hay không.

Trước đến nay, đây là một nỗ lực tiêu tốn nhiều thời gian của con người.

Với công nghệ AI mới này, Suntory hy vọng có thể nhanh chóng xác định khi nào các chai hộp hoặc nước bên trong đã bị hỏng và cần được trả lại.

Suntory đặt mục tiêu giảm 30-50% lượng hàng hóa bị trả lại, cắt giảm chi phí lãng phí thực phẩm và phát triển một hệ thống tiêu chuẩn chung được đồng thuận giữa các nhà sản xuất thực phẩm khác cũng như các công ty vận chuyển.

Công nghệ giúp đạt mục tiêu phát triển bền vững

Người tiêu dùng Nhật nổi tiếng là kén chọn đang có dấu hiệu ủng hộ phong trào này, đặc biệt là khi đại dịch COVID-19 ảnh hưởng lớn đến thu nhập chung của họ.

Doanh nghiệp sử dụng công nghệ nhằm đạt được mục tiêu phát triển bền vững. Ảnh: Aleksandar Pasaric – PexelsDoanh nghiệp sử dụng công nghệ nhằm đạt được mục tiêu phát triển bền vững.
Doanh nghiệp sử dụng công nghệ nhằm đạt được mục tiêu phát triển bền vững.

Vào năm 2014, ông Tatsuya Sekito đã thành lập Kuradashi, một công ty thương mại điện tử kinh doanh thực phẩm chưa bán hết với mức giá chiết khấu, sau khi nhận thấy rất nhiều thực phẩm bị lãng phí từ các nhà chế biến thực phẩm khi làm việc cho một công ty thương mại Nhật Bản tại Trung Quốc.

Doanh nghiệp trực tuyến này hiện đang phát triển mạnh một phần do nhu cầu về thực phẩm chưa bán hết với giá rẻ tăng vọt khi người tiêu dùng trở nên có ý thức hơn về chi phí trong bối cảnh đại dịch.

Sekito chia sẻ với Reuters:

Doanh số bán hàng của chúng tôi đã tăng 2,5 lần vào năm ngoái so với năm trước đó, còn lượng thực phẩm dư thừa đã tăng gấp đôi kể từ khi virus corona làm ngưng trệ chuỗi cung ứng thực phẩm.

Kuradashi có mạng lưới 800 công ty, bao gồm Meiji Holdings Co, Kagome Co và Lotte Foods Co, chuyên bán cho Kuradashi tổng cộng 50.000 mặt hàng như gói cà ri ăn liền, sinh tố và rong biển chất lượng cao.

Sekito cho biết:

Người tiêu dùng Nhật Bản thường kén chọn, nhưng chúng tôi thu hút khách hàng bằng cách không chỉ cung cấp sản phẩm giá chiết khấu mà còn cơ hội quyên góp một phần tiền mua hàng cho các tổ chức từ thiện, giúp mọi người nâng cao nhận thức về các vấn đề xã hội.

Các doanh nghiệp khác cũng hợp tác với những công ty thực phẩm trong việc phát triển nền tảng công nghệ mới với mục tiêu cắt giảm lãng phí thực phẩm hòa chung nỗ lực toàn cầu nhằm đạt được các mục tiêu phát triển bền vững (Sustainable Development Goals – SDGs).

NEC Corp đang sử dụng AI không chỉ có thể phân tích dữ liệu như thời tiết, lịch và xu hướng của khách hàng để ước tính nhu cầu mà còn đưa ra lý do cho bản phân tích của mình.

NEC đã triển khai công nghệ này cho một số nhà bán lẻ và nhà sản xuất thực phẩm lớn, giúp họ giảm chi phí từ 15% -75%.

NEC hy vọng sẽ chia sẻ và xử lý dữ liệu thông qua một nền tảng chung giữa các nhà sản xuất, nhà bán lẻ và công ty logistics, nhằm giảm thiểu những trường hợp không tương khớp trong chuỗi cung ứng.

Ryoichi Morita, quản lý cấp cao giám sát quá trình tích hợp kỹ thuật số của NEC cho biết:

Giảm lãng phí thực phẩm không phải là mục tiêu cuối cùng của chúng tôi. Chúng tôi mong rằng dự án này có thể giải quyết những thách thức kinh doanh khác như giảm thiểu chi phí, khắc phục tình trạng thiếu lao động, tinh giản chu trình liên quan đến hàng tồn kho, đơn đặt hàng và hậu cần.

Lược dịch theo Tetsushi Kajimoto