You are on page 1of 13

1. Cho bài toán có thể giải bằng thuật toán đệ quy hoặc thuật toán lập.

Cả 2 thuật toán
đều có độ phức tạp là O(n). Trong trường hợp này tại sao nên chọn thuật toán lập?:
Đáp án: Thuật toán lập ít gây ra lỗi hơn
2. Cho dãy số sau: {1, 5 ,1 5, 19, 25 ,27, 31, 33, 45, 55 ,88, 100}; Phần tử cần tìm là 19,
sau khi chọn phần giữa để phân hoạch thì dãy con nào ra sẽ tìm tiếp theo?: Đáp án:
Dãy con từ 0 đến 5
3. Giải quyết bài toán thực tế bằng thuật toán trên máy tính cần phải làm gì? a. Tổ chức
biểu diễn các đối tượng thực tế; b. Xây dựng trình tự các thao tác xử lsy trên các đối
tượng thực tế. => Đáp án: Cả A và B đều đúng
4. Phát biểu nào sau đây là đúng khi nói về cấu trúc dữ liệu cây?: Cả ba câu đều đúng
5. Cho dãy số a[]={42,23,74,11,65,58}, thuật toán sắp xếp chèn (insertion sort) để sắp
xếp dãy số đã cho thành dãy tăng dần, sau 1 bước thực hiện, vị trí các phần tử trong
dãy đã cho sẽ thay đổi như thế nào?: Đáp án: {23,42,74,11,65,58}
6. Cho hàm tính Fibonaci như sau:
int fibo(int n)
{
if (n<3) return…;
else return fibo(n-1)+fibo(n-2);
} Điền vào dấu … : Đáp án: 1
7. Tính chất nào sau đây không phải đặc trưng của thuật toán?: Đáp án: Có lời giải phụ
thuộc vào cấu trúc dữ liệu
8. Để lấy giá trị lớn nhất trong một mảng n số nguyên ta sử dụng hàm int max(int A[],
int n) nào được cài đặt theo đệ qui sau?:Đáp án: if (n==1) return A[0] else
return( A[n-1)? A[n-1]: max(A, n-1));
9. Chiều cao của cây nhị phân có n nút là bao nhiêu? Đáp án: Tối thiểu là log2n
10. Giả sử ta có hai thuật toán P1 và P2 với thời gian thực hiện tương ứng là T1(n) = 100
^2 và T2(n) = 5n^3. Với n<20, thuật toán nào sẽ thực hiện nhanh hơn? Đáp án:
Thuật toán P2
11. Cấu trúc dữ liệu cho kiểu dữ liệu sinh viên như sau:
typedef struct tagSV{
char MSSV[8];
char Ten[30];
char NgaySinh[11];
float DTB;

1
}SV;
Nếu khai báo SV sv1, *sv2;
Lựa chọn các câu đúng nhất để gán giá trị cho mã sinh viên của sv1 và sv2: Đáp án:
sv1.MSSV = “Nguyen Van A”; sv2->MSSV = “Nguyen Van B”;
12. Độ phức tạp trong trường hợp tốt nhất của thuật toán tìm kiếm sau đây là gì? (n là
kích thước của mảng A)
boolean Search(int [] A, int value)
{
for (int j = 0; j < A.length(); j++)
{ if (A[j] == value)
return true;
} return false;
} : Đáp án: O(1)
13. Cho công thức đệ quy: F(1) = 1; F(2) = 2; F(3) = 2; F(n) = F(n-1) + 2*F(n-3) với n>3.
Kết quả F(6) là gì? : Đáp án: 12
14. Cho cấu trúc dữ liệu danh sách liên kết sau, hàm getv lấy giá trị của phần tử thứ p
trong danh sách list với chiều dài len:
struct Node
{
int data;
Node *pNext;};
};
struct danhsach
{
Node *pHead;
};
struct Node
{
int data;
Node *pNext;
};
struct danhsach
{Node *pHead;};
void getv(int p, danhsach list)

