Trắc nghiệm Tin học 11 Kết nối tri thức Bài 25: Thực hành xác định độ phức tạp thời gian thuật toán - Đề 06
Trắc nghiệm Tin học 11 Kết nối tri thức Bài 25: Thực hành xác định độ phức tạp thời gian thuật toán - Đề 06 được xây dựng với nhiều câu hỏi chất lượng, sát với nội dung chương trình học, giúp bạn dễ dàng ôn tập và kiểm tra kiến thức hiệu quả. Hãy cùng bắt đầu làm bài tập trắc nghiệm ngay để nâng cao hiểu biết và chuẩn bị tốt cho kỳ thi sắp tới!
Câu 1: Khi phân tích độ phức tạp thời gian của một thuật toán, ký hiệu Big O (ví dụ: O(n), O(n^2), O(log n)) chủ yếu mô tả điều gì?
- A. Thời gian chạy chính xác của thuật toán trên một máy tính cụ thể.
- B. Số dòng mã lệnh trong thuật toán.
- C. Sự tăng trưởng của thời gian chạy khi kích thước dữ liệu đầu vào (n) tăng lên rất lớn.
- D. Lượng bộ nhớ mà thuật toán sử dụng.
Câu 2: Cho đoạn mã giả sau:
```
function ProcessArray(arr, n):
sum = 0
for i from 0 to n-1:
sum = sum + arr[i]
return sum
```
Độ phức tạp thời gian của hàm `ProcessArray` là bao nhiêu?
- A. O(1)
- B. O(n)
- C. O(n^2)
- D. O(log n)
Câu 3: Thuật toán tìm kiếm tuần tự (Linear Search) trên một mảng có kích thước n. Trong trường hợp xấu nhất, độ phức tạp thời gian của thuật toán này là bao nhiêu?
- A. O(1)
- B. O(n)
- C. O(n^2)
- D. O(n log n)
Câu 4: Cho đoạn mã giả sau:
```
function AnalyzeData(data, n):
count = 0
for i from 0 to n-1:
for j from 0 to n-1:
if data[i] == data[j]:
count = count + 1
return count
```
Độ phức tạp thời gian của hàm `AnalyzeData` là bao nhiêu?
- A. O(n)
- B. O(n log n)
- C. O(n^2)
- D. O(n^3)
Câu 5: Đối với các thuật toán sắp xếp đơn giản như Sắp xếp chọn (Selection Sort) hoặc Sắp xếp nổi bọt (Bubble Sort), độ phức tạp thời gian trong trường hợp xấu nhất và trung bình thường là bao nhiêu?
- A. O(n)
- B. O(log n)
- C. O(n^2)
- D. O(n log n)
Câu 6: Độ phức tạp thời gian O(1) có ý nghĩa gì?
- A. Thời gian thực hiện không phụ thuộc vào kích thước dữ liệu đầu vào n.
- B. Thời gian thực hiện tăng tuyến tính theo kích thước dữ liệu đầu vào n.
- C. Thời gian thực hiện tăng theo bình phương của kích thước dữ liệu đầu vào n.
- D. Thời gian thực hiện tăng theo logarit của kích thước dữ liệu đầu vào n.
Câu 7: Khi phân tích độ phức tạp thời gian của một thuật toán, tại sao chúng ta thường chỉ quan tâm đến số hạng có bậc cao nhất và bỏ qua các hằng số cùng các số hạng bậc thấp hơn?
- A. Vì các số hạng bậc thấp hơn không ảnh hưởng đến thời gian chạy.
- B. Vì các hằng số luôn bằng 1 trong phân tích Big O.
- C. Vì chúng ta chỉ quan tâm đến trường hợp tốt nhất của thuật toán.
- D. Vì khi n đủ lớn, sự tăng trưởng của thời gian chạy chủ yếu được quyết định bởi số hạng có bậc cao nhất.
Câu 8: Hai thuật toán A và B cùng giải quyết một vấn đề. Thuật toán A có độ phức tạp O(n^2), thuật toán B có độ phức tạp O(n log n). Khi kích thước dữ liệu đầu vào n rất lớn, thuật toán nào có xu hướng chạy nhanh hơn?
- A. Thuật toán A.
- B. Thuật toán B.
- C. Cả hai thuật toán chạy với tốc độ tương đương.
- D. Không thể xác định chỉ dựa vào độ phức tạp Big O.
Câu 9: Cho đoạn mã giả sau:
```
function Example(n):
i = 1
while i < n:
print(i)
i = i * 2
```
Độ phức tạp thời gian của hàm `Example` là bao nhiêu?
- A. O(n)
- B. O(n^2)
- C. O(1)
- D. O(log n)
Câu 10: Thuật toán tìm kiếm nhị phân (Binary Search) trên một mảng đã được sắp xếp có kích thước n. Độ phức tạp thời gian trong trường hợp xấu nhất của thuật toán này là bao nhiêu?
- A. O(n)
- B. O(n^2)
- C. O(1)
- D. O(log n)
Câu 11: Cho đoạn mã giả sau:
```
function Combine(arr1, n1, arr2, n2):
// arr1 có kích thước n1, arr2 có kích thước n2
sum1 = 0
for i from 0 to n1-1:
sum1 = sum1 + arr1[i] // Vòng lặp 1
sum2 = 0
for j from 0 to n2-1:
sum2 = sum2 + arr2[j] // Vòng lặp 2
return sum1 + sum2
```
Giả sử n1 và n2 có cùng độ lớn, ký hiệu là n (n1 ≈ n2 ≈ n). Độ phức tạp thời gian của hàm `Combine` là bao nhiêu?
- A. O(n^2)
- B. O(n)
- C. O(log n)
- D. O(1)
Câu 12: Tại sao việc xác định độ phức tạp thời gian của thuật toán lại quan trọng đối với lập trình viên?
- A. Để biết thuật toán có sử dụng ngôn ngữ lập trình hiện đại hay không.
- B. Để biết thuật toán có thể giải quyết được mọi bài toán hay không.
- C. Để đánh giá hiệu suất của thuật toán khi xử lý dữ liệu lớn và so sánh các thuật toán khác nhau.
- D. Để kiểm tra xem thuật toán có bị lỗi cú pháp hay không.
Câu 13: Cho đoạn mã giả sau:
```
function PrintPairs(arr, n):
for i from 0 to n-1:
for j from i to n-1:
print(arr[i], arr[j])
```
Độ phức tạp thời gian của hàm `PrintPairs` là bao nhiêu?
- A. O(n)
- B. O(n log n)
- C. O(n^2)
- D. O(n^3)
Câu 14: Nếu một thuật toán có độ phức tạp O(n), và nó mất 100 mili giây để xử lý dữ liệu có kích thước n=1000. Ước tính thời gian cần thiết để xử lý dữ liệu có kích thước n=10000 là bao nhiêu?
- A. 100 mili giây
- B. 1000 mili giây (1 giây)
- C. 10000 mili giây (10 giây)
- D. 100000 mili giây (100 giây)
Câu 15: Giả sử một thuật toán có độ phức tạp O(n^2). Nếu nó mất 1 giây để xử lý dữ liệu có kích thước n=1000. Ước tính thời gian cần thiết để xử lý dữ liệu có kích thước n=2000 là bao nhiêu?
- A. 1 giây
- B. 2 giây
- C. 3 giây
- D. 4 giây
Câu 16: Trong phân tích độ phức tạp, "trường hợp tốt nhất" (best case) của một thuật toán là gì?
- A. Tình huống dữ liệu đầu vào khiến thuật toán thực hiện số phép tính ít nhất.
- B. Tình huống dữ liệu đầu vào khiến thuật toán thực hiện số phép tính nhiều nhất.
- C. Thời gian chạy trung bình của thuật toán trên nhiều bộ dữ liệu khác nhau.
- D. Thời gian chạy của thuật toán trên máy tính nhanh nhất.
Câu 17: Cho đoạn mã giả sau:
```
function CheckConstant(arr, n):
if n > 0:
print(arr[0])
// Các thao tác khác không phụ thuộc vào n
result = 1 + 2
return result
```
Độ phức tạp thời gian của hàm `CheckConstant` là bao nhiêu?
- A. O(1)
- B. O(n)
- C. O(log n)
- D. O(n^2)
Câu 18: Đối với thuật toán tìm kiếm tuần tự (Linear Search) trên mảng kích thước n, trường hợp tốt nhất xảy ra khi nào và độ phức tạp thời gian trong trường hợp đó là bao nhiêu?
- A. Phần tử cần tìm không có trong mảng, O(n).
- B. Phần tử cần tìm ở vị trí cuối cùng, O(n).
- C. Phần tử cần tìm ở vị trí đầu tiên, O(1).
- D. Mảng đã được sắp xếp, O(log n).
Câu 19: Khi một thuật toán bao gồm nhiều phần có độ phức tạp khác nhau (ví dụ: một phần O(n) và một phần O(n^2) thực hiện nối tiếp nhau), độ phức tạp tổng thể của thuật toán được xác định bởi phần nào?
- A. Phần có độ phức tạp thấp nhất.
- B. Phần có độ phức tạp cao nhất.
- C. Trung bình cộng độ phức tạp của các phần.
- D. Tích độ phức tạp của các phần.
Câu 20: Cho đoạn mã giả sau:
```
function ProcessMatrix(matrix, n):
// matrix là ma trận vuông n x n
total = 0
for i from 0 to n-1:
for j from 0 to n-1:
total = total + matrix[i][j]
return total
```
Độ phức tạp thời gian của hàm `ProcessMatrix` khi duyệt qua tất cả các phần tử của ma trận n x n là bao nhiêu?
- A. O(n)
- B. O(n log n)
- C. O(n^2)
- D. O(n^3)
Câu 21: Thuật toán nào trong các lựa chọn sau đây thường có độ phức tạp thời gian tốt nhất (nhanh nhất) đối với các bộ dữ liệu lớn?
- A. O(log n)
- B. O(n)
- C. O(n log n)
- D. O(n^2)
Câu 22: Cho đoạn mã giả sau:
```
function PartialSum(arr, n):
sum = 0
for i from 0 to min(n-1, 100):
sum = sum + arr[i]
return sum
```
Độ phức tạp thời gian của hàm `PartialSum` là bao nhiêu?
- A. O(1)
- B. O(n)
- C. O(log n)
- D. O(n^2)
Câu 23: Giả sử bạn có một thuật toán O(n log n). Nếu nó xử lý n=1000 phần tử trong 10ms, ước tính thời gian để xử lý n=10000 phần tử là bao nhiêu? (Lưu ý: log(1000) ≈ 10, log(10000) ≈ 13.3)
- A. Khoảng 100 ms
- B. Khoảng 133 ms
- C. Khoảng 1000 ms
- D. Khoảng 1330 ms (1.33 giây)
Câu 24: Trong phân tích độ phức tạp, "trường hợp xấu nhất" (worst case) của một thuật toán là gì?
- A. Tình huống dữ liệu đầu vào khiến thuật toán thực hiện số phép tính ít nhất.
- B. Tình huống dữ liệu đầu vào khiến thuật toán thực hiện số phép tính nhiều nhất.
- C. Thời gian chạy trung bình của thuật toán trên nhiều bộ dữ liệu khác nhau.
- D. Thời gian chạy của thuật toán trên máy tính chậm nhất.
Câu 25: Cho đoạn mã giả sau:
```
function ExampleNested(n):
count = 0
for i from 1 to n:
for j from 1 to n:
for k from 1 to n:
count = count + 1
return count
```
Độ phức tạp thời gian của hàm `ExampleNested` là bao nhiêu?
- A. O(n)
- B. O(n^2)
- C. O(n log n)
- D. O(n^3)
Câu 26: Khi so sánh hiệu suất của hai thuật toán có độ phức tạp O(n log n) và O(n^2), điều gì là đúng khi kích thước dữ liệu n tăng lên?
- A. Thuật toán O(n log n) sẽ nhanh hơn đáng kể so với O(n^2).
- B. Thuật toán O(n^2) sẽ nhanh hơn đáng kể so với O(n log n).
- C. Hai thuật toán sẽ có hiệu suất tương đương.
- D. Hiệu suất chỉ phụ thuộc vào hằng số ẩn trong ký hiệu Big O.
Câu 27: Cho đoạn mã giả sau:
```
function ProcessEveryOther(arr, n):
sum = 0
for i from 0 to n-1 step 2:
sum = sum + arr[i]
return sum
```
Độ phức tạp thời gian của hàm `ProcessEveryOther` là bao nhiêu?
- A. O(1)
- B. O(n)
- C. O(log n)
- D. O(n^2)
Câu 28: Độ phức tạp thời gian O(n log n) thường xuất hiện trong các thuật toán loại nào?
- A. Tìm kiếm tuần tự.
- B. Các thao tác cơ bản trên mảng cố định.
- C. Các thuật toán có ba vòng lặp lồng nhau.
- D. Các thuật toán sắp xếp hiệu quả như Merge Sort (Sắp xếp trộn) hoặc Quick Sort (Sắp xếp nhanh).
Câu 29: Nếu một thuật toán có độ phức tạp O(n^3) và mất 8 giây để xử lý dữ liệu có kích thước n=100. Ước tính thời gian cần thiết để xử lý dữ liệu có kích thước n=200 là bao nhiêu?
- A. 64 giây
- B. 16 giây
- C. 32 giây
- D. 128 giây
Câu 30: Trong phân tích độ phức tạp thời gian, "trường hợp trung bình" (average case) của một thuật toán là gì?
- A. Tình huống dữ liệu đầu vào khiến thuật toán thực hiện số phép tính ít nhất.
- B. Tình huống dữ liệu đầu vào khiến thuật toán thực hiện số phép tính nhiều nhất.
- C. Thời gian chạy kỳ vọng của thuật toán trên tất cả các bộ dữ liệu đầu vào có thể xảy ra, tính trung bình.
- D. Thời gian chạy của thuật toán khi n là số nguyên tố.