hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
    • Cấu trúc dữ liệu và giải thuật
    • Lập Trình C# Cơ Bản
    • Machine Learning
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • Cấu trúc dữ liệu và giải thuật
Giới thiệu về thuật toán

Giới thiệu về thuật toán

  • 11-12-2024
  • Toanngo92
  • 1 Comment

Tôi sẽ trình bày lại nội dung chi tiết hơn, đảm bảo không sót ý nào từ tài liệu bạn cung cấp. Nội dung sẽ được tổ chức chặt chẽ, bám sát tài liệu gốc. Dưới đây là toàn văn trình bày:


Mục lục

  • Giới thiệu về Thuật Toán
    • 1. Thuật toán là gì?
      • Thuật toán BOTTLES_OF_BEER(n):
    • 2. Lịch sử và các phương pháp tính toán
      • Phép nhân dạng lưới (Lattice Multiplication)
      • Phép nhân của nông dân Nga (Russian Peasant Multiplication)
      • Compass and Straightedge Multiplication
    • 3. Mô tả thuật toán
      • Phân tích tính đúng đắn và thời gian thực thi
    • 4. Các ví dụ khác về thuật toán
      • Phân bổ ghế Quốc hội (Congressional Apportionment)
      • Ví dụ về “thuật toán xấu”
    • 5. Phân tích độ phức tạp
    • 6. Bài tập minh họa

Giới thiệu về Thuật Toán

1. Thuật toán là gì?

Thuật toán là một chuỗi các bước rõ ràng, chính xác, không mơ hồ, có thể thực hiện một cách cơ học để đạt được một mục tiêu cụ thể. Ví dụ, thuật toán để hát bài “99 Bottles of Beer on the Wall” được mô tả như sau:

Thuật toán BOTTLES_OF_BEER(n):

  1. Lặp từ i=ni = n xuống 1:
    • Hát: “ii chai bia trên tường, ii chai bia.”
    • Hát: “Lấy một chai xuống, chuyền nó quanh, còn lại i−1i – 1 chai bia trên tường.”
  2. Khi không còn chai nào:
    • Hát: “Không còn chai bia trên tường, không còn chai bia.”
    • Hát: “Đi đến cửa hàng, mua thêm, nn chai bia trên tường.”

Thuật ngữ “algorithm” xuất phát từ tên của nhà toán học Hồi giáo thế kỷ thứ 9, Muhammad ibn Musa al-Khwarizmi. Ông đã giới thiệu các phương pháp tính toán sử dụng hệ thống số thập phân và vòng tròn “0” để biểu thị số không. Các phương pháp này, thông qua Fibonacci và các nhà toán học châu Âu khác, trở thành nền tảng của hệ thống số học hiện đại.


2. Lịch sử và các phương pháp tính toán

Phép nhân dạng lưới (Lattice Multiplication)

Đây là một thuật toán quen thuộc với học sinh Mỹ, được Fibonacci phổ biến trong tác phẩm Liber Abaci. Thuật toán này sắp xếp các số cần nhân vào một lưới, tính các tích con rồi cộng dồn các giá trị theo đường chéo. Công thức tổng quát: x⋅y=∑i=0m−1∑j=0n−1X[i]⋅Y[j]⋅10i+jx \cdot y = \sum_{i=0}^{m-1} \sum_{j=0}^{n-1} X[i] \cdot Y[j] \cdot 10^{i+j}

  • Độ phức tạp thời gian: O(mn)O(mn).

Phép nhân của nông dân Nga (Russian Peasant Multiplication)

Phương pháp này dựa trên phép chia đôi và nhân đôi:

  1. Nếu xx là số lẻ, cộng yy vào kết quả.
  2. Chia xx cho 2 (lấy phần nguyên), nhân đôi yy.
  3. Lặp cho đến khi x=0x = 0.
  • Độ phức tạp thời gian: O(log⁡x⋅log⁡y)O(\log x \cdot \log y).

Compass and Straightedge Multiplication

Trong hình học Hy Lạp, các con số được biểu diễn dưới dạng độ dài đoạn thẳng. Euclid đã phát triển thuật toán sử dụng thước kẻ và compa để nhân hoặc chia hai độ dài. Thuật toán này vận hành dựa trên tính chất của các tam giác đồng dạng.


3. Mô tả thuật toán