2
{
int i;
if(p<1 || p>list->len)
{…}
else if(empty(&list))
{printf(“\n Danh sách rỗng !”);;return -2;}
else return list.v[p-1];
} Điền lệnh vào dấu ….
Đáp án: printf(“\n Vị trí phần tử cần bổ sung không hợp lệ”); return -1;
15. Hàm kiểm tra danh sách có đầy hay không, với n là kich thước tối đa của danh sách;
inf full(danhsach *list) { … }
Điền lệnh vào dấu …
Đáp án: return (list ->len == n)
16. Cây nhị phân có mức bằng bao nhiêu? Đáp án: Không xác định
17. Số lần lập của câu lệnh foreach trong việc duyệt một tập hợp là bao nhiêu? Đáp án:
Số phần tử được cấp phát của tập hợp
18. Cho cây nhị phân tìm kiếm được tạo từ dãy số sau: 42 23 74 11 65 58 94 36. Khoá
nào nằm trên cây con phải? Đáp án: 74,65,58,94
19. Cho cây được biểu diễn như sau: (a (b (d, e(i,j)),c(f, g(k),h)). Cho biết bậc của nút g ;à
bao nhiêu? Đáp án: 1
20. Cho dãy số M: 52 34 12 3 2 84 71 23 29 7. dùng thuật toán sắp xếp chèn
(insertion_Sort) để sắp xếp dãy được cho. Cần thực hiện bao nhiêu lần chèn các phẩn
tử vào dãy để sắp xếp dãy M có thứ tự tăng dần? Đáp án: 8
21. Bổ sung thêm phần tử x vào vị trí thứ p của danh sách
list voide insert(int x, int p, danhsach*list)
{
int i; if(p<1 || p>list->len) printf(“vị trí p không hợp lệ”);
else if(full(list))printf(“Danh sách đã đầy”);
else
{
for(i=list->len;i>=p;i–)...
list->v[p-1]=x; list->len++;
}
}

3
Điền lệnh vào dấu:...
Đáp án: list->v[i]=list->v[i-1];
22. Để giải quyết các bài toán theo kiểu vét cạn, chúng ta cần áp dụng thuật toán đệ qui
nào? Đáp án: Đệ quy quay lui
23. Cho đoạn lệnh thực hiện việc tìm kiếm phần tử x trên mảng A, n phần tử bằng phương
pháp tìm nhị phân:
first =0; last =n-1;
while (first<=last)
{
int mid = (first + last)/2;
if(x==A[mid])return mid;
if(x<A[mid])last = mid -1;
else first = mid + 1;
}
return -1;
Trong trường hợp tốt nhất khi phần tử được chọn (ở vị trí giữa mảng) có giá trị bằng
x, hãy chọn phát biểu đúng. Đáp án: Số phép gán= 3. Số phép so sánh = 2
24. Các kiểu dữ liệu cơ bản là: Đáp án: Các kiểu dữ liệu mà người lập trình được
cung cấp sẵn từ ngôn ngữ lập trình
25. Cho cấu trúc dữ liệu danh sách như sau:
struct Node
{
int data;
Node *pNext;
}
struct danhsach
{
Node *pHead;
};
Hàm bổ sung thêm phần tử x vào vị trí thứ p của danh sách
list void insert(int x, int p, danhsach *list)
{
int i; if(p<1) || p>list->len)
printf(“\n Vị trí p không hợp lệ”);

4
else if(full(list))
printf(“\n Danh sách đã đầy”);
else
{
for(i=list->len;i>=p;i–) list->v[i]ư=list->v[i-1];

}
}
Đáp án: list->v[p-1]=x; list->len++;
26. Đâu là kiểu dữ liệu có cấu trúc?Đáp án: Struct
27. Đồ thị G là liên thông khi và chỉ khi? Đáp án: Có đường đi giữa hai đỉnh bất kỳ
thuộc G
28. Cho hàm F được cài đặt như sau:
int F(int n) { if(n<=1)return 1; else return n * F(n-1);}
Độ phức tạp của thuật toán của hàm F là bao nhiêu?
Đáp án: O(n)
29. Phát biểu nào sau đây đúng với khái niệm cấu trúc lưu trữ? Đáp án: Cách biểu diễn
tối ưu của cấu trúc dữ liệu trên bộ nhớ của máy tính
30. Bằng cách chạy thử 1 thuật toán với 1 bộ dữ liệu, ta có thể khẳng định điều gì? Đáp
án: Khẳng định thuật toán sai nếu cho kết quả sai
31. Phát biểu nào sau đây sai? Đáp án: Cài đặt theo đệ qui làm cho chương trình ít
tốn bộ nhớ
32. Cho đoạn lệnh sau:
int BSearchRecur(int M[], int x, inf left, int right)
{
if(left>right)
return -1;
int midd=(left+right)/2;
if(.....)
return mid;
if(M[mid]>x)
return BSearchRecur(M,x,left.mid-1);
else
return BSearchRecur(M,x.mid+1,right);

5
}
Điền vào dấu….
Đáp án: M[mid]= = x
33. Cho hàm tính dãy truy hồi {Xn} như sau:
X[0]=1; X[1]=1;
for(int i=2; i<=n; i++)
{ X[i]ư=0;
for(int j=0; j<n; j++)
X[i]+=(i-j)*X[j];}
Cho biết độ phức tạp của thuật toán là bao nhiêu?
Đáp án: O(n^2)
34. Với mã giả sau, hãy cho biết đây là giải thuật sắp xếp nào?
Bước 1: i=1;
Bước 2: Tìm phần tử M[min] nhỏ nhất trong dãy hiện hành từ M[i]ư đến M[N-1]
Bước 3: Nếu min # 1, Hoán vị M[Min] và M[i]
Bước 4: Nếu i<N-1 thì i = i+1; Lặp lại bước 2
Ngược lại : Dừng //N-1 phần tử đã nằm đúng vị trí
Đáp án: Selection sort
35. Tư tưởng của giải thuật tìm kiếm tuần tự là: Đáp án: So sánh X lần lượt với cac
phần tử thứ nhất, thứ hai, .. của dãy cho đến khi gặp phần tử có khóa cần tìm
36. Khi nào thì cây được gọi là có thứ tự? Đáp án: Khi thay đổi vị trí các cây con tạo
ra cây con mới
37. Cho cấu trúc dữ liệu danh sách liên kết sau, hàm Getv để lấy giá trị của phần tử thứ p
trong danh sách list
struct Node
{
int data;
Node *pNext;
};
struct danhsach
{
Node *pHead;
};
int Getv(int p, danhsach list)

