Professional Documents
Culture Documents
ĐỘ PHỨC TẠP THUẬT TOÁN
ĐỘ PHỨC TẠP THUẬT TOÁN
Thời gian mà máy tính khi thực hiện một thuật toán không chỉ phụ thuộc vào bản thân thuật
toán đó, ngoài ra còn tùy thuộc từng máy tính. Để đánh giá hiệu quả của một thuật toán, ta có thể
xét số các phép tính phải thực hiện khi thực hiện thuật toán này. Thông thường số các phép tính
được thực hiện phụ thuộc vào là độ lớn của đầu vào. Vì thế độ phức tạp thuật toán là một hàm
phụ thuộc đầu vào.
Để ước lượng độ phức tạp của một thuật toán ta thường dùng khái niệm Big O
Các thao tác đầu ra đầu vào cũng được giả định là O(1). Trong các ví dụ sau đây, ta giả sử
rằng mã bên trong các vòng lặp là O(1).
Độ phức tạp về thuật toán của vòng lặp là số lần lặp mà vòng lặp chạy. Các ví dụ mã sau đây đều
là O(n):
Vì chúng ta bỏ qua các hệ số không đổi và các số hạng bậc thấp hơn nên các ví dụ sau đây cũng
là O(n):
Trong ví dụ này, vòng lặp bên ngoài chạy O(n) lần, và vòng lặp bên trong chạy từ 1 đến n
lần (tức là tối đa là n) vì ký hiệu Big O tính toán độ phức tạp thời gian trong trường hợp xấu
nhất, chúng ta coi vòng lặp bên trong như một yếu tố phụ thuộc vào n. Do đó, đoạn mã này có độ
phức tạp là O(n2 ¿
Nếu một thuật toán chứa nhiều khối mã khác nhau, thì độ phức tạp thời gian của nó sẽ là độ
phức tạp tệ nhất trong số các khối đó. Ví dụ, đoạn mã sau đây có thể được hiểu là O(n2 ¿:
Đoạn mã sau đây có độ phức tạp là O(n2 +m ), bởi vì nó bao gồm hai khối mã có độ phức tạp
lần lượt là O(n2 ) và O(m) và không có khối mã nào trong hai khối đó có độ phức tạp thấp hơn so
với khối mã kia.
HỆ SỐ HẰNG SỐ
Hệ số hằng số (Constant factor) đề cập đến ý tưởng rằng các phép toán khác nhau có cùng
độ phức tạp có thể mất thời gian chạy khác nhau một chút. Ví dụ, ba phép cộng sẽ mất thời gian
hơn một phép cộng đơn lẻ. Một ví dụ khác là mặc dù tìm kiếm nhị phân trên một mảng và chèn
vào một tập hợp đã được sắp xếp đều có độ phức tạp O(log n ), tìm kiếm nhị phân thường nhanh
hơn.
Hệ số hằng số hoàn toàn bị bỏ qua trong ký hiệu Big O. Điều này thường là ổn trong hầu hết
các trường hợp, nhưng nếu giới hạn thời gian cụ thể rất chặt, bạn có thể gặp phải vượt quá giới
hạn thời gian (TLE) với độ phức tạp dự kiến. Khi điều này xảy ra, quan trọng là phải nhớ đến hệ
số hằng số. Ví dụ, một đoạn mã lặp qua tất cả các bộ ba phần tử có thứ tự chạy trong thời gian
O(n3 ) có thể được tăng tốc lên gấp 6 lần nếu chúng ta chỉ cần lặp qua tất cả các bộ ba phần tử
không có thứ tự.