1. Trong khoa học máy tính, khái niệm "Big O notation" được sử dụng để mô tả điều gì của một thuật toán?
A. Số lượng dòng mã của thuật toán.
B. Độ phức tạp về thời gian hoặc không gian của thuật toán khi kích thước đầu vào tăng lên.
C. Số lượng biến được sử dụng trong thuật toán.
D. Tốc độ chạy của thuật toán trên một cấu hình phần cứng cụ thể.
2. Khi nói về cấu trúc dữ liệu "ngăn xếp" (stack), thao tác nào sau đây là đặc trưng cho cách hoạt động LIFO (Last-In, First-Out)?
A. Enqueue (Thêm vào cuối hàng đợi).
B. Dequeue (Lấy ra từ đầu hàng đợi).
C. Push (Thêm vào đỉnh ngăn xếp).
D. Peek (Xem phần tử ở giữa ngăn xếp).
3. Trong cấu trúc dữ liệu cây nhị phân tìm kiếm (Binary Search Tree - BST), nếu một nút có giá trị nhỏ hơn nút cha, thì nó sẽ nằm ở đâu?
A. Bên phải nút cha.
B. Bên trái nút cha.
C. Không có quy tắc vị trí cố định.
D. Ngay phía trên nút cha.
4. Một thuật toán tìm kiếm tuyến tính (linear search) duyệt qua từng phần tử của một danh sách cho đến khi tìm thấy phần tử mong muốn. Độ phức tạp thời gian của thuật toán này trong trường hợp xấu nhất là bao nhiêu?
A. O(1)
B. O(log n)
C. O(n)
D. O(n^2)
5. Đâu là một ứng dụng của "đa hình" (polymorphism) trong lập trình hướng đối tượng?
A. Giảm số lượng biến trong chương trình.
B. Cho phép các đối tượng thuộc các lớp khác nhau phản ứng khác nhau với cùng một lời gọi phương thức.
C. Tăng tốc độ thực thi của chương trình.
D. Đảm bảo tính bảo mật của dữ liệu.
6. Đâu là một ví dụ về cách sử dụng "chuỗi" (string) trong lập trình?
A. Lưu trữ ngày tháng năm.
B. Biểu diễn một dãy các ký tự, ví dụ "Ngôn ngữ lập trình".
C. Lưu trữ số lượng học sinh.
D. Thực hiện phép tính toán học.
7. Khi một hàm nhận các giá trị đầu vào để thực hiện công việc, các giá trị đó được gọi là gì?
A. Biến toàn cục.
B. Tham số (Parameters) hoặc Đối số (Arguments).
C. Hằng số.
D. Kiểu dữ liệu trả về.
8. Theo phân tích của Donald Knuth, điều gì là yếu tố quan trọng nhất để đánh giá chất lượng của một thuật toán?
A. Khả năng mở rộng và tái sử dụng của mã nguồn.
B. Hiệu quả về thời gian và không gian sử dụng tài nguyên.
C. Tính dễ đọc và dễ hiểu của mã nguồn.
D. Khả năng hoạt động trên nhiều hệ điều hành khác nhau.
9. Trong lập trình hướng đối tượng (Object-Oriented Programming - OOP), khái niệm "tính đóng gói" (encapsulation) đề cập đến điều gì?
A. Khả năng một lớp kế thừa thuộc tính và phương thức từ lớp khác.
B. Việc kết hợp dữ liệu (thuộc tính) và các phương thức xử lý dữ liệu đó vào trong một đơn vị duy nhất (lớp), đồng thời kiểm soát quyền truy cập vào chúng.
C. Khả năng thể hiện một đối tượng dưới nhiều hình thức khác nhau.
D. Việc tạo ra các đối tượng từ bản thiết kế là lớp.
10. Đâu là ưu điểm chính của thuật toán sắp xếp trộn (merge sort) so với sắp xếp nhanh (quick sort) trong một số trường hợp?
A. Merge sort luôn có hiệu năng tốt hơn Quick sort.
B. Merge sort có độ phức tạp thời gian ổn định hơn (không phụ thuộc vào cách sắp xếp ban đầu).
C. Merge sort yêu cầu ít không gian bộ nhớ hơn.
D. Merge sort dễ cài đặt hơn Quick sort.
11. Vòng lặp "for" thường được sử dụng khi nào trong lập trình?
A. Khi muốn lặp lại một hành động cho đến khi gặp một điều kiện bất kỳ.
B. Khi số lần lặp đã biết trước hoặc có thể tính toán được dựa trên một phạm vi xác định.
C. Khi cần thực hiện một hành động ít nhất một lần.
D. Khi muốn lặp lại hành động vô hạn.
12. Khi thực hiện phép chia 7 / 2 trong nhiều ngôn ngữ lập trình sử dụng kiểu dữ liệu số nguyên, kết quả thường là bao nhiêu?
A. 3.5
B. 3
C. 4
D. Lỗi phép chia.
13. Trình biên dịch (compiler) có vai trò gì trong quá trình phát triển phần mềm?
A. Chạy trực tiếp mã nguồn để thực thi chương trình.
B. Dịch mã nguồn viết bằng ngôn ngữ lập trình bậc cao thành mã máy mà máy tính có thể hiểu và thực thi.
C. Giúp người dùng tương tác trực tiếp với phần cứng.
D. Tạo ra giao diện người dùng đồ họa cho ứng dụng.
14. Cấu trúc dữ liệu "hàng đợi" (queue) hoạt động theo nguyên tắc nào?
A. LIFO (Last-In, First-Out).
B. FIFO (First-In, First-Out).
C. LILF (Last-In, Last-Out First).
D. FILO (First-In, Last-Out).
15. Ngôn ngữ lập trình bậc cao khác với ngôn ngữ lập trình bậc thấp ở điểm nào cơ bản nhất?
A. Ngôn ngữ bậc cao khó viết hơn.
B. Ngôn ngữ bậc cao gần gũi với ngôn ngữ tự nhiên của con người và trừu tượng hóa phần cứng.
C. Ngôn ngữ bậc cao chỉ dùng cho hệ điều hành.
D. Ngôn ngữ bậc cao không cần trình biên dịch.
16. Đâu là một ví dụ về kiểu dữ liệu số nguyên (integer) trong lập trình?
A. "Hello World"
B. 3.14159
C. 100
D. "A"
17. Đâu là một ví dụ về việc sử dụng cấu trúc dữ liệu đồ thị (graph) trong thực tế?
A. Lưu trữ danh sách các bài hát trong một thư viện.
B. Mô hình hóa mạng xã hội, nơi các nút là người dùng và các cạnh biểu thị mối quan hệ bạn bè.
C. Tạo một danh sách công việc cần thực hiện theo thứ tự.
D. Xây dựng một cấu trúc dữ liệu để tìm kiếm nhanh một từ khóa.
18. Khi so sánh hai thuật toán cùng giải quyết một vấn đề, nếu thuật toán A có độ phức tạp thời gian là O(n) và thuật toán B có độ phức tạp thời gian là O(n^2), điều này có nghĩa là gì khi n tăng lên?
A. Thuật toán A sẽ chậm hơn thuật toán B.
B. Cả hai thuật toán sẽ có tốc độ tăng trưởng thời gian như nhau.
C. Thuật toán B sẽ có thời gian thực thi tăng nhanh hơn nhiều so với thuật toán A.
D. Thuật toán A sẽ sử dụng nhiều bộ nhớ hơn thuật toán B.
19. Độ phức tạp thời gian của thuật toán sắp xếp nổi bọt (bubble sort) trong trường hợp xấu nhất là bao nhiêu?
A. O(n)
B. O(n log n)
C. O(n^2)
D. O(log n)
20. Khi thiết kế một ứng dụng xử lý dữ liệu lớn, việc lựa chọn cấu trúc dữ liệu phù hợp có vai trò quan trọng như thế nào?
A. Không có vai trò đáng kể, chỉ cần chức năng cơ bản.
B. Ảnh hưởng trực tiếp đến hiệu năng, khả năng mở rộng và hiệu quả sử dụng tài nguyên của ứng dụng.
C. Chỉ quan trọng đối với các ứng dụng có giao diện người dùng phức tạp.
D. Chỉ ảnh hưởng đến việc lưu trữ dữ liệu, không ảnh hưởng đến tốc độ xử lý.
21. Khái niệm "kế thừa" (inheritance) trong lập trình hướng đối tượng cho phép:
A. Một lớp có thể có nhiều đối tượng.
B. Một lớp con có thể thừa hưởng các thuộc tính và phương thức của lớp cha.
C. Các đối tượng khác nhau có thể có hành vi giống nhau.
D. Một lớp có thể được định nghĩa mà không cần thuộc tính.
22. Câu lệnh "if-else" trong lập trình được sử dụng để làm gì?
A. Lặp lại một khối mã nhiều lần.
B. Định nghĩa một hàm mới.
C. Thực hiện các khối mã khác nhau dựa trên một điều kiện logic.
D. Khởi tạo giá trị cho biến.
23. Trong lập trình, "hàm" (function) hay "phương thức" (method) được định nghĩa để làm gì?
A. Lưu trữ dữ liệu tạm thời.
B. Chia nhỏ chương trình thành các khối mã có thể tái sử dụng và thực hiện một nhiệm vụ cụ thể.
C. Xác định cấu trúc của lớp đối tượng.
D. Chỉ dùng để in kết quả ra màn hình.
24. Đâu là một ví dụ về "biến" (variable) trong lập trình?
A. Từ khóa "if" trong câu lệnh điều kiện.
B. Một tên đại diện cho một giá trị có thể thay đổi trong quá trình thực thi chương trình, ví dụ "tuoi = 18".
C. Một hàm (function) thực hiện một tác vụ cụ thể.
D. Ký hiệu "+" dùng để thực hiện phép cộng.
25. Thuật toán tìm kiếm nhị phân (binary search) có thể áp dụng hiệu quả cho tập dữ liệu nào?
A. Danh sách không có thứ tự.
B. Danh sách đã được sắp xếp.
C. Danh sách liên kết đơn.
D. Cây nhị phân tổng quát.