Font size
WorksheetsCTDL>
Total questions: 150
Worksheet time: 75hrs 0mins
Thuật toán khác với chương trình máy tính ở điểm nào?
Thuật toán là ngôn ngữ lập trình, chương trình thì không
Thuật toán là dãy bước giải quyết bài toán, chương trình là hiện thực cụ thể bằng ngôn ngữ
Thuật toán luôn nhanh hơn chương trình
Chương trình không cần dựa trên thuật toán
Đặc điểm nào sau đây không đúng với thuật toán?
A. Có tính hữu hạn
B. Có tính xác định rõ ràng
C. Có thể thực hiện được
D. Luôn có độ phức tạp O(1)
Trong ví dụ tìm giá trị lớn nhất trong dãy, tại sao ta gán max = a[1] thay vì max = 0?
A. Vì 0 không phải lúc nào cũng là phần tử lớn nhất
B. Vì a[1] chắc chắn lớn nhất
C. Vì quy tắc thuật toán bắt buộc
D. Vì dễ lập trình hơn
Cấu trúc dữ liệu được dùng để làm gì?
Giảm bộ nhớ máy tính
Tổ chức và lưu trữ dữ liệu để truy xuất và xử lý hiệu quả
Thay thế cho thuật toán
Chỉ lưu trữ số nguyên
Trong cấu trúc dữ liệu ngăn xếp (stack), nguyên tắc hoạt động là:
FIFO (vào trước – ra trước)
LIFO (vào sau – ra trước)
Ngẫu nhiên
Theo chỉ số nhỏ nhất
Điểm khác biệt chính giữa mảng và danh sách liên kết là gì?
A. Mảng luôn chiếm ít bộ nhớ hơn
B. Danh sách liên kết lưu trữ các phần tử rời rạc kết nối bằng con trỏ
C. Danh sách liên kết chỉ lưu số nguyên
D. Mảng nhanh hơn mọi thao tác
Trong bản ghi (record), các trường dữ liệu có đặc điểm gì?
Luôn cùng kiểu dữ liệu
Có thể thuộc nhiều kiểu dữ liệu khác nhau
Chỉ lưu chuỗi ký tự
Không có tên trường
Tại sao cần phân tích độ phức tạp thuật toán?
Để biết ngôn ngữ nào nhanh nhất
Để đánh giá hiệu quả và so sánh giữa các thuật toán
Để tránh lập trình lỗi
Để tránh dùng cấu trúc dữ liệu
Trong ví dụ thuật toán tìm giá trị lớn nhất, điều kiện nào đảm bảo max luôn chứa phần tử lớn nhất?
So sánh từng phần tử với max và cập nhật nếu lớn hơn
Chọn phần tử cuối cùng làm max
Chọn phần tử nhỏ nhất làm max
Không cần so sánh
Mô-đun hóa trong giải quyết bài toán có ý nghĩa chính là gì?
Chia bài toán thành nhiều bước lặp lại
Chia bài toán thành các phần nhỏ, dễ quản lý và xử lý
Lập trình song song để tăng tốc độ
Thực hiện bài toán bằng ngôn ngữ cấp thấp
Lợi ích chính của việc mô-đun hóa chương trình là gì?
Giúp chương trình chạy nhanh hơn
Giúp giảm chi phí lưu trữ dữ liệu
Giúp chương trình dễ hiểu, dễ kiểm tra và bảo trì
Giúp chương trình có giao diện đẹp hơn
Một mô-đun trong chương trình thường có đặc điểm:
Có thể hoạt động độc lập
Không thể tái sử dụng
Chỉ gồm một câu lệnh duy nhất
Luôn phức tạp
Trong phân tích bài toán, bước quan trọng đầu tiên là gì?
Viết chương trình
Tìm ngôn ngữ lập trình
Xác định rõ yêu cầu và dữ liệu đầu vào, đầu ra
Tối ưu hóa thuật toán
Một chương trình lớn được chia thành các mô-đun nhỏ có cấu trúc như thế nào?
Tuyến tính
Cây phân cấp
Ngẫu nhiên
Vòng lặp vô hạn
Khi thiết kế giải thuật theo hướng mô-đun, các mô-đun con có thể được:
Bỏ qua khi chạy
Gọi lặp lại nhiều lần
Chỉ chạy một lần duy nhất
Không liên kết với nhau
Việc mô-đun hóa giúp ích gì cho việc phát triển phần mềm?
Tăng số lượng lỗi
Khó kiểm thử hơn
Giúp tái sử dụng và mở rộng dễ dàng
Giảm tính linh hoạt
Phân tích và thiết kế giải thuật nhằm mục đích gì?
Giúp chọn phần cứng phù hợp
Giúp lập trình viên có giải pháp rõ ràng và tối ưu trước khi viết mã
Giúp giảm kích thước bộ nhớ
Giúp chọn đúng ngôn ngữ lập trình
Đặc trưng quan trọng của phương pháp Top-Down là:
Giải quyết bài toán bằng cách từ dưới lên
Bắt đầu từ bài toán tổng quát rồi chia nhỏ dần thành các bài toán con
Không cần quan tâm đến cấu trúc dữ liệu
Luôn dùng vòng lặp
Điều kiện dừng trong thuật toán đệ quy có vai trò gì?
Giúp hàm ko lặp vô hạn
Giúp hàm chạy nhanh hơn
Giảm bộ nhớ
Giảm thay thế vòng lặp
Trong định nghĩa giai thừa n!, điều kiện dừng là gì?
A. n = 0 hoặc n = 1
B. n = -1
C. n > 1
D. Không có điều kiện dừng
Đệ quy thường được sử dụng trong các bài toán nào?
Bài toán không có dữ liệu
Bài toán có cấu trúc lặp lại hoặc phân rã nhỏ dần
Bài toán chỉ cần một phép cộng
Bài toán duyệt tuyến tính
Điểm khác biệt cơ bản giữa đệ quy và vòng lặp là gì?
Đệ quy nhanh hơn vòng lặp
Đệ quy gọi lại chính hàm, còn vòng lặp lặp khối lệnh
Đệ quy không cần điều kiện dừng
Đệ quy không thể thay thế vòng lặp
Thuật toán đệ quy có thể được thay thế bằng:
Một vòng lặp thích hợp
Một cấu trúc dữ liệu khác
Một ngôn ngữ lập trình khác
Không thể thay thế
Nếu muốn tìm giá trị nhỏ nhất trong dãy, ta cần thay đổi điều kiện nào trong thuật toán?
Nếu a[i] > min thì min = a[i]
Nếu a[i] < min thì min = a[i]
Nếu a[i] = min thì min = a[i]
Không cần thay đổi
Giả sử ta có ngăn xếp rỗng và thực hiện các thao tác: Push(5), Push(7), Pop(). Giá trị trả về từ Pop() là gì?
5
7
0
Không xác định
Một bản ghi sinh viên gồm: Họ tên (string), Tuổi (integer), Điểm trung bình (float). Đây là ví dụ của:
Danh sách liên kết
Mảng số nguyên
Record chứa nhiều kiểu dữ liệu
Ngăn xếp
Giả sử có danh sách liên kết lưu dãy [2 → 4 → 6]. Nếu chèn thêm phần tử 8 vào cuối, danh sách trở thành:
[8 → 2 → 4 → 6]
[2 → 4 → 6 → 8]
[2 → 8 → 4 → 6]
[2 → 4 → 8 → 6]
Cho dãy số: 12, 7, 15, 3. Sau khi chạy thuật toán tìm max, giá trị trung gian của max sau mỗi vòng lặp (bắt đầu từ a[1]) là:
12 → 12 → 15 → 15
7 → 12 → 15 → 15
12 → 15 → 15 → 15
12 → 7 → 15 → 3
Trong ngăn xếp, sau các thao tác Push(2), Push(4), Push(6), Pop(), giá trị cuối cùng còn lại ở đỉnh ngăn xếp là:
2
4
6
null
Để viết thuật toán tính tổng các phần tử trong dãy số nguyên gồm n phần tử, bước lặp quan trọng là gì?
Cộng dồn từng phần tử vào biến tổng trong vòng lặp
Chỉ lấy phần tử đầu tiên
Chỉ lấy phần tử lớn nhất
Ko cần vòng lặp
Cho một bài toán “Quản lý điểm sinh viên”. Theo phương pháp Top-Down, bước phân rã đầu tiên hợp lý nhất là:
A. Chia thành các mô-đun: Nhập điểm, Tính điểm trung bình, Xếp loại
B. Viết chương trình ngay
C. Chia thành từng vòng lặp
D. Tạo giao diện đẹp
Một chương trình tính lương nhân viên có thể được mô-đun hóa thành:
Quản lý nhân sự, Quản lý lương, Xuất báo cáo
Nhập dữ liệu, In dữ liệu, Xóa dữ liệu
Quản lý thư viện, Quản lý học phí
Ngẫu nhiên
Nếu một bài toán quá phức tạp để giải trực tiếp, ta nên áp dụng phương pháp nào?
Top-Down (chia nhỏ bài toán)
Bottom-Up
Brute Force
Ngẫu nhiên
Trong thiết kế phần mềm, khi một mô-đun được viết tốt, thì:
Không thể tái sử dụng
Có thể tái sử dụng trong nhiều chương trình khác
Chỉ chạy đúng trong chương trình hiện tại
Không cần kiểm thử
Một bài toán sắp xếp danh sách có thể được phân rã thành các bước: Nhập dữ liệu → Chọn thuật toán sắp xếp → Xuất kết quả. Đây là ví dụ của:
Phương pháp Top-Down
Phương pháp Bottom-Up
Mô hình hướng đối tượng
Thuật toán đệ quy
Cho bài toán quản lý thư viện. Nếu áp dụng mô-đun hóa, ta có thể tạo các mô-đun:
Quản lý sách, Quản lý độc giả, Quản lý mượn – trả sách
Chỉ một mô-đun duy nhất cho toàn hệ thống
Mỗi quyển một module riêng
Chỉ quản lí độc giả
Trong quá trình kiểm thử, mô-đun hóa giúp:
Khó phát hiện lỗi hơn
Dễ kiểm tra từng phần riêng lẻ
Không cần kiểm tra nữa
Chỉ kiểm thử toàn bộ một lần
Khi lập trình một chương trình tính toán phức tạp, việc mô-đun hóa sẽ:
Giúp chia công việc cho nhiều lập trình viên
Khiến việc bảo trì khó hơn
Tăng độ phức tạp không cần thiết
Không ảnh hưởng gì
Một sinh viên được giao viết chương trình quản lý lớp học. Bạn ấy chia thành các mô-đun: Quản lý học sinh, Quản lý môn học, Quản lý điểm số. Đây là ví dụ của:
Mô-đun hóa theo phương pháp Top-Down
Phân tích sai bài toán
Mô-đun hóa không hợp lý
Chia nhỏ không cần thiết
Khi dùng phương pháp Top-Down, nếu bài toán con vẫn quá phức tạp, ta cần làm gì?
Chia nhỏ tiếp thành các bài toán con khác
Bỏ qua bài toán con đó
Viết chương trình ngay
Thay đổi ngôn ngữ lập trình
Tính F(4) trong dãy Fibonacci:
2
3
5
8
Giả sử hàm đệ quy không có điều kiện dừng, điều gì xảy ra?
Hàm kết thúc sớm
Hàm chạy vô hạn và gây tràn bộ nhớ
Hàm chạy ko đúng kết quả
HÀm ko chạy
Cho công thức đệ quy giai thừa, để tính 5!, lời gọi đệ quy sâu nhất là:
fact(5)
fact(4)
fact(1)
fact(0)
Một bài toán đệ quy có thể được viết lại bằng vòng lặp. Ví dụ nào sau đây có thể chuyển thành vòng lặp dễ dàng?
Tính giai thừa
Duyệt cây nhị phân
Giải bài toán tháp Hà Nội
Tìm đường đi trong mê cung
Khi giải bài toán đệ quy, để tăng hiệu suất (giảm số lần gọi hàm thừa), ta có thể áp dụng kỹ thuật nào?
Chia để trị
Quy hoạch động
Dùng cấu trúc dữ liệu Stack
Sử dụng vòng lặp While
Thuật toán có thể được mô tả bằng những cách nào sau đây?
Ngôn ngữ tự nhiên có cấu trúc
Lưu đồ (Flowchart)
Giả mã (Pseudocode)
Tất cả các cách trên
Ưu điểm chính của việc dùng giả mã (pseudocode) để mô tả thuật toán là gì?
Chạy trực tiếp trên máy tính mà không cần biên dịch
Dễ đọc, dễ hiểu và gần với ngôn ngữ lập trình
Tự động chuyển đổi thành sơ đồ khối
Nhanh hơn mã lập trình thực tế
Vì sao lưu đồ (flowchart) thường được dùng để mô tả thuật toán?
Đơn giản hóa việc phân tích thuật toán bằng biểu diễn trực quan
Chỉ sử dụng cho thuật toán tìm kiếm
Tự động chuyển đổi thành mã nguồn
Không cần kiến thức lập trình
Trong thuật toán tìm số lớn nhất, vòng lặp For i = 2 to n thực hiện chức năng gì?
Lặp qua từng phần tử của mảng bắt đầu từ phần tử thứ 2
Ktra giá trị lớn nhất ban đầu
Xuất kết quả cuối cùng
Khởi tạo mảng
Trong ví dụ tìm số lớn nhất, điều kiện nào quyết định việc gán giá trị mới cho biến max?
Nếu a[i] < max
Nếu a[i] > max
Nếu i = n
Nếu a[1] = max
Mảng thường được lưu trữ trong bộ nhớ như thế nào?
Rời rạc, không liên tiếp
Liên tiếp
Dưới dạng cây (tree)
Dưới dạng chuỗi liên kết hai chiều
Danh sách liên kết khác với mảng ở điểm nào?
Các phần tử được lưu trữ liên tiếp trong bộ nhớ
Kích thước cố định ngay từ khi khai báo
Kích thước linh hoạt, có thể thay đổi khi thêm/xóa phần tử
Truy cập ngẫu nhiên đến phần tử bất kỳ nhanh chóng
Con trỏ trong danh sách liên kết có chức năng gì?
Lưu dữ liệu của phần tử
Chỉ ra địa chỉ phần tử kế tiếp
Sắp xếp các phần tử
Giúp truy cập trực tiếp vào phần tử bất kỳ
Trong danh sách liên kết đơn, nút cuối cùng trỏ tới giá trị nào?
Địa chỉ nút đầu
Giá trị dữ liệu NULL
Địa chỉ nút kế tiếp
Địa chỉ nút giữa danh sách
Ưu điểm chính của danh sách liên kết so với mảng là gì?
Truy cập ngẫu nhiên nhanh hơn
Dễ dàng thêm và xóa phần tử mà ko cần dịch chuyển lại
Tốn ít bộ nhớ hơn mảng
Không cần dùng con trỏ
Danh sách liên kết kép khác danh sách liên kết đơn ở điểm nào?
Lưu được nhiều kiểu dữ liệu khác nhau
Mỗi nút có hai con trỏ, trỏ tới nút trước và nút sau
Kích thước cố định khi khai báo
Không cần cấp phát động
Hai thao tác nào sau đây là thao tác cơ bản của ngăn xếp?
Insert và Delete
Push và Pop
Enqueue và Dequeue
Add và Remove
Khi thực hiện thao tác Pop trong ngăn xếp, điều gì xảy ra?
A. Thêm phần tử mới vào cuối
B. Xóa phần tử ở đỉnh ngăn xếp
C. Xóa phần tử ở đáy ngăn xếp
D. Sắp xếp lại ngăn xếp
Ngăn xếp thường được sử dụng trong tình huống nào?
Duyệt cây theo chiều rộng
Tính toán biểu thức số học
Quản lý hàng đợi tiến trình
Truy cập cơ sở dữ liệu
Trạng thái "ngăn xếp rỗng" xảy ra khi:
Push vào ngăn xếp đầy
Pop từ ngăn xếp rỗng
Truy cập phần tử ở giữa ngăn xếp
Khởi tạo ngăn xếp chưa cấp phát bộ nhớ
Hàng đợi (Queue) hoạt động theo nguyên tắc nào?
LIFO (Last In First Out)
FIFO (First In First Out)
FILO(First In Last Out)
Random(Ngẫu nhiên)
Trong hàng đợi, phần tử được đưa vào ở đâu và lấy ra ở đâu?
A. Vào ở cuối, ra ở cuối
B. Vào ở đầu, ra ở đầu
C. Vào ở cuối, ra ở đầu
D. Vào ở đầu, ra ở cuối
Hàng đợi thường được ứng dụng trong tình huống nào?
Duyệt cây theo chiều sâu
Lập lịch CPU trong hệ điều hành
Tính giá trị biểu thức toán học
Xử lý đệ quy
Trong cây nhị phân, mỗi nút có tối đa bao nhiêu nút con?
1
2
3
Không giới hạn
Trong cây nhị phân tìm kiếm (BST), giá trị ở nút bên trái so với nút cha là:
Lớn hơn
Nhỏ hơn
Bằng
Không xác định
Cho mảng a[1..n]. Để duy trì cấu trúc các phần tử mảng nằm liên tiếp trong bộ nhớ khi xóa phần tử ở vị trí i (1 ≤ i ≤ n), số lượng gán tối thiểu cần thực hiện (dịch các phần tử bên phải sang trái) là:
A. i
B. n
C. n - i
D. i - 1
Ta có mảng tính kích thước 10 đã đầy. Muốn thêm 1 phần tử mới, cách xử lý phổ biến nhất là:
Thêm trực tiếp, mảng tự mở rộng(luôn được)
Tạo mảng mới lớn hơn, copy tất cả phần tử rồi thêm vào
Bỏ phần tử đầu tiên và ghi đè lên vị trí đó(không được phép)
Không thể làm gì cả
Viết đoạn giả-mã để tính tổng phần tử của mảng a[1..n]. Độ phức tạp theo số phép gán/cộng là bao nhiêu?
O(1)
O(log n)
O(n)
O(n²)
Để xóa một nút có giá trị cụ thể trong danh sách liên kết đơn, bước nào không cần thiết?
A. Tìm vị trí nút cần xóa
B. Cập nhật con trỏ của nút trước để trỏ sang nút sau
C. Giải phóng bộ nhớ của nút bị xóa
D. Dịch chuyển toàn bộ phần tử còn lại trong danh sách
Với danh sách liên kết kép, để duyệt từ cuối về đầu, cần:
Con trỏ chỉ đến nút cuối và duyệt ngược qua con trỏ "previous"
Con trỏ chỉ đến nút đầu và duyệt theo con trỏ "next"
Tạo bản sao danh sách và đảo ngược thứ tự
Không thể duyệt ngược được
Để triển khai một ngăn xếp bằng danh sách liên kết, thao tác nào được dùng để thêm phần tử vào stack?
Chèn vào cuối danh sách
Chèn vào đầu danh sách
Chèn vào vị trí bất kỳ
Thay thế nút đầu tiên
Nếu một ngăn xếp ban đầu rỗng, thực hiện Push(1), Push(2), Push(3), sau đó Pop() một lần thì phần tử nào được lấy ra?
1
2
3
Không có phần tử nào
Cho ngăn xếp đang chứa [5, 8, 12] (5 ở đáy, 12 ở đỉnh). Thực hiện Pop(), sau đó Push(20), trạng thái ngăn xếp sẽ là:
[5, 8, 12, 20]
[5, 8, 20]
[20, 5, 8]
[5, 20, 8]
Khi triển khai ngăn xếp bằng mảng có kích thước cố định, vấn đề nào có thể xảy ra?
Stack Overflow
Stack Underflow
Cả A và B
Không có vấn đề nào
Để kiểm tra một biểu thức dấu ngoặc đơn có hợp lệ không (ví dụ: "(a+b)*(c-d)"), cấu trúc dữ liệu phù hợp nhất là:
Danh sách liên kết
Ngăn xếp
Hàng đợi
Cây
Khi triển khai hàng đợi bằng mảng tĩnh, vấn đề nào thường xảy ra?
Không thể thêm phần tử mới dù còn ô trống (do phần đầu không dịch chuyển)
Không thể xóa phần tử
Bộ nhớ luôn bị đầy
Không xảy ra vấn đề gì
Để cài đặt một hệ thống điều phối khách hàng đến quầy dịch vụ theo thứ tự đến, cấu trúc dữ liệu phù hợp nhất là:
Ngăn xếp (Stack)
Danh sách liên kết
Hàng đợi (Queue)
Đồ thị (Graph)
Trong một cây nhị phân có 7 nút, số cạnh của cây là:
6
7
8
Cho đồ thị vô hướng có 4 đỉnh {A, B, C, D} và các cạnh {(A,B), (A,C), (B,D)}. Bậc của đỉnh A là:
1
2
3
4
Trong đồ thị vô hướng có 5 đỉnh và 7 cạnh, tổng bậc của các đỉnh là:
A. 7
B. 10
C. 14
D. 35
for i ← 1 to n do A[i] ← A[i] * 2 end for Đoạn giả ngữ trên thực hiện thao tác nào với mảng A?
Chèn phần tử mới vào mảng
Nhân đôi giá trị của từng phần tử trong mảng
Tìm phần tử lớn nhất của mảng
Xoá tất cả phần tử bằng 2
if Stack is not full then push(Stack, X) else print("Overflow") Thao tác chính đang được minh hoạ trong đoạn giả ngữ trên là gì?
Lấy phần tử ra khỏi ngăn xếp
Thêm phần tử vào ngăn xếp
Duyệt tất cả phần tử
Đếm số phần tử hiện có
if Queue is not empty then
Y ← dequeue(Queue)
print(Y)
Theo đoạn giả ngữ trên, thao tác nào sau đây đang diễn ra:
Chèn phần tử vào hàng đợi
Lấy phần tử ở cuối hàng đợi
Lấy phần tử ở đầu hàng đợi và xóa khỏi hàng đợi
Sắp xếp hàng đợi theo thứ tự tăng dần
newNode.data ← X newNode.next ← head head ← newNode Đoạn giả ngữ trên biểu diễn thao tác nào sau đây:
Xoá nút đầu danh sách
Thêm nút mới vào đầu danh sách
Tìm nút cuối cùng
Chèn nút vào giữa danh sách
PreOrder(node):
if node ≠ NULL then
print(node.data)
PreOrder(node.left)
PreOrder(node.right)
Thuật toán trên duyệt cây nào sau đây:
In-order (LNR)
Post-order (LRN)
Pre-order (NLR)
Level-order
Khi cần truy xuất phần tử thứ i trong một tập dữ liệu, cấu trúc nào hiệu quả hơn?
Danh sách liên kết
Mảng
Cây nhị phân
Đồ thị
Để chèn phần tử mới vào giữa danh sách liên kết đôi, so với mảng thì:
Nhanh hơn
Chậm hơn
Ngăn xếp phù hợp nhất để giải quyết bài toán nào?
Quản lý tiến trình trong hệ điều hành
Hoàn tác thao tác (Undo) trong soạn thảo văn bản
Quản lý máy in
Tìm đường đi ngắn nhất trong bản đồ
Hàng đợi ưu tiên khác hàng đợi thông thường ở chỗ:
Phần tử nào đến trước thì ra trước
Phần tử có giá trị lớn/nhỏ nhất được ưu tiên lấy ra
Các phần tử luôn được lưu trữ tuần tự
Các phần tử không thể xóa
Cây nhị phân tìm kiếm (BST) có đặc điểm gì quan trọng để hỗ trợ tìm kiếm hiệu quả?
Mọi nút đều có đúng 2 con
Nút trái nhỏ hơn nút cha, nút phải lớn hơn nút cha
Cây luôn cân bằng chiều cao
Các nút được thêm theo thứ tự bất kỳ
Trong đồ thị, để kiểm tra xem đồ thị có chu trình hay không, ta thường sử dụng:
BFS hoặc DFS
Dijkstra
Kruskal
Ma trận kề
Khi cần cài đặt bảng băm, cấu trúc dữ liệu nào thường được sử dụng để xử lý xung đột?
Ngăn xếp
Danh sách liên kết
Mảng
Đồ thị
Với dữ liệu thường xuyên thay đổi kích thước (thêm/xóa nhiều), cấu trúc nào phù hợp hơn?
Mảng
Danh sách liên kết
Ngăn xếp
Cây AVL
Để xây dựng ứng dụng xử lý văn bản với chức năng Undo/Redo, cấu trúc nào là tối ưu?
Mảng
Ngăn xếp
Hàng đợi
Cây
Trong quản lý tiến trình hệ điều hành (CPU scheduling), cấu trúc dữ liệu nào nên được dùng?
Ngăn xếp
Hàng đợi
Cây
Danh sách liên kết
Khi cần xây dựng hệ thống tìm kiếm danh bạ (dữ liệu lớn, cần tìm nhanh), cấu trúc nào nên sử dụng?
Mảng tính
Danh sách liên kết
Cây nhị phân tìm kiếm cân bằng (AVL/Red-Black)
Ngăn xếp
Để mô phỏng mối quan hệ bạn bè trên mạng xã hội, cấu trúc nào phù hợp nhất?
Mảng
Cây
Đồ thị
Hàng đợi
Khi cần xử lý số lượng lớn dữ liệu để tìm kiếm tuyến tính theo chỉ số, em
chọn:
Mảng
Danh sách liên kết
Cây
Đồ thị
Nếu phải cài đặt chức năng kiểm tra dấu ngoặc đúng/sai trong biểu thức toán
học, bạn nên chọn:
Hàng đợi
Ngăn xếp
Cây
Danh sách liên kết
Để biểu diễn cây thư mục của hệ điều hành (folder, file), cấu trúc dữ liệu nào
phù hợp nhất?
Mảng
Cây
Hàng đợi
Đồ thị
Đặc điểm nào đúng với Bubble Sort?
Luôn so sánh phần tử đầu với tất cả phần tử còn lại
So sánh các phần tử kề nhau và đổi chỗ nếu sai thứ tự
Chia dãy thành 2 nửa và sắp xếp đệ quy
Sử dụng cấu trúc cây HEAP
Thuật toán Merge Sort có đặc điểm gì?
Là thuật toán tại chỗ (in-place)
Là thuật toán chia để trị, cần mảng phụ để gộp
So sánh từng cặp kề nhau
Luôn chọn phần tử nhỏ nhất còn lại
Heap Sort dựa vào cấu trúc dữ liệu nào?
A. Cây nhị phân tìm kiếm
B. Cây Heap (Max-Heap hoặc Min-Heap)
C. Danh sách liên kết
D. Bảng băm
Thuật toán Selection Sort có đặc điểm:
Mỗi vòng lặp chọn phần tử nhỏ nhất còn lại và đưa lên đầu
Luôn chọn pivot để phân hoạch
Sử dụng cây nhị phân
Cần mảng phụ để gộp
Với dãy nhỏ (ví dụ < 20 phần tử), thuật toán nào thường hiệu quả?
Bubble Sort
Insertion Sort
Merge Sort
Heap Sort
Thuật toán nào hoạt động hiệu quả cho dãy gần như đã sắp xếp?
Insertion Sort
Quick Sort
Merge Sort
Heap Sort
Tìm kiếm tuần tự có độ phức tạp trung bình là:
O(1)
O(n)
O(log n)
O(n log n)
Điều kiện áp dụng Tìm kiếm nhị phân là:
Mảng phải ngẫu nhiên
Mảng phải đã sắp xếp
Mảng phải là số nguyên dương
Mảng có kích thước chẵn
Trong tìm kiếm tuần tự, phần tử cần tìm ở cuối danh sách → số lần so sánh tối
đa là:
1
log n
n
n/2
Ưu điểm chính của Binary Search so với Linear Search là:
Đơn giản hơn
Không cần mảng sắp xếp
Nhanh hơn trên mảng lớn đã sắp xếp
Không cần bộ nhớ phụ
AVL Tree là loại cây nhị phân tìm kiếm có đặc điểm:
C. Mỗi nút có nhiều hơn 2 con
D. Chỉ dùng cho số nguyên
A. Luôn cân bằng chiều cao
B. Không cần cân bằng
Khi thực hiện tìm kiếm nhị phân trên mảng 16 phần tử, số lần so sánh tối đa là:
log₂16 = 4
8
16
4
Trong Linear Search, nếu phần tử cần tìm ở đầu dãy, số phép so sánh là:
n
1
2
log n
Binary Search thường đươc cài đặt bằng
Cây AVL
Cấu trúc hàng đợi
Cấu trúc ngăn xếp
Vòng lặp hoặc đệ quy
Khi chèn dữ liệu liên tục vào BST mà không cân bằng, hiện tượng gì xảy ra?
Tốc độ tìm kiếm giảm dần
Cây trở thành cây AVL
Tìm kiếm luôn O(log n)
Không thay đổi
Đặc điểm của tìm kiếm tuần tự là:
Hiệu quả trên mảng lớn
Không yêu cầu dữ liệu phải sắp xếp
Nhanh hơn Binary Search
Cần bộ nhớ phụ
Cho mảng [9, 3, 7, 1]. Sau một lần duyệt Bubble Sort, mảng sẽ là:
[3, 7, 1, 9]
[3, 1, 7, 9]
[1, 3, 7, 9]
[7, 9, 3, 1]
Cho mảng [4, 2, 7, 1]. Sau một bước Selection Sort (chọn phần tử nhỏ nhất đưa
về đầu), mảng là:
[1, 2, 7, 4]
[2, 4, 7, 1]
[1, 4, 7, 2]
[1, 2, 4, 7]
Cho mảng [8, 3, 6]. Sau một lần Insertion Sort với phần tử 6, mảng trở thành:
[3, 6, 8]
[8, 6, 3]
[3, 8, 6]
[6, 3, 8]
Cho mảng [9, 5, 7, 3]. Sau một bước Selection Sort (chọn phần tử nhỏ nhất),
mảng sẽ là:
[3, 5, 7, 9]
[3, 9, 7, 5]
[3, 7, 5, 9]
[9, 5, 3, 7]
Cho mảng [4, 7, 2, 1]. Sau lần duyệt đầu tiên của Bubble Sort, phần tử nào chắc
chắn đúng vị trí cuối cùng?
1
2
7
4
Cho mảng [6, 2, 9, 1]. Sau một bước Selection Sort, mảng trở thành:
[1, 6, 9, 2]
[1, 2, 6, 9]
[1, 6, 2, 9]
[2, 6, 1, 9]
Cho mảng [2, 5, 7, 9, 12]. Tìm số 7 bằng Linear Search cần bao nhiêu bước?
1
2
3
4
Với mảng [1, 3, 5, 7, 9], tìm số 7 bằng Binary Search, phần tử giữa đầu tiên
được so sánh là:
1
3
5
7
Với mảng [2, 4, 6, 8, 10], tìm số 8 bằng Binary Search cần tối đa bao nhiêu lần
so sánh?
1
2
3
4
Trong cây BST chứa các giá trị [10, 5, 20, 15], nếu tìm số 15, ta đi theo thứ tự:
10 → 20 → 15
10 → 5 → 15
20 → 15
10 → 15
Cho mảng [2, 4, 6, 8, 10]. Nếu tìm số 12 bằng Binary Search → kết quả là
Vị trí thứ 5
Vị trí thứ 4
Vị trí 0
Không tìm thấy
Với mảng [1, 3, 5, 7, 9], tìm số 9 bằng Linear Search cần bao nhiêu bước?
3
4
5
6
Với mảng [1, 4, 7, 10, 13, 16], tìm số 10 bằng Binary Search cần tối đa:
1 bước
2 bước
3 bước
4 bước
Trong cây BST gốc là 40, có các nút 20 (trái), 60 (phải), 10 (trái của 20). Tìm số
10 đi theo thứ tự:
40 → 20 → 10
40 → 60 → 10
20 → 10
40 → 10
for i ← 1 to n do
if A[i] = key then
return i
end if
end for
return -1
Thuật toán trên thực hiện thao tác nào sau đây:
Tìm kiếm nhị phân
Tìm kiếm tuyến tính (Linear Search)
Sắp xếp chèn (Insertion Sort)
Sắp xếp chọn (Selection Sort)
low ← 1
high ← n
while low ≤ high do
mid ← (low + high) / 2
if A[mid] = key then return mid
else if A[mid] > key then high ← mid - 1
else low ← mid + 1end while
return -1
Đoạn giả ngữ trên mô tả thuật toán nào và yêu cầu gì về dữ liệu?
Linear Search – không yêu cầu dữ liệu sắp xếp
Binary Search – mảng phải được sắp xếp
Jump Search – mảng không cần sắp xếp
Interpolation Search – mảng không cần sắp xếp
for i ← 1 to n-1 do
for j ← 1 to n-i do
if A[j] > A[j+1] then
swap(A[j], A[j+1])
Thuật toán trên thực hiện thao tác nào dưới đây:
Sắp xếp nổi bọt (Bubble Sort)
Sắp xếp chèn (Insertion Sort)
Sắp xếp chọn (Selection Sort)
Quick Sort
for i ← 2 to n do
key ← A[i]
j ← i - 1
while j > 0 and A[j] > key do
A[j+1] ← A[j]
j ← j - 1
A[j+1] ← key
Thuật toán trên thực hiện thao tác nào sau đây:
Selection Sort
Merge Sort
Insertion Sort
Heap Sort
for i ← 1 to n-1 do
min ← i
for j ← i+1 to n do
if A[j] < A[min] then min ← j
swap(A[i], A[min])
Thuật toán trên mô tả hành động nào sau đây:
Sắp xếp chèn
Sắp xếp nổi bọt
Sắp xếp chọn (Selection Sort)
Quick Sort
Tìm phần tử nhỏ nhất trong cây nhị phân tìm kiếm (BST) thực hiện bằng cách:
Duyệt toàn bộ cây
Đi hết nhánh trái của cây
Đi hết nhánh phải của cây
So sánh tất cả các nút
Khi biểu diễn đồ thị thưa (ít cạnh so với số đỉnh), cấu trúc nào tiết kiệm bộ nhớ
hơn?
Ma trận kề
Danh sách kề
Mảng
Ngăn xếp
Nếu dữ liệu gần như đã sắp xếp, thuật toán nào hoạt động hiệu quả hơn?
Bubble Sort
Insertion Sort
Selection Sort
Quick Sort
Khi chọn thuật toán tìm kiếm, yếu tố quan trọng nhất để quyết định giữa Linear
Search và Binary Search là:
Số lượng phần tử
Tính chất đã sắp xếp của dữ liệu
Bộ nhớ RAM
Kiểu dữ liệu số nguyên hay chuỗi
Merge Sort có ưu điểm lớn nhất so với Quick Sort ở điểm nào?
Ít bộ nhớ hơn
Độ phức tạp ổn định trong mọi trường hợp
Không cần chia mảng
Nhanh hơn trong thực tế
Khi nào Selection Sort có lợi thế hơn so với Bubble Sort?
Khi cần ít hoán đổi hơn
Khi mảng đã sắp xếp gần hoàn chỉnh
Khi mảng có ít phần tử
Khi cần sắp xếp ổn định
Để tìm kiếm nhanh nhất trong tập dữ liệu rất lớn (hàng triệu phần tử đã sắp
xếp), ta nên chọn:
Linear Search
Binary Search
Bubble Sort + Linear Search
Selection Sort + Linear Search
Khi sắp xếp mảng lớn với dữ liệu ngẫu nhiên, Quick Sort thường nhanh hơn
Merge Sort vì:
Ít đệ quy hơn
Sử dụng chia để trị và thao tác tại chỗ
Không cần chia mảng con
Luôn có độ phức tạp O(n)
Nếu bạn cần sắp xếp dữ liệu học sinh theo điểm số (khoảng 50 phần tử), thuật
toán hợp lý nhất là:
Bubble Sort
Insertion Sort
Merge Sort
Quick Sort
Khi bạn cần một thuật toán sắp xếp ổn định (stable sort), bạn chọn:
Selection Sort
Bubble Sort
Insertion Sort
Merge Sort
Khi dữ liệu rất nhỏ (dưới 10 phần tử), thuật toán nào thường hiệu quả nhất?
Merge Sort
Insertion Sort
Heap Sort
Quick Sort
Nếu chỉ tìm kiếm vài lần trên tập dữ liệu nhỏ, nên chọn:
Linear Search
Binary Search
Cây AVL (AVL Tree)
Hash Table
Nếu cần tìm kiếm lặp lại hàng triệu lần trên tập dữ liệu tĩnh và đã sắp xếp, lựa
chọn tốt nhất là:
Linear Search
Binary Search
Bubble Sort trước rồi tìm
Quick Sort trước rồi tìm
Nếu dữ liệu thay đổi thường xuyên (thêm/xóa nhiều), cấu trúc tìm kiếm tối ưu
hơn BST là:
Binary Search
Cây AVL (AVL Tree)
Hash Table
Linear Search
Nếu chỉ cần tìm kiếm một lần duy nhất trong tập dữ liệu chưa sắp xếp, phương
án hiệu quả nhất là:
Sắp xếp rồi Binary Search
Linear Search trực tiếp
Dùng AVL Tree
Hash Table