6
{
….
printf(“p không hợp lệ”);
return -1;
}
else
return list.v[p-1];
}
Điền lệnh vào dấu…. Đáp án: if(p<1 || p >list->len)
38. Đồ thị liên thông là gì? Đáp án: Đồ thị liên thông là đồ thị luôn tồn tại đường di
giữa 2 đỉnh bất kỳ
39. Phát biểu nào sau đây là đúng với cây nhị phân có chiều cao là h? Đáp án: Số nút tối
đa có thể có trong cây là 2^h -1
40. Cấu trúc dữ liệu nào tương ứng với LIFO (Last in, first out)? Đáp án: Ngăn xếp
(Stack)
41. Khi xóa một nút trong cây nhị phân tìm kiếm mà nút đó có 2 con, trước hết ta thực
hiện? Đáp án: Thay thế giá trị nút đó bởi giá trị trên nút con cự phải trên cây
trái
42. Tính chất quan trọng của danh sách Đáp án: : Các phần tử của danh sách có thứ tự
tuyến tính theo vị trí xuất hiện của chúng (position)

Câu hỏi: Cho đồ thị có hướng G có 3 đỉnh (0-2), biểu diễn bởi ma trận kề như sau{{0,1, 0},
{0,1,1}, {1, 0, 0}}. Phát biểu nào sau đây là đúng khi nói về đường đi từ đỉnh 2 về đỉnh 0?
Trả lời Không có đường đi nào có độ dài 2

