Professional Documents
Culture Documents
Cấu Trúc Giữ Liệu Và Giải Thuật
Cấu Trúc Giữ Liệu Và Giải Thuật
4. Hãy sắp xếp thứ tự 3 giai đoạn để giải quyết bài toán?
(a) Chọn một cách cài đặt một kiểu dữ liệu trừu tượng và thay ngôn ngữ giả bằng các mã
lệnh của 1 ngôn ngữ lập trình . Kết quả là ta được 1 chương trình hoàn chỉnh có thể giải
quyết được vấn đề đặt ra.
(b) Xây dựng mô hình toán thích hợp cho bài toán và tìm một giải thuật giải quyết bài toán
trên mô hình đó.
(c) Giải thuật được trình bày bằng ngôn ngữ giả dựa trên các kiểu dữ liệu trừu tượng.
A. a,b,c
B. b, c, a
C. b, a, c
D. c, a, b
5. Thời gian chạy chương trình phụ thuộc vào các yếu tố nào?
A. Dữ liệu đầu vào.
B. Độ phức tạp tính toán của giải thuật.
C. Tốc độ của máy được dùng.
D. Tất cả các yếu tố nêu ra
6. Khi nói đến độ phức tạp của giải thuật là ta muốn nói đến:
A. Kết quả thu được sau khi thực hiện của chương trình
B. Hiệu quả của thời gian thực hiện của chương trình
C. Các bước tính toán trong quá trình thực hiện chương trình
D. Tất cả đều đúng
7. Ta có thể tính độ phức tạp của một giải thuật bất kỳ theo nguyên tắc:
A. Quy tắc cộng
B. Quy tắc nhân
C. Quy tắc tổng quát để phân tích một chương trình
D. Tất cả đều đúng
8. Để lựa chọn một giải thuật tốt, ta sẽ căn cứ vào tiêu chuẩn:
A. Giải thuật đúng đắn.
B. Giải thuật đơn giản.
C. Giải thuật thực hiện nhanh.
D. Tất cả đều đúng
9. Nếu T1(n) và T2(n) là thời gian chạy của 2 đoạn chương trình P1 ,P2. Thời gian chạy của
hai chuơng trình P1, P2 nối nhau là:
A. T=T1+T2
B. T=T1/T2
C. T=T1-T2
D. T = T1 T2
10. Nếu T1(n) và T2(n) là thời gian chạy của 2 đoạn chương trình P1,P2.Thời gian chạy của
hai chuơng trình P1, P2 lồng nhau là:
A. T=T1-T2
B. T=T1+T2
C. T=T1*T2
D. T=T1/T2
11. Thời gian chạy của các lệnh gán, câu lệnh nhập, hiển thị là:
A. O(n)
B. O(2)
C. O(3)
D. O(1)
12. Thời gian chạy của một chuỗi tuần tự áp dụng quy tắc?
A. Quy tắc Trừ
B. Quy tắc Nhân
C. Quy tắc Cộng
D. Quy tắc Nhân đôi
17. Đặc điểm nào của giải thuật viết bằng đệ quy là sai trong các đặc điểm sau:
A. Sau mỗi lần có lời gọi đệ quy thì kích thước của bài toán được thu nhỏ hơn trước.
B. Sau một số lần gọi đệ quy bài toán có giá trị bằng 0
C. Trong thủ tục đệ quy có lời gọi đến chính thủ tục đó
D. Tất cả đều sai
18. Một giải thuật đệ quy xảy ra trường hợp suy biến khi nào?
A. Sau một số lần có lời gọi đệ quy.
B. Khi không thể giải quyết được giải thuật.
C. Khi kết quả của giảI thuật bằng giá trị 0
D. Sau một số lần có lời gọi đệ quy bài toán còn lại sẽ được giải quyết theo một cách khác
19. Khi dùng giải thuật đệ quy để thực hiện bài toán tháp Hà Nội, nếu tháp có 5 vòng thì ta phải
thực hiện bao nhiêu thao tác:
A. 64
B. 15
C. 70
D. 31
25. Dãy số Fibonacci bắt nguồn từ bài toán cổ về việc sinh sản của các cặp thỏ. Bài toán được
đặt ra như sau: Các con thỏ không bao giờ chết. Hai tháng sau khi ra đời một cặp thỏ mới
sẽ sinh ra một cặp thỏ con. Khi đã sinh con rồi thì cứ mỗi tháng tiếp theo chúng lại sinh
được mộtcặp con mới. Giả sử bắt đầu từ một cặp thỏ mới ra đời thì đến tháng thứ 5 sẽ có
bao nhiêu cặp?
A. 5 cặp
B. 10 cặp
C. 9 cặp
D. 12 cặp
26. Cho giải thuật đệ quy sau:
function fibonacci(n)
{
if (n <= 2) return n;
28. Giải thuật đệ quy của bài toán "Tháp Hà Nội" như sau:
void Tower(int n , char a, char b, char c ){
if(n==1){
cout<<"\t"<<a<<"-------"<<c<<endl;
return;
}
Tower(n-1,a,c,b);
Tower(1,a,b,c);
Tower(n-1,b,a,c);
}
Khi n=3 có bao nhiêu bước chuyển?
A. 8 bước
B. 14 bước
C. 15 bước
D. 16 bước
35. Trong các cấu trúc dữ liệu sau đâu là dữ liệu trừu tượng?
A. Cấu trúc dữ liệu dạng ngăn xếp (Stack)
B. Cấu trúc dữ liệu kiểu hàng đợi(Queue)
C. Cấu trúc dữ liệu dạng danh sách(List)
D. Tất cả cấu trúc đã nêu
36. Danh sách tuyến tính là:
A. Danh sách dạng được lưu dưới dạng mảng.
B. Danh sách mà quan hệ lân cận giữa các phần tử được xác định.
C. Danh sách tuyến tính là một danh sách có dạng (a1, a2, ..., an).
D. Danh sách tuyến tính là một danh sách rỗng.
37. Ưu điểm của việc cài đặt danh sách bằng mảng:
A. Có thể thay đổi số lượng phần tử theo ý muốn của người dùng.
B. Có thể bổ sung hoặc xóa một phần tử bất kỳ trong mảng.
C. Việc truy nhập vào phần tử của mảng được thực hiện trực tiếp dựa vào địa chỉ tính được
(chỉ số), nên tốc độ nhanh và đồng đều đối với mọi phần tử.
D. Tất cả các ý trên đều đúng.
38. Để truy nhập vào từng phần tử trong danh sách móc nối đơn ta phải bắt đầu từ:
A. Phần tử đầu tiên của danh sách
B. Truy nhập trực tiếp vào phần tử đó giống mảng 1 chiều
C. Thực hiện tìm kiếm nhị phân trên danh sách móc nối đơn
D. Thực hiện tìm kiếm tuần tự từ phần tử cuối dãy
39. Để tiện cho việc quản lý một danh sách móc nối đơn, ta cần phải quản lý ?
A. Địa chỉ phần tử đầu danh sách
B. Địa chỉ phần tử cuối danh sách
C. Thành phần thông tin của nút đầu danh sách.
D. Cả A và B
40. Trong danh sách móc nối đơn, để tìm kiếm một phần tử có khoá X, ta phải thực hiện tìm
kiếm:
A. Tìm kiếm tuyến tính
B. Tìm kiếm nhị phân
C. Tìm kiếm trên cây nhị phân
D. Có thể bắt đầu tìm trên một thành phần bất kỳ.
41. Giả sử pHead và pTail là hai con trỏ để trỏ đến phần tử đầu và cuối trong danh sách móc
nối đơn. Ban đầu danh sách rỗng. Để tạo danh sách móc nối đơn ta có thể sử dụng cách nào
trong các cách sau:
A. Chèn liên tiếp phần từ mới vào sau phần tử đang trỏ bởi pTail (chèn liên tiếp vào cuối
danh sách)
B. Chèn liên tiếp phần tử mới vào đầu danh sách sau nút đang trỏ bởi pHead
C. Chèn liên tiếp phần tử mới vào giữa danh sách
D. Chèn liên tiếp phần tử mới vào trước nút trỏ bởi bởi pTail
42. Với cấu trúc dữ liệu của danh sách liên kết đơn lưu trữ thông tin về phòng máy
typedef struct PM
{ int maPM;
int tongsoMay;
} PHONGMAY;
typedef struct Node
{ PHONGMAY Info;
Node * PNext;
} OneNode;
typedef OneNode * SLLPointer;
Để quản lý danh sách liên kết đơn bằng phần tử đầu và phần tử cuối, cần định nghĩa kiểu
dữ liệu:
A. SLLPointer DanhSach;
B. typedef struct SSLLIST
{ SLLPointer Phead;
SLLPointer Ptail;
} LIST;
C. typedef struct SSLLIST
{ SLLPointer Phead;
SLLPointer Ptail;
int total;
} LIST;
D.typedef struct SSLLIST
{ SLLPointer Phead;
int total;
} LIST;
43. Trong khai báo sau:
Typedef struct SinhVien
{
char Ten[30];
int MaSV;
};
Typedef struct SinhVienNODE
{
Sinhvien Info;
SinhvienNODE *PNext;
}SV;
Thành phần con trỏ dùng để trỏ lưu địa chỉ của phần tử kế tiếp trong danh sách móc nối đơn
là:
A. PNext
B. Ten
C. MaSV
D. Cả Ten, MaSV và Next.
44. Trong khai báo
Typedef struct NODE
{
int INFO;
struct NODE *Next;
}
NODE p;
Ở đây:
Getnode(P) là thủ tục xin cấp phát một biến động và cho con trỏ P trở tới
Info: Thành phần thông tin (trường thông tin hay dữ liệu) của nút một nút trong danh sách
pnext: Thành phần con trỏ dùng để móc nối đến biến động đứng sau trong danh sách
l: danh sách
A. p= Getnode(X); p->pnext = l.Head→pnext; l.Head = p;
B. l.Head→pnext=p; p→pnext=l.head→pnext; p=Getnode(X);
C. p = Getnode(X); p→pnext=l.head→pnext; l.head→pnext=p;
D. p→pnext =l.head→pnext; l.head→pnext=p; p=getnode(X);
46. Giải thuật Chèn phần tử có trường thông tin là X vào Cuối danh sách thì thứ tự các thao tác
sẽ là:
Ở đây: Thủ tục cấp phát một biến động và cho con trỏ p trỏ tới: Getnode(x)
pnext: Thành phần con trỏ dùng để móc nối đến biến động đứng sau trong danh
sách
l: danh sách
A. p=Getnode(X); l.PTail->pnext = new_ele; l.Tail = new_ele ;
B. l.PTail->pnext = new_ele; l.Tail = new_ele ; p=Getnode(X);
C. l.Tail = new_ele; l.PTail->pnext = new_ele ; p=Getnode(X);
D. l.PTail->pnext = new_ele ; p=Getnode(X); l.Tail = new_ele;
47. Thao tác nào dưới đây thực hiện trên ngăn xếp (stack)?
A. Thêm và loại bỏ phần tử luôn thực hiện tại vị trí đỉnh (top)
B. Thêm và loại bỏ phần tử có thể thực hiện tại vị trí bất kỳ
C. Thêm phần tử vào vị trí bất kỳ
D. Loại bỏ phần tử tại vị trí bất kỳ
48. Thao tác nào dưới đây thực hiện trên hàng đợi (queue)?
A. Thêm phần tử vào lối sau
B. Loại bỏ phần tử ở lối sau
C. Thêm phần tử vào lối trước
D. Thêm và loại bỏ phần tử tại vị trí bất kỳ
49. Cấu trúc dữ liệu nào tương ứng với LIFO?
A.Queue
B.Linked List
C.Tree
D. Stack
50. Để cài đặt Stack ta có thể dùng phương pháp nào sau đây:
A. Bằng mảng
B. Bằng con trỏ
C. Bằng con trỏ và bằng mảng
D. Tất cả đều không đúng
51. Danh sách tuyến tính dạng ngăn xếp là:
A. Là một danh sách tuyến tính trong đó phép bổ sung sung một phần tử vào ngăn xếp
được thực hiện ở một đầu, Và phép loại bỏ không thực hiện được.
B. Là một danh sách tuyến tính trong đó phép bổ sung một phần tử vào ngăn xếp và phép
loại bỏ một phần tử khỏi ngăn xếp luôn luôn thực hiện ở một đầu gọi là đỉnh .
C. Là một danh sách tuyến tính trong đó phép bổ sung một phần tử vào ngăn xếp và phép
loại bỏ một phần tử khỏi ngăn xếp luôn luôn thực hiện ở tại một vị trí bất kì trong danh
sách.
D. Là một danh sách tuyến tính trong đó phép bổ sung một phần tử vào ngăn xếp được
thực hiện ở một đầu, và phép loại bỏ được thực hiện ở đầu kia.
52. Danh sách tuyến tính dạng ngăn xếp làm việc theo nguyên tắc?
A. FIFO( first in first out)
B. LIFO(last in first out)
C. FOLO( fisrt out last out)
D. LILO(last in last out)
53. Khi đổi một số nguyên từ hệ thập phân sang hệ nhị phân thì người ta dùng phép chia liên
tiếp cho 2 và lấy các số dư (là các chữ số nhị phân) theo chiều ngược lại.
Cơ chế sắp xếp này chính là cơ chế hoạt động của cấu trúc dữ liệu:
A. Mảng (array)
B. Hàng đợi(Queue)
C. Bản ghi (Record)
D. Ngăn xếp (stack)
54. Định nghĩa danh sách tuyến tính Hàng đợi (Queue)?
A. Hàng đợi là kiểu danh sách tuyến tính trong đó, phép bổ sung một phần tử được thực
hiện ở một đầu, gọi là lối sau (rear) hay lối trước (front). Phép loại bỏ không thực hiện được.
B. Là một danh sách tuyến tính trong đó phép bổ sung một phần tử và phép loại bỏ một
phần tử được thực hiện ở tại một vị trí bất kì trong danh sách.
C. Hàng đợi là kiểu danh sách tuyến tính trong đó, phép bổ sung phần tử ở một đầu, gọi là
lối sau (rear) và phép loại bỏ phần tử được thực hiện ở đầu kia, gọi là lối trước (front).
D. Hàng đợi là kiểu danh sách tuyến tính trong đó, phép bổ sung một phần tử hay loại bỏ
được thực hiện ở một đầu danh sách gọi là đỉnh (Top)
55. Hàng đợi còn được gọi là danh sách kiểu?
A. FIFO
B. LIFO
C. LOLO
D. FILO
56. Để thêm một đối tượng x bất kỳ vào Stack, thao tác thường dùng là:
A. EMPTY(x).
B. TOP(x).
C. POP(x).
D. PUSH(x).
57. Để lấy loại bỏ một đối tượng ra khỏi Stack, thao tác thường dùng là:
A. FULL(x)
B. POP(x)
C. PUSH(x)
D. EMPTY(x)
58. Để biểu diễn Stack, ta thường sử dụng kiểu dữ liệu nào sau đây?
A. Mảng dữ liệu
B. Kiểu bản ghi
C. Danh sách móc nối
D. Danh sách móc nối và mảng dữ liệu
59. Thao tác POP(x) dùng trong Stack là để:
A. Lấy một phần tử cuối cùng ra khỏi đỉnh Stack
B. Lấy phần tử đầu tiên ra khỏi Stack
C. Xóa bỏ một phần tử bất kì khỏi Stack
D. Xóa bỏ một dãy các phần tử ra khỏi Stack
60. Thao tác Push(x) dùng trong Stack là để:
A. Bổ sung một phần tử vào đầu Stack
B. Bổ sung một phần tử bất kì vào Stack
C. Bổ sung một phần tử vào đỉnh Stack
D. Bổ sung một dãy các phần tử vào đỉnh Stack.
B C
A
D E
A A
55 50
2 40 NULL NULL
90
Với cách duyệt Inorder (Left – Root – Right) cho ra kết quả là dãy nào? Tìm lựa chọn đúng
nhất
A. 13 2 169 20 11 40 55 22 90 50 34
B. 13 2 55 40 169 11 20 34 50 90 22
C. 34 55 2 13 40 11 169 20 50 90 22
D. Cả a, b, c đều sai.
72. Độ cao của cây là gì?
A. Cấp lớn nhất của nút
B. Mức lớn nhất của cây
C. Số cây con của cây
D. Số lượng nút của cây
73. Cho dãy khoá 42, 23, 74, 11, 65, 58, 94, 36.Lần lượt đưa dãy khoá trên vào cây nhị phân
tìm kiếm. Nếu ta tìm kiếm trên cây nhị phân này thì trong trường hợp xấu nhất phải làm
bao nhiêu phép so sánh?
A. 3
B. 4
C. 5
D. 6
74. Cho dãy khoá 42, 23, 74, 11, 65, 58, 94, 36. Lần lượt đưa dãy khoá trên vào cây nhị phân
tìm kiếm. Bây giờ ta muốn tìm kiếm xem trong dãy khoá trên có khoá 105 không thì phải
làm bao nhiêu phép so sánh?
A. 3
B. 4
C. 5
D. 8
75. Cho dãy khoá 42, 23, 74, 11, 65, 58, 94, 36. Lần lượt đưa dãy khoá trên vào cây nhị phân
tìm kiếm. Bây giờ ta muốn tìm kiếm xem trong dãy khoá trên có khoá 60 không thì phải
làm bao nhiêu phép so sánh?
A. 3
B. 4
C. 5
D. 7