Quan sát và ước lượng thời gian thực hiện các đoạn chương trình 1 và 2 trong Hình 24.2. Chương trình nào chạy nhanh hơn? Vì sao?
Quan sát và ước lượng thời gian thực hiện các đoạn chương trình 1 và 2 trong Hình 24.2. Chương trình nào chạy nhanh hơn? Vì sao?
Quan sát và thực hiện đánh giá thời gian chạy của các chương trình 1 và 2 trong Hình 24.2. Từ đó biết và hiểu được cách đánh giá thời gian thực hiện chương trình.
Thảo luận (1)Hướng dẫn giảiChương trình 1: Thời gian thực hiện chương trình là T1 = T1(n) = \(2+n+1=n+3\) (đơn vị thời gian)
Chương trình 2: Thời gian thực hiện chương trình là T2 = T2(n) = \(2+n^2+1=n^2+3\) (đơn vị thời gian)
(Trả lời bởi Quoc Tran Anh Le)
Các lệnh và đoạn chương tình sau cần chạy trong bao nhiêu đơn vị thời gian?
Thảo luận (1)Hướng dẫn giảia) \(T_1=1+\dfrac{n}{3}=1+\dfrac{1000000}{3}\) (đơn vị thời gian).
b) \(T_2=1+1+\dfrac{n}{3}=2+\dfrac{1000000}{3}\) (đơn vị thời gian).
(Trả lời bởi Quoc Tran Anh Le)
Khẳng định "Trong mọi chương trình chỉ có đúng một phép toán tích cực" là đúng hay sai?
Thảo luận (1)Hướng dẫn giảiSai. Trong một chương trình máy tính, có thể có nhiều phép toán tích cực (positive operations), cũng như các phép toán khác nhau, chẳng hạn phép toán cộng, trừ, nhân, chia, so sánh, gán giá trị, và các phép toán logic, v.v... Các phép toán tích cực là các phép toán thực hiện các tính chất tích cực của chương trình, như tính toán dữ liệu, xử lý logic, và đưa ra kết quả mong đợi.
(Trả lời bởi Thanh An)
Cùng trao đổi và tìm hiểu cách phân loại thuật toán dựa trên độ phức tạp thời gian thuật toán.
Thảo luận (1)Hướng dẫn giảiThuật toán là một chuỗi các bước được thiết kế để giải quyết một vấn đề cụ thể. Một trong những yếu tố quan trọng để đánh giá hiệu suất của một thuật toán là độ phức tạp thời gian, tức là thời gian mà thuật toán mất để thực thi dựa trên kích thước đầu vào của vấn đề. Phân loại thuật toán dựa trên độ phức tạp thời gian là một phương pháp được sử dụng phổ biến để đánh giá và so sánh hiệu suất của các thuật toán khác nhau. Dưới đây là một số phân loại chính dựa trên độ phức tạp thời gian của thuật toán:
-O(1) (độ phức tạp thời gian hằng số): Đây là loại thuật toán có thời gian thực thi không thay đổi theo kích thước đầu vào. Thời gian thực thi của thuật toán này là cố định, vì vậy độ phức tạp thời gian là hằng số. Ví dụ: Truy cập vào phần tử trong mảng có kích thước cố định.
-O(log n) (độ phức tạp thời gian logarithmic): Đây là loại thuật toán có thời gian thực thi tăng theo logarit của kích thước đầu vào. Thuật toán này thường được sử dụng trong các bài toán tìm kiếm nhị phân, các thuật toán chia để trị, hoặc các thuật toán sắp xếp hiệu quả như QuickSort hoặc MergeSort.
-O(n) (độ phức tạp thời gian tuyến tính): Đây là loại thuật toán có thời gian thực thi tăng tỷ lệ trực tiếp với kích thước đầu vào. Ví dụ: Duyệt qua từng phần tử trong mảng một lần.
-O(n2) (độ phức tạp thời gian bậc hai): Đây là loại thuật toán có thời gian thực thi tăng theo bình phương của kích thước đầu vào. Ví dụ: Thuật toán sắp xếp Bubble Sort, các thuật toán tìm kiếm không hiệu quả như Linear Search trong một mảng lồng nhau.
-O(nk) (độ phức tạp thời gian bậc k): Đây là loại thuật toán có thời gian thực thi tăng theo lũy thừa của kích thước đầu
(Trả lời bởi Quoc Tran Anh Le)
Tính độ phức tạp của các hàm thời gian sau:
a) T(n) = 2n(n - 2) + 4.
b) T(n) = n3 + 5n - 3.
Thảo luận (1)Hướng dẫn giảia) T(n) = 2n(n - 2) + 4 = 2n2 - 4n + 4 = O(n2)
b) T(n) = n3 + 5n – 3 = O(n3)
(Trả lời bởi Quoc Tran Anh Le)
Đọc, quan sát, thảo luận để biết một số quy tắc đơn giản tính độ phức tạp thời gian thuật toán.
Thảo luận (1)Hướng dẫn giảiTham khảo:
QT1. Quy tắc cộng: O(f(n)+g(n))=O(max(f(n),g(n)))
QT2. Quy tắc nhân:
- Với hằng sô: O(C.f(n))=O(f(n))
- Với hàm số: O(f(n).g(n))=O(f(n)).O(g(n))
(Trả lời bởi Time line)
Áp dụng các quy tác trên để tính độ phức tạp của các hàm thời gian sau:
a) T(n) = n3 + nlogn + 2n + 1.
b) T(n) = 3n4 + 2n2logn + 10.
Thảo luận (1)Hướng dẫn giải
Xác định độ phức tạp thời gian cho chương trình sau:
n = 1000
s = 0
for i in range (n);
s = s + i*(i+1)
print (s)
Thảo luận (1)Hướng dẫn giảiTHAM KHẢO!
Chương trình trên tính tổng các giá trị i*(i+1) trong khoảng từ 0 đến n-1 và lưu kết quả vào biến s. Để xác định độ phức tạp thời gian của chương trình này, ta cần xem xét số lần lặp của vòng for và các phép toán trong vòng lặp.
Vòng for: Vòng lặp này chạy từ 0 đến n-1, với n là 1.000. Vậy số lần lặp là n, hay 1.000 lần.
Các phép toán trong vòng lặp:
Phép gán s = s + i*(i+1): Đây là phép gán giá trị vào biến s, có độ phức tạp là O(1).
Phép toán i*(i+1): Đây là phép nhân và cộng, có độ phức tạp là O(1).
Vậy tổng độ phức tạp thời gian của chương trình là O(n), hay O(1.000)
(Trả lời bởi Thanh An)
Xác định độ phức tạp thời gian tính toán cho chương trình sau:
n = 1000
sum = 0
i = 1while i <n;
i = i*2
sum = sum + 1
print (sum)
Thảo luận (1)Hướng dẫn giảiChương trình trên tính số lần lặp cần thiết để i lớn hơn n bằng cách nhân i với 2 trong mỗi lần lặp, sau đó tăng biến sum lên 1. Để xác định độ phức tạp thời gian của chương trình này, ta cần xem xét số lần lặp của vòng while và các phép toán trong vòng lặp.
Vòng while: Vòng lặp này chạy cho đến khi i >= n, và giá trị ban đầu của i là 1. Trong mỗi lần lặp, i được nhân với 2, vậy số lần lặp là log2(n) (vì sau mỗi lần nhân i với 2, giá trị của i sẽ gấp đôi). Ví dụ, nếu n = 1000 thì số lần lặp là log2(1000) ≈ 10.
Các phép toán trong vòng lặp:
Phép gán i = i * 2: Đây là phép nhân, có độ phức tạp là O(1).
Phép gán sum = sum + 1: Đây là phép gán giá trị vào biến sum, có độ phức tạp là O(1).
Vậy tổng độ phức tạp thời gian của chương trình là O(log n), hay O(log2(1000)) ≈ O(10)
(Trả lời bởi Quoc Tran Anh Le)