Một thuật toán cần được trình bày qua 4 yếu tố:

  1. Cái gì (What): Mô tả bài toán cần giải quyết.
  2. Cách làm (How): Mô tả chi tiết các bước của thuật toán.
  3. Tại sao (Why): Chứng minh thuật toán đúng.
  4. Tốc độ (How Fast): Phân tích thời gian thực thi.

Ví dụ, thuật toán phân bổ ghế của Huntington-Hill cho Quốc hội Mỹ:

  1. Mỗi bang được 1 ghế.
  2. Phân bổ các ghế còn lại dựa trên ưu tiên P/r(r+1)P / \sqrt{r(r + 1)}, trong đó PP là dân số và rr là số ghế hiện tại.

Phân tích tính đúng đắn và thời gian thực thi

  • Tính đúng đắn: Sử dụng quy nạp để chứng minh thuật toán luôn đưa ra kết quả chính xác.
  • Thời gian thực thi: Phân tích qua số lần thực hiện thao tác cơ bản. Ví dụ:
    • BOTTLES_OF_BEER(n) thực hiện 3n+33n + 3 lần nhắc từ “bia”.
    • Thuật toán nhân dạng lưới: O(mn)O(mn).

4. Các ví dụ khác về thuật toán

Phân bổ ghế Quốc hội (Congressional Apportionment)

Thuật toán Huntington-Hill:

  1. Mỗi bang được phân 1 ghế.
  2. Các ghế còn lại được phân dựa trên ưu tiên P/r(r+1)P / \sqrt{r(r+1)}.

Ví dụ về “thuật toán xấu”

Một ví dụ hài hước về thuật toán không thể thực thi:

  1. Lấy 1 triệu đô la.
  2. Nếu bị thu thuế, nói: “Tôi quên.”

Mặc dù không khả thi, ví dụ này minh họa khái niệm “giảm thiểu bài toán” – chuyển bài toán phức tạp thành bài toán đơn giản hơn.


5. Phân tích độ phức tạp

Độ phức tạp được phân tích qua số lần thực hiện thao tác cơ bản. Ví dụ:

  1. Bài hát “99 Bottles of Beer on the Wall”:
    • Độ phức tạp: O(n)O(n).
  2. Bài hát “The Twelve Days of Christmas”:
    • Độ phức tạp: O(n2)O(n^2) (tổng số lần nhắc quà là n(n+1)/2n(n+1)/2).

Một số bài toán yêu cầu độ phức tạp cao hơn, như thuật toán nhân đôi trong nhạc hoặc phép nhân trong các hệ thống biểu diễn khác nhau.


6. Bài tập minh họa

  1. Mô tả thuật toán xác định người thắng cờ vua từ trạng thái ban đầu.
  2. Tìm hoặc viết một bài hát có độ phức tạp O(n3)O(n^3).
  3. Phân tích thời gian hát dựa trên số âm tiết thay vì số từ.

Nguồn bài viết:

https://jeffe.cs.illinois.edu/teaching/algorithms/book/01-recursion.pdf

Bài viết liên quan:

Cấu trúc dữ liệu danh sách liên kết (LinkedList)
Cấu trúc dữ liệu Mảng (Array)
Định lý thợ (Master Theorem)
Giải thuật Qui hoạch động (Dynamic Programming) 
Giải thuật chia để trị (Divide and Conquer)
Phân tích tiệm cận trong CTDL và giải thuật
Giải thuật tham lam (Greedy Algorithm)
Đệ quy trong lập trình
Thuật toán tìm kiếm nhảy – Jump Search
Thuật toán tìm kiếm nhị phân – binary search
Thuật toán tìm kiếm tuần tự – linear search
Sắp xếp trộn – Merge Sort

1 Comments

  1. Pingback: Giới thiệu về thuật toán – Blog nghiên cứu về lập trình, viết mã

THÊM BÌNH LUẬN Cancel reply

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

2. PHÂN TÍCH VÀ ĐẶC TẢ HỆ THỐNG

3. THIẾT KẾ HỆ THỐNG

1. TỔNG QUAN KIẾN THỨC THỰC HÀNH TRIỂN KHAI DỰ ÁN CÔNG NGHỆ THÔNG TIN

Hướng dẫn tự cài đặt n8n comunity trên CyberPanel, trỏ tên miền

Mẫu prompt tạo mô tả chi tiết bối cảnh

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×