Xem thêm

Độ phức tạp của thuật toán - Tìm hiểu về độ phức tạp thời gian của thuật toán

Huy Erick
Độ phức tạp của thuật toán là một khái niệm quan trọng trong lĩnh vực lập trình. Nó đề cập đến số lượng tài nguyên, chẳng hạn như thời gian và bộ nhớ, mà một...

Độ phức tạp của thuật toán là một khái niệm quan trọng trong lĩnh vực lập trình. Nó đề cập đến số lượng tài nguyên, chẳng hạn như thời gian và bộ nhớ, mà một thuật toán cần để giải quyết một vấn đề hoặc thực hiện một nhiệm vụ. Nhưng làm thế nào để tìm hiểu về độ phức tạp thời gian của một thuật toán?

Độ phức tạp của thuật toán là gì?

Độ phức tạp của thuật toán có thể được đo bằng lượng thời gian cần thiết để chạy một thuật toán. Đây là thời gian thực hiện từng câu lệnh code trong một thuật toán. Người ta hiểu thời gian là số lần truy cập bộ nhớ, số lần so sánh giữa các số nguyên, số lần một vòng lặp bên trong được thực thi hoặc một số đơn vị tự nhiên khác liên quan đến lượng thời gian mà thuật toán sẽ sử dụng.

Do-phuc-tap-cua-thuat-toan

Có nhiều loại độ phức tạp thời gian khác nhau được sử dụng, ví dụ như:

  • Độ phức tạp thời gian hằng số (Constant time complexity)
  • Độ phức tạp thời gian tuyến tính (Linear time complexity)
  • Độ phức tạp thời gian logarithmic (Logarithmic time complexity)
  • Độ phức tạp thời gian bậc hai (Quadratic time complexity)
  • Độ phức tạp thời gian bậc ba (Cubic time complexity)

Làm thế nào để tìm độ phức tạp thời gian của thuật toán?

Bạn có thể tính độ phức tạp của một thuật toán bằng cách phân tích các câu lệnh trong chương trình. Tuy nhiên, bạn phải lưu ý cách sắp xếp giữa các câu lệnh vì yếu tố này ảnh hưởng đến thời gian chạy code của bạn. Dưới đây là những phân tích cụ thể về từng trường hợp:

1. Sử dụng ký hiệu Big O

Sử dụng ký hiệu Big O là một cách phổ biến để tính độ phức tạp của thuật toán về thời gian. Big O là một framework để phân tích và so sánh các thuật toán, giúp loại bỏ các hằng số và các số hạng bậc thấp hơn. Ví dụ như O(3*n^2 + 10n + 10) trở thành O(n^2).

Bieu-do-mo-ta-ky-hieu-big-o

2. Tìm độ phức tạp của thuật toán với câu lệnh tuần tự

Nếu bạn đã có các câu lệnh với các thao tác cơ bản như so sánh, gán, đọc biến, bạn có thể tính độ phức tạp của thuật toán bằng cách xem thời gian chạy của từng câu lệnh. Ví dụ, tính tổng bình phương của 3 số, thời gian chạy vẫn là O(1).

3. Với câu điều kiện

Rất hiếm khi bạn có một đoạn code mà không có bất kỳ câu lệnh điều kiện nào. Để tính độ phức tạp của thuật toán trong trường hợp này, bạn cần xem thời gian chạy của mỗi khối câu lệnh điều kiện. Ví dụ, lời giải cho một câu lệnh if và else có thời gian chạy lần lượt là O(n log n) và O(1), kết quả cuối cùng là O(n log n).

4. Cách tính độ phức tạp của thuật toán với câu lệnh lặp

Một tình huống phổ biến là tính độ phức tạp của thuật toán với các vòng lặp for hoặc vòng lặp while.

Linear Time Loops

Đối với bất kỳ vòng lặp nào, bạn cần tính thời gian chạy của khối câu lệnh bên trong và nhân nó với số lần lặp lại vòng lặp. Ví dụ, vòng lặp for có thời gian chạy tuyến tính O(n).

Constant Time Loops

Ví dụ, vòng lặp for mà số lần lặp cố định sẽ có độ phức tạp thời gian là O(1), vì nó không phụ thuộc vào kích thước đầu vào.

Logarithmic Time Loops

Ví dụ, một vòng lặp while trong thuật toán tìm kiếm nhị phân có độ phức tạp thời gian là O(log n), vì thuật toán chia mảng thành nửa đôi mỗi lần lặp.

Hy vọng qua bài viết này, bạn đã hiểu về độ phức tạp của thuật toán và cách tính độ phức tạp thời gian. Đừng ngần ngại tham gia cộng đồng lập trình viên để học hỏi thêm kinh nghiệm.

Nguồn ảnh: ICANTECH

1