Câu hỏi: Trong đánh giá độ phức tạp của thuật toán, độ phức tạp của câu lệnh gán là gì?Trả
lời O(1)

Câu hỏi: Kí hiệu danh sách là list, n là số phần tử trong danh sách. Chọn phát biểu đúng về
hàm full(list) để kiểm tra danh sách có đầy hay khôngTrả lời Kiểm tra danh sách có đầy hay
không tức là việc kiểm tra danh sách có độ dài =n

Câu hỏi: Cho cấu trúc dữ liệu danh sách như sau:

struct Node

7
{
int

data;
Node

*pNext;

};
struct

danhsach

{
Node

*pHead;

}.
Hàm

kiểm tra danh sách có rỗng hay không int empty(danhsach *list) {...}
Điền
lệnh vào dấuTrả lời if(list->len==0)

return 1; else return 0;

Câu hỏi: Thao tác nào dưới đây thực hiện được trên Ngăn xếp (Stack)?Trả lời Thêm và loại
bỏ phần tử luôn thực hiện tại vị trí đỉnh (top)

Câu hỏi: Thuật toán sắp xếp nào sau đây sử dụng chiến thuật chia để trị?Trả lời Nhanh
(Quick Sort)

Câu hỏi: Dãy số Fibonaci là dãy số tự nhiên:11 23 5 8 13 .Câu hỏi: Sử dụng giải thuật đệ
quy để tính giá trị của số fibonaci thứ n. Chỉ ra trường hợp gọi đệ quyTrả lời n >= 3

Câu hỏi: Đánh giá độ phức tạp của giải thuật là việc xác định … và … mà giải thuật cần để
thực hiện giải một bài toán.Trả lời Khoảng thời gian, dung lượng bộ nhớ máy tính

8
Câu hỏi: Cho phương thức tính ax như sau:
int

PowerRint a, int n)
{

if(n==0) return 1;
if(n==1)

return a; int x=n2;


return

PowerRa, n-1)*a;

}
Cho

biết độ phức tạp của thuật toán là gì?

Trả lời O(n)

Câu hỏi: Cho đồ thị G có n đỉnh. Để biểu diễn đồ thị G bằng ma trận kề thì ma trận đó phải
có điều kiện nào?Trả lời n hàng và n cột

Câu hỏi: Cho dãy số {3 1 6 0 5 4 8 2 9 7} và các bước sắp xếp sau:


Bước

1: (0 1 2) 3 (5 4 8 69 7)
Bước

2: 0(1 2) (5 4 8 69 7)
Bước

3: 01(2)3(5 4 8 69 7)
Bước

4: 0 1 2 3 (5 4 8 69 7)
Bước

9
5: 0123 (4) 5 (8 69 7)
Bước

6: 0123 45 (8 69 7)
Bước

7: 0 1 2 3 4 5 67 6) 8 (9)
Bước

8: 0 1 2 3 4 5 (6) 7 8 (9)
Bước

9: 0 1 2 3 4 5 6 7 8 (9)
Bước

10: 0 1 2 3 4 5 6 7 8 9
Các

bước trên dựa theo giải thuật sắp xếp nào?Trả lời Quick sort

Câu hỏi: Gọi a và b là độ phức tạp của thuật toán tìm kiếm tuyến tính và tìm kiếm nhị phân
khi thực hiện tìm X trong dãy A có thứ tự với n phần tử. Chọn kết quả đúng nhất?Trả lời
a=O(n), b=O(log(n))

Câu hỏi: Một đồ thị vô hướng G=(V,E) được gọi là liên thông nếu:Trả lời Luôn tìm được
đường đi giữa 2 đỉnh bất kỳ trong đồ thị

Câu hỏi: Kí hiệu danh sách là list, vị trí của phần tử trong danh sách là p (p=1Trả lời n), n là
số phần tử trong danh sách. Chọn phát biểu đúng về việc gọi hàm getv để lấy giá trị của phần
tử thứ p ra khỏi danh sáchTrả lời getv(p,list)

Câu hỏi: Cho dãy K có 11 phần tử, để tìm trong K có khóa X hay không bằng thuật toán tìm
nhị phân. Phần tử ở vị trí nào được so sánh với X trong lần so sánh đầu tiên của thuật toán (vị
trí đầu dãy là 0)?Trả lời 5

Câu hỏi: Trong một cây nhị phân hoàn chỉnh, với chiều cao là 3 thì số nút tối thiểu trên cây
T là bao nhiêu?Trả lời 4

10
Câu hỏi: Chương trình có hai đoạn lệnh lồng nhau, có độ phức tạp lần lượt là O(n) và
O(logn), độ phức tạp của chương trình là gì?Trả lời O(nlogn)

Câu hỏi: Phương pháp nào sau đây không được dùng để biểu diễn cây?Trả lời Hình vẽ

Câu hỏi: Cho dãy số a[] = {42,23,74,11,65,58,94,36,99,87}, kết quả thuật toán sắp xếp
Buble Sort để sắp xếp dãy tăng dần, sau khi thực hiện bước 1 so sánh thì giá trị của 3 phần tử
cuối của dãy là những số nào sau đây? Trả lời 94,87,99

Câu hỏi: Độ phức tạp trung bình T(n) của thuật toán tìm kiếm 1 nút có khóa x trên cây nhị
phân tìm kiếm là bao nhiêu?Trả lời T(n) = O(log2n)

Câu hỏi: Xóa phần từ thứ 2 của danh sách list


void

delete(intp, danhsach *list)

{
inti….

Thông báo p không hợp lệ:


else

if(empty(list)) Thông báo danh sách rỗng, else

}
for(i=p-1;i<list->len;i++)

list->v[i]=list->v[i+1]; list->len;
Điền

lệnh vào dấu ... Trả lời if(p<1 || p>list->len)

Câu hỏi: Thuật toán Quicksort cài đặt bằng phương pháp đệ quy thuộc dạng đệ quy nào? Trả
lời: Đệ quy nhị phân

Câu hỏi: Khi cài đặt đệ qui, trong thân của hàm có lời gọi hàm gọi lại chính nó được đặt bên
trong vòng lặp, đó là kiểu đệ qui nào?Trả lời Đệ qui phi tuyến

11
Câu hỏi: Trong lưu trữ dữ liệu kiểu Queue (Q), giả sử F là con trỏ trỏ tới Front của Q, R là
con trỏ trỏ tới Rear của Q. Khi thêm một phần tử vào Queue, thì R và F thay đổi thế nào? Trả
lời: F không thay đổi, R=R+1

Câu hỏi: Đặc trưng nào sau đây không phải là ưu điểm của phương pháp đệ quy? Trả lời:
Tối ưu về mặt thời gian

Câu hỏi: Khi phân tích thời gian thực hiện của thuật toán, thông thường phân tích cái gì? Trả
lời: Số các phép tính cơ bản khi thực hiện thuật toán

Câu hỏi: Trong hàm kiếm nhị phân sau, hãy điền lệnh vào dấu …
Binary

Searching void Binary Searching(int a[], int n, int x)

{
int

1,1,mid,kt=0;

while(1<=r)
{

mid=(1+r)/2;
if(a[mid}<x)

1=mid+1; else
if(a[mid]

>x)r=mid-1; else

{
kt=1;

12
if(kt==1)

printf("Tim thay x trong day");


else

printf("Khong tim thay x trong day");

Trả lời: break;

Câu hỏi: Hàm thể hiện độ phức tạp có dạng thường gặp là gì? Trả lời: Cả ba câu trên đều
đúng

13

You might also like