Professional Documents
Culture Documents
Đề thi Cấu trúc dữ liệu và giải thuật (Có đáp án)
Đề thi Cấu trúc dữ liệu và giải thuật (Có đáp án)
Anh (Chị) hãy nêu ưu nhược điểm của cách cài đặt danh sách bởi danh sách liên kết đơn?
Câu 1
+ Giải thuật là một dãy các câu lệnh chặt chẽ và rõ ràng, xác định một dãy các thao tác trên một
số đối tượng nào(dữ liệu) đó sao cho sau một số hữu hạn bước thực hiện ta đạt được kết quả mong
muốn (0.5 đ)
+ Cách thức tổ chức biểu diễn dữ liệu mà theo đó dữ liệu được lưu trữ và được xử lý trong
MTĐT, được gọi là cấu trúc dữ liệu (0.5 đ)
+ Mối quan hệ giữa cấu trúc dữ liệu và giải thuật: Giải thuật tác động trên dữ liệu lưu trữ trong
các cấu trúc để cho ra kết quả mong muốn. Trong lập trình, chúng quan hệ với nhau theo ràng buộc
sau:
Câu 2
*) Dạng cài đặt danh sách (1 đ)
Type Sinhvien = record
Hoten: String;
Lớp : String;
SoBD: String;
ĐTB: real;
` Next: ^ Sinhvien;
end;
List = ^Sinhvien;
Var L: List;
*) Viết giải thuật
1) Nhập danh sách gồm n sinh viên (1 đ)
+ Nhập số lượng sinh viên hiện có n: readln(n);
+ Sử dụng vòng lăp i chạy từ 1 -> n, mỗi lần lặp nhập 1 sinh viên và gắn vào danh sách:
for i:=1 to n do
begin
- new(M); {yêu cầu MT cấp phát ô nhớ chứa dữ liệu của sinh viên cần
nhập }
- Nhập các thông tin về sinh viên, lưu vào ô nhớ được trỏ bởi M
- Gắn kết ô nhớ được trỏ bởi M vào danh sách
end;
2) Loại bỏ những SV có điểm trung bình <5 (1 đ)
Kiểm tra xem danh sách L có rỗng hay không? Nếu rỗng trở về chương trình chính, nếu không
rỗng thực hiện loại bỏ như sau:
-
Sử dụng con trỏ phụ q duyệt tử đầu đến cuối danh sách, nếu q^.dtb <5 thì gọi thủ
tục loại bỏ phần tử được trỏ bởi q trong danh sách
-
Viết thủ tục loại bỏ phần tử được trỏ bởi con trỏ q trong danh sách L:
P:= L;
p^.next := q^.next;
dispose(q);
q:= p^.next;// lưu vị trí tiếp theo vị trí loại bỏ để còn loại bỏ tiếp
3) Sắp xếp danh sách theo trường lớp tăng dần (1 đ)
Có thể sử dụng một trong các thuật toán sắp xếp để sắp xếp dữ liệu trên danh sách liên
kết, ở đây ta sử dụng giải thuật sắp xếp chọn trực tiếp (selection sort) và sử dụng cách tiếp
cận:giữ nguyên mối liên kết của các nút trong danh sách và hoán vị nội dung của các nút:
Giải thuật:
Procedure ListSelection_Sort(var L: List)
Var p, q, min: List;
Begin
p:=L;
While (p<>nil) do
Begin
q:=p^.next;
min:=p;
While (q<>nil) do
Begin
If (q^.infor<min^.infor) then min:=q;
q:=q^.next;
End;
Hoanvi(min^.infor,p^.infor);
P:=P^.next;
End;
End;
4) Hiển thị danh sách sinh viên theo từng lớp: Sử dụng con trỏ M duyệt tử đầu đến cuối danh
sách đã được sắp theo lớp ở câu 3, duyệt đến sinh viên nào thì hiển thị các thông tin về sinh viên đó:
(1 đ)
M: = L; p:=M;
writeln(‘Các sinh vien lop M^.lop la:’);
While (M<> nil) do
Begin
Write(M^. hoten);
Write(M^. Lop);
Write(M^. sbd);
P:=M;
M := M^.next;
If (M^.lop<>p^.lop) then writeln(‘Các sinh vien lop M^.lop la:’);
End;
Câu 3
Ưu điểm: (0.5 đ)
-
Không gây hiện tượng lãng phí bộ nhớ (Hiện tượng giữ chỗ để đấy mà không
dùng đến như danh sách cài đặt bởi mảng)
-
Cấu trúc dữ liệu danh sách cài đặt bởi con trỏ còn gọi là cấu trúc dũ liệu động,
không gian bộ nhớ được cấp phát trong heap, do đó nó không bị giới hạn bởi kích
thước 64kb như đối với cấu trúc dữ liệu tĩnh
-
Các phần tử trong danh sách nằm ở những vị trí dải dác, do đó tận dụng được
những không gian trống này, mà không cần một vùng nhớ kế tiếp như cài đặt bởi
mảng
Nhược điểm: (0.5 đ)
-
Tốc độ truy cập đến các phần tử trong danh sách là chậm, không đồng đều đối với
mọi phần tử (truy cập tuần tự một chiều)
-
Từ phần tử sau không truy cập ngược đến các phần tử đứng trước nó được
-
mỗi phần tử trong danh sách tốn thêm một ô nhớ có kích cỡ là 4byte để lưu địa chỉ
của phần tử đứng sau nó trong danh sách
Đề 2
Câu 1(3 điểm)
1) Thế nào là cấu trúc dữ liệu tiền định (định sẵn) của ngôn ngữ lập trình bậc cao?
2) Hãy nêu một vài cấu trúc dữ liệu tiền định của ngôn ngữ lập trình mà anh (chị) biết?
3) Tại sao chỉ sử dụng các cấu trúc dữ liệu tiền định không đủ đáp ứng yêu cầu về việc tổ
chức, lưu trữ dữ liệu của mọi bài toán ứng dụng thực tế?. Một số bài toán ứng dụng
phải cần sử dụng đến các cấu trúc dữ liệu do người lập trình tự định nghĩa? Hãy nêu
một bài toán ứng dụng như vậy, phân tích bài toán để thể hiện điều đó?
Câu 2(3 điểm)
Giả sử ta cần quản lý một ngăn xếp chứa các số nguyên. Viết dạng cài đặt của cấu trúc ngăn
xếp này bằng mảng. Với cấu trúc ngăn xếp vừa cài đặt, hãy viết thủ tục thêm phần tử x vào
vị trí thứ k kể tử đỉnh ngăn xếp sao cho các phần tử khác không thay đổi thứ tự (k là số
nguyên nhập từ bàn phím).
Câu 3(2 điểm)
Anh (Chị) hãy nêu một lớp bài toán mà sử dụng cấu trúc ngăn xếp rất thích hợp cho việc giải
quyết các yêu cầu của bài toán? phân tích bài toán đã nêu để thể hiện rõ điều đó?
Câu 1
1) Cấu trúc dữ liệu tiền định của ngôn ngữ lập trình bậc cao là các cấu trúc dữ liệu đã được định nghĩa
sẵn trong ngôn ngữ lập trình đó, người lập trình chỉ việc sử dụng mà không cần định nghĩa lại (1 đ)
3) Một vài cấu trúc dữ liệu tiền định như: mảng, bản ghi, tệp tin, ...... (1 đ)
2) Các cấu trúc dữ liệu tiền định có sẵn trong ngôn ngữ lập trình không đáp ứng đầy đủ được nhu cầu
lưu trữ dữ liệu lớn của mọi chương trình, không phản ánh đầy đủ bản chất của các đối tượng dữ liệu có
trong thực tế = > người ta cần đến các cấu trúc dữ liệu do người lập trình tự định nghĩa. (0.5
đ)
Ví dụ: Xét bài toán quản lý hồ sơ sinh viên trong một khoa, các yêu cầu quản lý hồ sơ là: Thêm, sửa,
xóa, tìm kiếm, …..hồ sơ.=> Sử dụng cấu trúc dữ liệu mảng (cấu trúc tiền định)để lưu các thông tin về
hồ sơ là không phù hợp vì: cấu trúc mảng không cho phép thực hiện phép toán thêm, xóa, không gian
không đủ để lưu trữ tất cả hồ sơ nếu số lượng hồ sơ thực tế lớn,….. (0.5 đ)
Câu 2
+ Dạng cài đặt ngăn xếp sử dụng mảng: (1 đ)
const n = <số phần tử tối đa trong ngăn xếp>;
type Stack = Record
Top: 0..n ;
Element : array [1.. n] of integer;
End;
+ Thêm phần tử x vào ngăn xếp S ở vị trí thứ k tính từ đỉnh ngăn xếp: (2 đ)
Kiểm tra xem ngăn xếp có rỗng không, nểu rỗng thì thêm vào đỉnh ngăn xếp, Nếu ngăn xếp
không rỗng: Kiểm tra xem số k nhập vào có > top hay không? Nếu lớn hơn thì thêm x vào đỉnh ngăn
xếp, nếu không: Lấy (top-k+1) phần tử kể từ đầu ngăn xếp ra một ngăn xếp phụ, thêm phần tử phần tử
x vào ngăn xếp, đổ (top – k+1) phần tử từ ngăn xếp phụ vào ngăn xếp ban đầu do đó đảm bảo không
thay đổi trật tự các phần tử trong ngăn xếp ban đầu sau khi loại bỏ phần tử ở vị trí k.(thủ tục tương
ứng tự viết)
Câu 3
(1 đ)
- Cấu trúc ngăn xếp thường được áp dụng cho những bài toán có trình tự truy xuất ngược với trình tự
lưu trữ. Ví dụ:
+ Bài toán chuyển đổi cơ số, tìm ước số chung của hai số nguyên, bài toán tính giá
trị biểu thức, ....
+ Thường áp dụng trong một số bài toán tìm đường đi trong lý thuyết đồ thị (lưu vết
đường đi)
+ làm môi trường lưu trữ các biến toàn cục và cục bộ của các thủ tục trong chương
trình dịch của ngôn ngữ lập trình.
(1 đ)
- Phân tích cách giải các bài toán trên để thể hiện rõ điều đã nêu
Đề 3
Câu 1(2 điểm)
Có người nói: “Phép đệ quy phản ánh chiến thuật “chia để trị” trong cách giải bài toán ”. Điều
đó có đúng không? anh (chị) hãy giải thích và cho ví dụ minh họa cho điều đó?
Câu 2(3 điểm)
Giả sử cần quản lý một cây chứa các số nguyên, các đỉnh trên cây được đánh số theo một thứ
tự nào đó. Hãy viết dạng cài đặt cây bằng cha của mỗi đỉnh sử dụng mảng. Với cách cài đặt
này, viết các giải thuật tìm con cả, tìm cha của đỉnh k cho trước (k là số nguyên nhập từ bàn
phím)
Câu 3(3 điểm)
Cho một cây thư mục T và kích cỡ của từng thư mục con trong máy tính như sau:
1 KB
\users \BT\
2 KB 1KB
Tin\ Toan\
8 KB 10 kB 6 KB 9KB 10 kB
BT1 Bt2 Bt3 BT1 BT2
Anh(chị) hãy:
1) Viết dạng cài đặt cây bằng con trưởng và em liền kề của mỗi đỉnh, sử dụng con trỏ
2) Để tính tổng kích thước của toàn bộ cây thư mục trên thì ta duyệt cây theo thứ tự nào?
3) Mô tả cách tính tổng kích thước cây thư mục?
Câu 1
+ “Phép đệ quy phản ánh chiến thuật “chia để trị” trong cách giải bài toán ” điều đó là đúng, nó thể
hiện ở chỗ: Để giải bài toán với số lượng dữ liệu đầu vào lớn, ta giải bài toán với số lượng dữ liệu đầu
vào nhỏ hơn, và nhỏ hơn nữa, cứ thế gọi đệ quy cho đến gọi đến trường hợp bài toán xảy ra suy biến
(trường hợp này bài toán được xử lý). Đây chính là tư tưởng của chiến thuật chia để trị (1 đ)
+ Ví dụ: (1 đ)
Duyệt các đỉnh trên cây T, xuất phát từ đỉnh gốc(i:=1), kiểm tra xem cha của đỉnh i có = k
không, nếu = k, kết luận i là con cả, dừng giải thuật, nếu cha của i <>k thì duyệt đỉnh tiếp theo trên cây
T bằng cách cho i:= i+1. Lặp đi lặp lại phép duyệt các đỉnh trên T cho đến khi tìm thấy thì dừng (found
= true), hoặc duyệt hết các đỉnh trên T (i>n với n là số đỉnh trên cây) thì cũng dừng và kết luận không
tim thấy
Câu 3
+ Dạng cài đặt cây bằng con trưởng và em liền kề của mỗi đỉnh: (1 đ)
Câu 1
..........
Câu 2
1) Cấu trúc dữ liệu lựa chọn là danh sách liên kết đơn (1 đ)
- Sử dụng biến đếm lưu số lượng cán bộ trong đơn vị, ban đầu dem:= 0 ,
- Sử dụng con trỏ phụ M duyệt từ đầu đến cuối danh sách, duyệt đến cán bộ nào thì tăng
biến đếm lên 1:
Sử dụng con trỏ phụ M duyệt từ đầu đến cuối danh sách, duyệt đến cán bộ nào thì hiển
thị các thông tin của cán bộ đó lên màn hình:
Cách làm:
b1) Tìm cán bộ đầu tiên trong danh sách đến tuổi về hưu, giả sử vị trí được trỏ bởi p
Chú ý: - để tìm cán bộ thỏa mãn điều kiện ta duyệt từ đầu danh sách p:=L đến khi tìm thấy thì
dừng
-
để loại bỏ học sinh ở vị trí p:
M:=L;
M^.next:=p^.next;
Dispose(p);
Câu 3
+ Danh sách là một cấu trúc dùng để lưu trữ một tập hợp hữu hạn biến động các phần tử thuộc
cùng một lớp đối tượng nào đó (0.5 đ)
+ Có thể cài đặt danh sách bởi mảng và bởi con trỏ, tương ứng ta có danh sách kế tiếp và danh
sách móc nối (danh sách liên kết). Các dạng cài đặt tương ứng:
Const n=maxlist;
Type list = record
Eles: array[1..n]of integer;
Count: 0..n;
end;
Var L: list;
Cài đặt bởi con trỏ: (0.5 đ)
type list=^nut;
nut = record
infor: item;
next:list;
end;
var l,f:pqueue;
+ Ví dụ để quản lý sinh viên, cán bộ ta có danh sách sinh viên, danh sách cán bộ….
Ưu nhược điểm của từng các cài đặt danh sách: (0.5 đ)
a) Danh sách cài bởi mảng
Ưu điểm
i. truy cấp đến các phần tử là trực tiếp do đó nhanh và đồng đều đối với mọi phần
tử
ii. Các thao tác thực hiện tương đối dễ dàng
Nhược điểm
iii. Có hiện tượng dư thừa bộ nhớ: Hiện tượng giữ chỗ để đấy mà không dùng tới
iv. Bị hạn chế bởi không gian kế tiếp trong bộ nhớ
v. Là cấu trúc dữ liệu tĩnh, bị giới hạn không gian bộ nhớ trong thanh ghi dữ liệu và
thanh ghi stack
vi. có hiện tượng co giãn, dịch chuyển các phần tử khi thực hiện thao tác bổ sung
phần tử, hoặc loại bỏ phần tử, do đó là số lượng phép tính trong giải thuật tăng=
> độ phức tạp tính toán cũnh tăng theo
b) Danh sách cài đặt bởi con trỏ
Ưu điểm:
-
Không gây hiện tượng lãng phí bộ nhớ (Hiện tượng giữ chỗ để đấy mà không
dùng đến như danh sách cài đặt bởi mảng)
-
Cấu trúc dữ liệu danh sách cài đặt bởi con trỏ còn gọi là cấu trúc dũ liệu động,
không gian bộ nhớ được cấp phát trong heap, do đó nó không bị giới hạn bởi kích
thước 64kb như đối với cấu trúc dữ liệu tĩnh
-
Các phần tử trong danh sách nằm ở những vị trí dải dác, do đó tận dụng được
những không gian trống này, mà không cần một vùng nhớ kế tiếp như cài đặt bởi
mảng
Nhược điểm:
-
Tốc độ truy cập đến các phần tử trong danh sách là chậm, không đồng đều đối với
mọi phần tử (truy cập tuần tự một chiều)
-
Từ phần tử trước không truy cập ngược lại phần tử đứng trước
-
mỗi phần tử trong danh sách tốn thêm một không gian là 4byte để lưu địa chỉ của
phàn tử đứng sau nó trong danh sách
Đề 5
Câu 1(2 điểm)
Trình bày các đặc điểm của giải thuật đệ quy. Giả sử a và b là những số nguyên dương, Q là
hàm số của a và b, được định nghĩa như sau:
0 nếu a<b
Q(a,b) = {
Q(a-b, b)+1 nếu a>=b
Hãy tính Q(2,3) và Q(14,3)
Câu 2(3 điểm)
Giả sử cần quản lý một danh sách các số nguyên. Hãy viết dạng cài đặt danh sách này bằng
mảng, với cấu trúc danh sách đã cài đặt, viết các chương trình con thực hiện các yêu cầu như
sau:
1) Tính trung bình cộng của các số lưu trong danh sách
2) Loại bỏ ra khỏi danh sách số 3 đầu tiên tìm thấy trong danh sách
3) Hiển thị danh sách lên màn hình
Câu 3(3 điểm)
Hãy vẽ cây nhị phân biểu diễn biểu thức toán học sau:
3*4+(12+b)/6
Từ cây biểu thức vừa dựng, anh (chị) hãy:
1) Viết dạng cài đặt cây bằng con trỏ,
2) Viết thủ tục duyệt cây theo thứ tự trước, sau
3) Viết biểu thức toán học trên dưới dạng tiền tố, hậu tố? nhận xét với kết quả duyệt cây theo
thứ tự trước, sau?
Câu 1
Const n=maxlist;
Type list = record
Ele: array[1..n]of integer;
Count: 0..n;
end;
Var L: list;
+ Các thủ tục tương ứng với các yêu cầu:
1) Tính trung bình cộng của các số lưu trong danh sách (0.5 đ)
Begin
Trungbinh:=tam;
End;
procedure Hienthi(l:list);
var i: integer;
begin
end;
+
Câu 3
3 4 + 6
Type Tree=^nut;
Nut= record
Info: string;
Left, right: Tree;
End;
Var T: Tree;
2) Các thủ tục duyệt cây theo thứ tự trước, sau:
34*+12b+6/ => Biểu thức trùng với kết quả duyệt cây theo thứ tự sau
Đề 6
Câu 1(2điểm)
Nêu khái niệm hàng đợi? các cách cài đặt hàng đợi bởi mảng, con trỏ? ưu nhược điểm của từng
dạng cài đặt?
Câu 2(5 điểm)
Giả sử ta cần quản lý một danh sách học sinh, mỗi học sinh gồm những thông tin sau: Họ tên,
Lớp, Điểm tổng kết, xếp loại học lực . Anh(chị) hãy:
1) Viết dạng cài đặt danh sách trên bằng danh sách liên kết kép.
2) Với cách cài đặt này, viết các chương trình con tương ứng với các yêu cầu sau:
a) Tạo danh sách có n học sinh, (n là số nguyên dương nhập từ bàn phím)
b) Đếm xem trong danh sách có bao nhiêu sinh viên học lớp “CĐ2C”.
c) Hãy xếp loại học lực cho các sinh viên trong danh sách theo các tiêu chí sau:
+ Nếu: Điểm tổng kết< 5: Xếp loại yếu
+ Nếu : 5 ≤ Điểm tổng kết ≤6: Xếp loại trung bình
+ Nếu : 6< Điểm tổng kết <8 : Xếp loại khá
+ Nếu : Điểm tổng kết ≥8: Xếp loại giỏi
d) Sắp sếp danh sách theo trường lớp tăng dần
e) In ra màn hình danh sách sinh viên theo từng lớp,
Câu 3(1 điểm)
Anh (Chị) hãy nêu một lớp bài toán ứng dụng mà sử dụng cấu trúc dữ liệu hàng đợi giúp việc
giải quyết yêu cầu bài toán được thuận lợi hơn? phân tích bài toán đã nêu để thể hiện rõ điều
đó?
Câu 1
-
Hàng đợi là một danh sách tuyến tính trong đó phép bổ sung một phần tử vào hàng đợi được
thực hiện ở một đầu (đầu này được gọi là lối sau - Real), còn phép lấy một phần tử ra khỏi hàng
đợi được thực hiện ở đầu kia (lối trước - Front) (0.5 đ)
-
Hai phương pháp cài đặt hàng đợi:
const n=maxqueue;
type queue= record
ele:array[1..n]of item;
L,F,count:0..n;
end;
Ưu điểm:
Nhược điểm:
-
Gây hiện tượng lãng phí bộ nhớ, hiện tượng này còn được gọi là giữ chỗ để đấy
mà không dùng đến
-
Bị giới hạn bởi không gian trống kế tiếp trong bộ nhớ
-
Cấu trúc là cấu trúc tĩnh, không gian nhớ được cấp phát trong thanh ghi data, hoặc
thanh ghi stack
type pqueue=^nut;
nut= record
infor: item;
next:pqueue;
end;
var l,f:pqueue;
Ưu điểm:
-
không có hiện tựợng giữ chỗ để đấy nên không gây lãng phí bộ nhớ
-
Cấu trúc mang tính động, không gian nhớ cấp phát cho hàng đợi là không gian
động, được cấp phát trong heap
-
Không bị hạn chế bởi không gian trống kế tiép trong bộ nhớ, các phần tử trong
hàng đợi có thể nằm ở những vị trí khác nhau tong bộ nhớ, không nhất thiết phải
là những vị trí kế tiếp
Nhược điểm:
-
Mỗi nút trong hàng đợi tốn thêm một vùng nhớ chứa con trỏ
:Câu 2
var M: doublelist;
begin
for i:=1 to n do
begin
insert(M,,L, R);
end;
end;
trong đó thủ tục insert(M,L,R): chèn học sinh được trỏ bởi M vào cuối danh sách:
Var
Begin
if (L=nil)and(R=nil) then
begin
M^.Lptr:=nil; M^.Rptr:=nil;
L:=M; R:=M;
end
else
begin
end;
End;
- Sử dụng biến đếm, ban đầu = 0 , đếm số người học lớp “CD2C”
- Sử dụng con trỏ phụ M duyệt từ đầu đến cuối danh sách, sinh nào có: M^.lop =
“CD2C” thì tăng biến đếm lên 1:
Có thể sử dụng một trong các thuật toán sắp xếp để sắp xếp dữ liệu trên danh sách liên
kết, ở đây ta sử dụng giải thuật sắp xếp chọn trực tiếp (selection sort) và sử dụng cách tiếp
cận:giữ nguyên mối liên kết của các nút trong danh sách và hoán vị nội dung của các nút:
Giải thuật:
Procedure ListSelection_Sort(var L: List)
Var p, q, min: List;
Begin
p:=L;
While (p<>nil) do
Begin
q:=p^.next;
min:=p;
While (q<>nil) do
Begin
If (q^.infor<min^.infor) then min:=q;
q:=q^.next;
End;
Hoanvi(min^.infor,p^.infor);
P:=P^.next;
End;
End;
+ Hiển thị danh sách sinh viên theo từng lớp: Sử dụng con trỏ M duyệt tử đầu đến cuối danh
sách đã được sắp theo lớp ở câu 3, duyệt đến sinh viên nào thì hiển thị các thông tin về sinh viên đó:
(0.5 đ)
M: = L; p:=M;
writeln(‘Các sinh vien lop M^.lop la:’);
While (M<> nil) do
Begin
Write(M^. hoten);
Write(M^. Lop);
Write(M^. sbd);
P:=M;
M := M^.next;
If (M^.lop<>p^.lop) then writeln(‘Các sinh vien lop M^.lop la:’);
End;
Câu 3
- Bài toán tính biểu thức tiền tố, lưu vết đường đi trên đồ thị, khử đệ quy, ......
(0.5 đ)
- Phân tích bài toán : (0.5 đ)
Đề 7
Câu 1(1 điểm)
Nêu khái niệm đệ quy, giải thuật đệ quy, Cho ví dụ về một giải thuật đệ quy?
Câu 2(3 điểm)
Hàm Ackermann là hàm hai đối số với giá trị của đối số là số nguyên không âm. Nó được định
nghĩa như sau:
n+1 nếu m=0
Acker(m,n) = {
Acker(m-1,1) nếu m ≠ 0, n=0
Acker(m-1, Acker(m, n-1)) nếu m ≠ 0 và n ≠ 0
a) Hãy xác định xem ở đây “tiêu chuẩn gốc” (ứng với trường hợp suy biến) là gì?
b) Hãy tính Acker(1, 3), giải thích tại sao? .
c) Viết giải thuật để tính giá trị Acker(n,m), với m, n là các số nguyên được nhập từ bàn phím
Câu 3(4 điểm)
Học sinh khối 12 dự thi hết học kỳ các môn: toán, lý, hóa, ngoại ngữ. Mỗi thí sinh cần quản lý các
thông tin Số báo danh, họ tên, lớp
1. Hãy sử dụng cấu trúc dữ liệu danh sách liên kết đơn để lưu trữ các thông tin của các thí sinh
dự thi. Viết dạng cài đặt tương ứng của cấu trúc trên
2. Xây dựng các chương trình con thực hiện các nhiệm vụ sau:
- Nhập thông tin về các thí sinh dự thi (điều kiện dừng là nhập SBD = rỗng)
- Hiển thị các thí sinh dự thi theo lớp
- Loại bỏ các thí sinh có điểm trung bình < 5 ra khỏi danh sách (điểm trung bình =
(toan+ly+hoa+ngoaingu)/4)
- Tìm kiếm thí sinh theo số báo danh nhập vào
Câu 1
+ Đệ quy: Một đối tượng được gọi là đệ quy nếu nó bao gồm chính nó như là một bộ phận hoặc
nó được định nghĩa dưới dạng của chính nó (0.5 đ)
+ Giải thuật đệ quy: là giải thuật có chứa lời giải đệ quy. Lời giải đệ quy là lời giải của bài toán
T được thực hiện bởi lời giải của bài toán T’ có dạng như T (cỡ của T’< T). Ví dụ: Tính n!
(0.5 đ)
Câu 2
a) Tiêu chuẩn gốc ứng với trường hợp suy biến ở đây là m = 0, nếu m = 0 thì Acker(m,n) = n+1
(1 đ)
b) Ta có:
Begin
Else
If(n=0)then Acker:=Acker(m-1,1)
End;
Câu 3
c) Loại bỏ tất cả các học sinh có điểm trung bình <5 ra khỏi danh sách, biết rằng điểm trung bình =
(toan + ly+ hoa+ ngoaingu)/4: (1 đ)
Cách làm: b1) Tìm học sinh đầu tiên trong danh sách có điểm trung bình <5, giả sử vị trí k
b3) Lặp đi lặp lại b1); b2) cho đến khi hết vị trí tìm thấy
Chú ý: - để tìm học sinh thỏa mãn điều kiện ta duyệt từ đầu danh sách k:=1 đến khi tìm thấy
thì dừng
-
để loại bỏ học sinh ở vị trí k, ta di chuyển con trỏ p đến vị trí k, q đến vị trí trước
K, thực hiện loại bỏ: q^.next:=p^.next; dispose(p);
- Duyệt từ đầu đến cuối danh sách mà vẫn không tìm thấy, hoặc duyệt đến khi tìm thấy thì
dừng. Duyệt đến thí sinh nào thì so sánh số báo danh của thí sinh đó với số báo danh cần tìm,
nếu bằng nhau thì kết luận tìm thấy, nếu không bằng nhau thì duyệt thí sinh tiếp theo trong danh
sách
Đề 8
Câu 1(2 điểm)
Cho biết số Fibinacci F11 = 89 và F12 = 144
a) Hãy tính F16 =?. Viết công thức dãy số Fibonacci
b) Viết một thủ tục không đệ quy (dùng phép lặp) để tính và in ra n số Fibonacci đầu tiêu?
Câu 2(5 điểm)
Giả sử ta cần quản lý một danh sách học sinh, mỗi học sinh gồm những thông tin sau: Họ tên,
Lớp, Điểm tổng kết . Hãy viết dạng cài đặt danh sách trên bằng mảng. Với cách cài đặt này, viết
chương trình con tương ứng với các yêu cầu sau:
1) Nhập danh sách gồm n sinh viên
2) Thêm vào danh sách một sinh viên mới có thông tin như sau vào vị trí thứ k:
Họ tên: Nguyen Van An
Lớp: TH2B
DiêmTK: 7.4
3) Sắp xếp học sinh theo từng lớp (trường lớp tăng dần)
4) In ra danh sách các học sinh theo từng lớp
5) Loại bỏ khỏi danh sách tất cả các sinh viên có điểm tổng kết <5
(n, k là một số nguyên dương nhập từ bàn phím)
Câu 3(1 điểm)
Với các yêu cầu cụ thể của bài toán quản lý danh sách ở câu 2.; Anh (Chị) hãy nêu ưu và nhược
điểm của cách cài đặt danh sách đã trình bày, đề xuất cách cài đặt khác hiệu quả hơn.
Câu 1
{
1 nếu n = 1 hoặc n = 2
F (n) = F(n-1)+F(n-2) nếu n>2
b) Procedure Fibonacci(n,F) (1 đ)
+ Loại bỏ tất cả các học sinh có điểm tổng kết <5 ra khỏi danh sách: (1 đ)
Cách làm: b1) Tìm học sinh đầu tiên trong danh sách có điểm tổng kết <5, giả sử vị trí k
b3) Lặp đi lặp lại b1); b2) cho đến khi hết vị trí tìm thấy
Chú ý: - để tìm học sinh thỏa mãn điều kiện ta duyệt từ đầu danh sách k:=1 đến khi tìm thấy thì
dừng
- để loại bỏ học sinh ở vị trí k, ta dồn các học sinh từ k+1 đến L.count lại 1 ô nhớ, giảm
count đi 1 đơn vị
Câu 3 (1 đ)
Ưu điểm: - Tốc độ truy cập đến các phần tử là nhanh (truy cập trực tiếp)
Nhược điểm: - Lãng phí bộ nhớ (hiện tượng giữ chỗ để đấy mà không dùng đến)
- Có hiện tượng co giãn các phần tử khác khi thực hiện phép laọi bỏ là cho số lượng
phép tính trong giải thuật tăng lên => độ phức tạp tính toán cũng tăng theo,
-
Bị giới hạn bởi không gian trống kế tiếp trong bộ nhớ, là cấu trúc tĩnh
Đề xuất cấu trúc thích hợp hơn: Cấu trúc danh sách liên kết vì: khắc phục các hạn chế của danh sách
cài đặt như trên
Đề 9
Câu 1(2 điểm)
Thế nào là cấu trúc dữ liệu và giải thuật? Cấu trúc dữ liệu và giải thuật đóng vai trò như thế nào
trong quá trình giải quyết một bài toán tin học? Anh (Chị) hãy lấy một ví dụ minh họa cho điều
đó?
Câu 2(4 điểm)
Giải thuật tính ước số chung lớn nhất của hai số p, q (p>q) được mô tả như sau:
Gọi r là số dư trong phép chia p cho q:
- Nếu r = 0 thì q là ước số chung lớn nhất
- Nếu r ≠ 0 thì gán cho p giá trị của q, gán cho q giá trị của r rồi lặp lại quy trình trên.
a) Hãy lập bảng ghi nhận các giá trị của p, q, r trong quá trình thực hiện tính ước số chung lớn
nhất của hai số: 1260 và 198.
b) Hãy nêu lên tính đệ quy trong cách tính này từ đó xây dựng một cách tính đệ quy cho hàm
tính ước số chung lớn nhất: USCLN(p,q).
c) Viết một giải thuật đệ quy và một giải thuật không đệ quy (dùng phép lặp) để tính ước số
chung lớn nhất của p, q.
15 1
Câu 3 (2 điểm)
Cho một cây chứa các số nguyên như hình vẽ:
2 10 3 21 12 31 5
0 4
6 45 9 7
Anh (chị) hãy:
1) Cài đặt cây trên bằng phương pháp danh sách các con của mỗi đỉnh (viết dạng cài đặt, hình
ảnh cây trong bộ nhớ)
2) Dựng 1 cây nhị phân tìm kiếm có các khóa là các các số nguyên lưu tại các đỉnh của cây
trên, các đỉnh được nhập vào cây theo thứ tự được đánh số như trên
Câu 1
+ Giải thuật là một dãy các câu lệnh chặt chẽ và rõ ràng, xác định một dãy các thao tác trên một số đối
tượng nào(dữ liệu) đó sao cho sau một số hữu hạn bước thực hiện ta đạt được kết quả mong muốn
(0.5 đ)
+ Cách thức tổ chức biểu diễn dữ liệu mà theo đó dữ liệu được lưu trữ và được xử lý trong MTĐT,
được gọi là cấu trúc dữ liệu (0.5 đ)
+ CTDL & GT đóng vai trò quan trọng trong việc giải quyết một bài toán, ta thấy:
=> muốn viết được chương trình tốt ta phải có cấu trúc dữ liệu tốt và giải thuật tốt, không có CTDL,
GT thì không có chương trình để giải quyết bài toán (0.5 đ)
+ Ví dụ: (0.5 đ)
Câu 2
a) Các giá trị của p, q, r được ghi nhận trong bảng sau: (1 đ)
p q r
1260 198 72
198 72 54
72 54 18
54 18 0
= > Vậy USCLN (1260, 198) = 18
b) (1 đ)
Ta thấy việc tính USCLN của p, q sẽ dẫn tới việc tính USCLN của q và r khi r ≠ 0 (q và r rõ
ràng là nhỏ hơn p và q), thể hiện tính đệ quy trong cách tính. Công thức đệ quy là
{
USCLN(p.q) = q , nếu p mod q = 0
Function USCLN1(p,q)
1. if ((p mod q)=0) then USCLN1 := q
else USCLN1 := USCLN1(q, p mod q);
Function USCLN2(p,q)
{x,y,z ở đây là các biến cục bộ}
1. x :=p; y:= q;
2. repeat
z := x mod y;
x := y;
y := z;
until z = 0;
3. USCLN1 := x;
Câu 3
1) Cài đặt cây bằng danh sách các con của mỗi đỉnh (1 đ)
infor Child 45
15
10
21
12
31
45
9
..
..
15
9 12 31
0
Đề 10
45
Câu 1(2điểm)
Nêu khái niệm danh sách, các cách cài đặt danh sách bởi mảng, bởi danh sách liên kết đơn, ưu
nhược điểm của từng dạng cài đặt?
Câu 2(4 điểm)
Học sinh khối 12 dự thi hết học kỳ các môn: toán, lý, hóa, ngoại ngữ. Mỗi thí sinh cần quản lý các
thông tin Số báo danh, họ tên, lớp
3. Hãy sử dụng cấu trúc dữ liệu danh sách liên kết đơn để lưu trữ các thông tin của các thí sinh
dự thi. Viết dạng cài đặt tương ứng của cấu trúc trên
4. Xây dựng các chương trình con thực hiện các nhiệm vụ sau:
- Nhập thông tin về các thí sinh dự thi (điều kiện dừng là nhập SBD = rỗng)
- Hiển thị các thí sinh dự thi theo lớp
- Loại bỏ các thí sinh có điểm trung bình < 5 ra khỏi danh sách (điểm trung bình =
(toan+ly+hoa+ngoaingu)/4)
- Tìm kiếm thí sinh theo số báo danh nhập vào
Câu 3 (2 điểm)
Người ta nói rằng ngăn xếp (stack) họat động theo nguyên tắc LIFO (Last In First Out) và hàng
đợi (queue) hoạt động theo nguyên tắc FIFO (First In First Out). Anh (chị) hiểu điều đó như thế
nào? Cho ví dụ minh họa?
Câu 2
Tương tự câu 2 đề 07
Câu 3:
+ LIOF (last in first out): Phần tử vào sau cùng thì lấy ra xử lý trước tiên và ngược lại (0.5
đ)
+ FIFO (first in first out): Phần tử vào trước lấy ra xử lý trước và ngược lại (0.5 đ)
+ Ví du: (1 đ)
Đề 11
Câu 1(2 điểm)
Nêu khái niệm ngăn xếp và hàng đợi? Ngăn xếp và hàng đợi giống và khác nhau như thế nào?
Viết dạng cài đặt của ngăn xếp và hàng đợi bằng mảng. Hàng đợi tròn cài đặt bởi mảng khắc
phục hạn chế gì của hàng đợi không tròn cài đặt bởi mảng?
Câu 2(4 điểm)
Một tập S gồm 7 công việc (được đánh số từ 1 đến 7) với quan hệ “làm trước:> ” thỏa mãn các
điều kiện sau:
7<5 3<6 2<1 4<2
5<3 5<6 2<6
a) Hãy vẽ đồ thị biểu diễn S
b) Biểu diễn đồ thị bằng danh sách lân cận kề: Dạng cài đặt và hình ảnh đồ thị sau khi
biểu diễn.
c) Viết giải thuật duyệt đồ thị theo chiều rộng, chiều sâu xuất phát từ một đỉnh bất kỳ
trên đồ thị (đỉnh này được biết trước khi duyệt)?
Câu 3 (2 điểm)
Anh (chị) hãy nêu khái niệm cây nhị phân tìm kiếm(binary search tree)? Tại sao người ta lại nói
cây nhị phân tìm kiếm thuận lợi cho phép toán tìm kiếm, và các phép toán khác cần đến việc tìm kiệm
như: Thêm một đỉnh vào cây, loại một đỉnh ra khỏi cây, sửa đổi thông tin trên cây….? Anh(chị) hãy
phân tích để thể hiện rõ điều đó.
Câu 1
- Ngăn xếp 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ử ra khỏi ngăn xếp đều được thực hiện ở một đầu, đầu đó gọi là đỉnh của ngăn xếp
- Hàng đợi là một danh sách tuyến tính trong đó phép bổ sung một phần tử vào hàng đợi được thực hiện
ở một đầu còn phép loại bỏ một phần tử ra khỏi hàng đợi được thực hiện ở đầu kia
+ Giống nhau:
-
Cũng là danh sách
-
Có hai phép toán cơ bản là bổ xung và loại bỏ (đều đóng vai trò là bộ nhớ đệm)
+ Khác nhau:
- Việc thêm vào, lấy ra một phần tử từ ngăn xếp đều được thực hiện ở một đầu, do đó
ngăn xếp hoạt động theo nguyên tắc LIFO, thích hợp với các ứng dụng có trình tự
truy xuất ngược với trình tự lưu trữ
- Việc thêm vào, lấy ra một phần tử từ hàng đợi được thực hiện ở hai đầu khác nhau,
do đó hàng đợi hoạt động theo nguyên tắc FIFO, thích hợp với các ứng dụng có trình
tự truy xuất và trình tự lưu trữ như nhau
* Dạng cài đặt ngăn xếp và hàng đợi bằng mảng: (0,5 đ)
+ Ngăn xếp:
Const n = 100;
Type Stack = Record
Ele: Array [1.. n ] of Item;
Top: 0..n;
End;
+ Hàng đợi:
Const n = 100;
Type Queue = Record
Ele: Array [1.. n ] of Item;
Front, Real: 0..n;
End;
Trong đó:
- Item: Là kiểu dữ liệu chứa trong hàng đợi hoặc ngăn xếp
- Top: Trỏ tới đỉnh ngăn xếp; Front, Real: Trỏ tới lối trước và lối sau của hàng đợi,
- Ele: Mảng chứa các phần tử có trong hàng đợi hoặc ngăn xếp
* Hàng đợi không tròn có hiện tượng khi thêm một phần tử và vào hàng đợi mà Real = n thì
không thêm được nữa, mặc dù lối trước có thể vẫn còn các ô nhớ trống. Hàng đợi tròn tận dụng tối đa
được không gian trống trong hàng khi thêm một phần tử và hàng, khắc phục hạn chế của hàng đợi
không tròn (0,5 đ)
Câu 2
a) Vẽ đồ thị biểu diễn S (1 đ)
1 2 3 5
4
6 7
b) Biểu diễn đồ thị bằng danh sách lân cận kề, hình ảnh đồ thị trong bộ nhớ (1 đ)
1 2
V[1]
2 4
V[2]
3 5
V[3]
4
V[4]
5 7
V[5]
6
V[6] 2 3 5
7
V[7]
* Dạng cài đặt:
Câu 3
* khái niệm cây nhị phân tìm kiếm (0.5 đ): Cây NPTK là một cây nhị phân thỏa mản 3 điều kiện:
Điều kiện 1: Khóa tại các đỉnh của cây con trái nhỏ hơn khóa tại gốc
Điều kiện 2: Khóa tại gốc > khóa tại các đỉnh của cây con bên phải
Điều kiện 3: Cây con bên trái và cây con bên phải đều là cây NPTK
* Cấu trúc cây NPTK trước hết thuận lợi chi phép toán tìm kiếm, độ phức tạp trong trường hợp xấu
nhất về mặt thời gian O(h), với h là chiều cao của cây. Từ đó kéo theo các phép toán khác cũng thuận
lợi như phép toán: Thêm, sửa, xóa, ..... (0.5 đ)
* Phân tích để thể hiện điều trên: Phân tích dựa vào độ phức tạp xâu nhất về mặt thời gian, với các
dạng tồn tại của cây NPTK như: Dạng cây suy biến, cây đầy đủ hoặc hoàn chỉnh, cây bình thường(1 đ)
Đề 12
Câu 1(2 điểm)
Nêu khái niệm cây nhị phân (binary tree)? Các cách cài đặt cây nhị phân? Ưu nhược điểm của
từng cách cài đặt.
Câu 2(4 điểm)
Cho một cây nhị phân tìm kiếm, các nút có khóa là các số nguyên. Hãy viết dạng cài đặt cây đã
cho bằng con trỏ, gốc của cây được trỏ bởi con trỏ R. Với dạng cài đặt này viết các thủ tục
tương ứng với các yêu cầu sau:
1) Tạo cây nhị phân tìm kiếm (Điều kiện dừng là nhập nút có giá trị là 0),
a) Hãy vẽ cây nhị phân T biểu diễn biểu thức trung tố E như trên
b) Muốn có biểu thức dạng tiền tố, dạng hậu tố thì phải duyệt cây T theo thứ tự nào? Kết
quả duyệt?
Câu 1
Cây nhị phân là một cây, trong đó số con tại mỗi đỉnh trên cây tối đa là 2 con và được sắp thành
cây con trái và cây con phải
- việc truy cập đến các đỉnh trên cây là trực tiếp, tốc độ truy cập là nhanh và
đồng đều đối với mọi phần tử
Hạn chế: - Khi cài đặt gây hiện tựợng dư thừa bộ nhớ.....
Hạn chế: - Truy cập đến các phần tử trên cây là truy cập tuần tự, bao giờ cũng xuất phát từ
gốc, nên tốc đọ truy cập là chậm
-
.....
Câu 2
* Sử dụng con trỏ phụ M chứa địa chỉ của nút cần thêm
Liên tiếp gọi thủ tục thêm đỉnh mới vào cây: Insert(x,R);
Cách làm:
-
Tìm x, p là con trỏ trỏ tới đỉnh có khóa x trên cây
-
Nếu đỉnh loại bỏ là lá (p^.left = nil; p^.right = nil): Dispose(p)
-
Nếu đỉnh loại bỏ có một con khác rỗng, một con = rỗng: Treo cây con khác rỗng
vào vị trí loại bỏ, giải phóng p
-
Nếu đỉnh loại bỏ có cả hai cây con đều khác rỗng: Treo cây con trái vào vị trí loại
bỏ, Treo cây con phải và vị trí trái nhất của cây con trái, giải phóng p
Cách làm: Có thể sử dụng một trong các phương pháp duyệt cây để đếm số đỉnh
Câu 3 *
* y * -
2 x - - * b
* b * b 5 a
b) 5 a 5 a
+ Duyệt cây biểu thức theo thứ tự trước => Kết quả là biểu thức tiền tố: *+*2xy**-*5ab-*5ab-
*5ab (0.5 đ)
+ Duyệt cây biểu thức theo thứ tự sau = > Kết quả là biểu thức hậu tố: 2x*y+*5a+-b5a*-b*5a*-
b** (0.5 đ)
Đề 13
Câu 1(2 điểm)
Nêu khái niệm cây? đường đi trên cây? chiều cao của cây? Hãy vẽ một cây và minh họa trên
cây đó. Viết dạng cài đặt cây bằng danh sách các con của mỗi đỉnh.
Câu 2(4 điểm)
Cho một cây nhị phân tìm kiếm lưu các sinh viên, mỗi nút trên cây lưu các thông tin của một
sinh viên, các thông tin cần quản lý của sinh viên: số báo danh(duy nhất cho mỗi sinh viên), họ
tên, lớp. Giả sử khóa của nút là trường số báo danh.
1. Hãy viết dạng cài đặt cây đã cho bằng con trỏ, gốc của cây được trỏ bởi con trỏ R.
2. Với dạng cài đặt trên viết các thủ tục tương ứng với các yêu cầu sau:
Tạo cây nhị phân tìm kiếm có n đỉnh (n là số nguyên dương nhập từ bàn phím)
Loại bỏ đỉnh khóa là x trên cây
Cài đặt phép toán thêm đỉnh có khóa x
3. Anh(chị) hãy nêu cách tìm kiếm một sinh viên có trên cây hay không, nếu biết tên của sinh
viên mà không biết khóa(sbd) của sinh viên đó
Câu 3 (2 điểm)
Cho biểu thức E = (2*x+y)*(5*a - b)3
a) Hãy vẽ cây nhị phân T biểu diễn biểu thức trung tố E như trên
b) Muốn có biểu thức dạng tiền tố, dạng hậu tố thì phải duyệt cây T theo thứ tự nào? Kết quả
duyệt?
Câu 1
+ Khái niệm cây: Cây là một đồ thị vô hướng liên thông phi chu trình
+ Đường đi trên cây từ a1-> an là một dãy các đỉnh a 1, a2, a3, .....an-1, an, sao cho ai có quan hệ
với ai+1, i: 1->n-1
+ Chiều cao của cây bằng số mức lớn nhất của đỉnh có trên cây
Ví dụ:
+ Dạng cài đặt cây bằng danh sách các con của mỗi đỉnh:
Câu 2
2)
* Sử dụng con trỏ phụ M chứa địa chỉ của nút cần thêm
Liên tiếp gọi thủ tục thêm đỉnh mới vào cây: Insert(x,T);
+ Thủ tục loại bỏ đỉnh x ra khỏi cây sao cho cây sau khi laọi bỏ vẫn là cây NPTK:
-
Tìm xem x có trên cây không:?
-
Nếu không có thì thông báo và thoát khỏi chương trình
-
Nếu x có trên cây:
Nếu p có cả hai cây con khác rỗng: treo cây con trái vào vị trí
trái nhất của cây con phải, treo cây con phải vào vị trí loại bỏ,
giải phóng p
+ Viết thủ tục thêm một đỉnh x vào cây R: Insert(x, R):
* Sử dụng con trỏ phụ M chứa địa chỉ của nút cần thêm
3) Nêu cách tìm kiếm theo tên sv: Tìm kiếm tuần tự trên cây theo tên sv đã biết
Câu 3 *
* y * -
2 x - - * b
* b * b 5 a
5 a 5 a
b) + Duyệt cây biểu thức theo thứ tự trước => Kết quả là biểu thức tiền tố: *+*2xy**-*5ab-*5ab-
*5ab
+ Duyệt cây biểu thức theo thứ tự sau = > Kết quả là biểu thức hậu tố: 2x*y+*5a+-b5a*-b*5a*-
b**
Đề 14
Câu 1(2 điểm)
Nêu khái niệm cây? Viết dạng cài đặt cây bằng danh sách cha của mỗi đỉnh. Với cách cài đặt
này, viết thủ tục tìm cha của đỉnh thứ k trên cây (giả sử các đỉnh trên cây được đánh số theo một
thứ tự nào đó, k là số nguyên nhập từ bàn phím)
Câu 2(4 điểm)
Các phương pháp để định nghĩa một tập hợp. Giả sử cần quản lý các tập hợp A, B chứa các số
nguyên, các số nguyên này có giá trị thuộc đoạn [1..n] (n là một hằng số nào đó). Anh (chị) hãy:
1) Viết dạng cài đặt của tập hợp trên bởi véc tơ bít
2) Với dạng cài đặt trên, hãy viết các thủ tục tương ứng với các yêu cầu sau:
i. Nhập giá trị cho tập hợp A, B
ii. Tìm tập C = A∩B; C = AUB; C= A\B
iii. Xác định xem số nguyên x có thuộc tập A hay không?
iv. Thêm, loại bỏ số nguyên x vào, ra khỏi tập hợp
3) Anh(chị) hãy cho biết một tập hợp phải thỏa mãn điều kiện gì thì mới có thể cài đặt bằng
phương pháp vecto bít
Câu 3 (2 điểm)
Cho biểu thức E = (2*x+y)*(5*a - b)3
c) Hãy vẽ cây nhị phân T biểu diễn biểu thức trung tố E như trên
d) Muốn có biểu thức dạng tiền tố, dạng hậu tố thì phải duyệt cây T theo thứ tự nào? Kết
quả duyệt?
Câu 1
+ Khái niệm cây: Cây là một đồ thị vô hướng liên thông phi chu trình
+ Cài đặt cây bằng danh sách cha của mỗi đỉnh:
Begin
Parent := T[k].parent;
End;
Câu 2
+ Có hai phương pháp để xác định một tập hợp trong toán học: (0.5 đ)
- Liệt kê tất cả các phần tử trong tập hợp (nếu tập hợp đó là hữu hạn)
- Nêu lên các đặc trưng chung của các phần tử trong tập hợp
1) Viết dạng cài đặt tập hợp bởi véc tơ bít: (0.5 đ)
b)Tìm hợp, giao, trừ của hai tập hợp A,B (0.5 đ)
* giao của A và B
3) Các phần tử trong tập hợp phải là các số nguyên hoặc được mã hóa bởi các số nguyên thì mới có thể
cài đặt tập hợp bởi véc tơ bít (0.5 đ)
Câu 3
Tương tự câu 3 đề 12
Đề 15
Câu 1(2 điểm)
Định nghĩa từ điển, tư tưởng của bảng băm mở. Viết dạng cài đặt từ điển bởi bảng băm mở. Với
dạng cài đặt này anh(chị) hãy cài đặt phép toán tìm xem trong từ điển T có chứa từ x hay
không? (x là một từ được nhập từ bàn phím)
Giả sử cần quản lý một cây chứa các số nguyên. Hãy viết dạng cài đặt cây bằng mảng danh
sách các con của mỗi đỉnh. Hãy dựng một cây có 12 đỉnh và minh hoạ cách cài đặt trên bằng
hình ảnh cụ thể với cây vừa dựng. Nêu cách tạo một cây
Câu 3 (3 điểm)
Giả sử cần quản lý một danh sách các số nguyên. Hãy viết dạng cài đặt danh sách này bằng
mảng, với cấu trúc danh sách đã cài đặt, viết các chương trình con thực hiện các yêu cầu như
sau:
1) Tính trung bình cộng của các số dương lưu trong danh sách
Câu 1
Mô hình dữ liệu tập hợp, nhưng chi xét đến các phép toán thêm, xóa, tìm kiếm được gọi
là kiểu dữ liệu trừu tượng từ điển (dictionary).
const N= ..
Type pointer = ^ ele;
Ele= Record
Key: keytype;
Next: pointer;
End;
Dictionary = array[0..N-1] of pointer;
Var T: Dictionary;
+ Dạng cài đặt cây bằng danh sách các con của mỗi đỉnh: (1 đ)
+ Dựng cây có 12 đỉnh và minh họa cách cài đặt trên bằng hình ảnh cụ thể với cây vừa dựng
(1 đ)
b2) Lấy một đỉnh từ hàng đợi ra, nhập các con của nó, mỗi khi nhập một con, lại đưa
con đó vào hàng đợi
b3) lặp đi lặp lại b2) cho đến khi hàng đợi rỗng. Ta thu được cây cần tạo
Đề 16
Câu 1(3 điểm)
Tác dụng của hàm băm trong việc tạo một từ điển cài đặt bởi bảng băm, các tiêu chuẩn để lựa
chọn một hàm băm. Trình bày các phương pháp băm gấp, băm cắt bỏ, băm lấy phần dư. Cho ví
dụ minh họa.
Câu 2(5 điểm) 25
Cho một cây nhị phân tìm kiếm có các khóa là các số nguyên như hình vẽ. 20 39
15 21 30 40
Anh (chị) hãy:
1) Tạo cây 31 35
2) Viết dạng cài đặt cây trên bằng con trỏ. Root là con trỏ trỏ tới gốc của cây
3) Tìm đỉnh có khóa x trên cây
4) Nêu phương pháp để loại bỏ một đỉnh x = 39 trên cây, sao cho cây sau khi loại bỏ
đỉnh đó vẫn là cây nhị phân tìm kiếm
5) Hủy cây
Câu 1
+ Tác dụng của hàm băm h(hash function) : Phân chia các phần tử của tập hợp vào trong các lớp. Nếu x
là giá trị khóa của môt phần tử nào đó của tập hợp thì h(x) là chỉ số nào đó của mảng T, h(x) được gọi
là giá trị băm của x, ta nói x thuộc lớp h(x); (1 đ)
Giả sử khóa là số nguyên, ta phân chia khóa thành một số phần, sau đoa kết hợp các phần lại bằng
một phương pháp nào đó(có thể dùng phép cộng hoặc phép nhân) để nhận được giá trị băm
Ví dụ: Nếu khóa là số nguyên gồm 10 chữ số, N= 1000, ta phân thành các nhóm 3,3,2,2 chữ số từ
bên trái và công các nhòm lại, sau đó cắt cụt nếu cần thiết, ta sẽ nhận được giá trị băm 1229876087
được biến đổi thành: 122+987+60+87=1256, do ó ta có giá trị băm là: 256
Giả sử khóa là số nguyên (nếu khóa không là số nguyên ta xét đến mã của chúng). Ta sẽ bỏ đi một
phần nào đó của khóa và lấy phần còn lại làm giá trị băm của khóa
Ví dụ:: Nếu khóa là số nguyên gồm 10 chữ số, N= 1000, ta lấy các chữ số thứ nhất, thứ 3, thứ 6
làm giá trị băm, giả sử khóa x= 1229876087 ta có h(x) = 126 là giá trị băm
Giả sử khóa là số nguyên, và giả sử ta muốn chia tập hợp các khóa thành N lớp. Ta chia khóa cho
N, rồi lấy phần dư làm giá trị băm.
Ví dụ: Viết một hàm băm để băm các khóa là các xâu ký tự có độ dài 10 thành các giá trị từ 0 đến
N-1
* Sử dụng con trỏ phụ M chứa địa chỉ của nút cần thêm
Liên tiếp gọi thủ tục thêm đỉnh mới vào cây: Insert(x,T);
2) Tìm xem trên cây T có nút chứa thông tin = x không: Search(x, T) (1 đ)
-
Nhâp x =?
-
Nếu cây rỗng (T = nil): Thông báo không tìm thấy
-
Nếu cây không rỗng:
a) Sử dụng con trỏ phụ M di chuyển đến các đỉnh trên cây bắt đầu từ gốc:
c) Nếu (x<M^.info) thì tìm x trên cây con trái của M: M := M^.Left, ngược lại
tìm x trên cây con phải của M : M := M^.Right;
d) Phép di chuyển M kết thúc khi m = nil(duyệt hết cây mà vẫn không thấy)
hoặc found = true (tìm thấy) thì dừng
3) Thủ tục loại bỏ đỉnh x = 39 ra khỏi cây sao cho cây sau khi laọi bỏ vẫn là cây NPTK: (1 đ)
-
Tìm xem x có trên cây không:?
-
Nếu không có thì thông báo và thoát khỏi chương trình
-
Nếu x có trên cây:
Nếu p có 1 cây con khác rỗng: treo cây con khác rỗng vào vị
trí loại bỏ, giải phóng p
Nếu p có cả hai cây con khác rỗng: treo cây con trái vào vị trí
trái nhất của cây con phải, treo cây con phải vào vị trí loại bỏ,
giải phóng p
5) Hủy cây: Duyệt cây theo thứ tự sau để hủy các đỉnh có trên cây, Duyệt đến đỉnh nào gọi thủ tục loại
bỏ đỉnh đó (1 đ)
Đề 17
Câu 1(3 điểm)
Trình bày một phương pháp cài đặt cây nhị phân tìm kiếm. Dựng một cây nhị phân tìm kiếm có
13 nút, các đỉnh nhận giá trị là các số chẵn 2, 4, 6, … Viết thuật toán thêm một đỉnh mới x = 13
vào cây nhị phân tìm kiếm với cách cài đặt trên và minh hoạ trên cây vừa dựng. Kết quả của
từng phép duỵệt cây theo thứ tự trước, giữa, sau
Anh (chi) hãy viết dạng cài đặt từ điển bởi bảng băm đóng. Nếu thêm một từ vào từ điển cài đặt
bởi bảng băm đóng thì khi nào xảy ra hiện tượng đụng khóa, ví dụ minh họa. Khi nào cần băm
lại, Hãy trình bày các phương pháp băm lại.
Câu 3 (2 điểm)
Nêu các cách cài đặt danh sách? viết dạng cài đặt tương ứng? ưu nhược điểm của từng cách cài
đặt.
Câu 1
+ Có thể cài đặt cây NPTK bởi con trỏ như sau: (0.5 đ)
+ Dựng một cây NPTK có 13 nút, lưu các số nguyên chẵn, cây sau khi thêm đỉnh 13 như hình vẽ:
(0.5 đ)
* Sử dụng con trỏ phụ M chứa địa chỉ của nút cần thêm
Câu 2
var T: dictionary;
- Dụng khóa xảy ra khi thêm một phần tử vào từ điển: Giả sử muồn thêm phần tử có khóa x và từ điển
T, ta muốn đặt khóa x vào thành phần T[h(x)] của mảng, như ở vị trí đó đã lưu giữ một giá trị khóa
khác, hoàn cảnh này còn gọi là sự va chạm (đụng khóa)
Ví dụ: N=10, các khóa a,b,c,d,e có các giá trị băm như sau: h(a)=7, h(b)=1, h(c)=4, h(d)=3, h(e)=3, Giả
sử ban đầu bảng rỗng, tức là tất cả các thành phần của bảng đều chứa giá trị rỗng.ta đưa lần lượt các giá
trị khóa a,b,c,d,e vào bảng, khi đó a,b,c,d lần lượt được đặt vào vị trí 7,1,4,3. Vì h(e)=3,ta tìm đến vị trí
thứ 3 của mảng, ta thấy vị trí này đã chứa d => xẩy ra hiện tượng đụng khóa khi thêm e vào bảng.
- Khi xảy ra hiện tượng đụng khóa ta cần băm lại: ta lần lượt xét các vị trí h1(x), h2(x),…..hi(x) – băm
lại lần thứ i cho đến khi nào tìm thấy vị trí trống để đặt x vào. Nếu không tìm được vị trí trống, ta nói
bảng đã đầy không thể thêm x được nữa ,
Tức ta xem mảng là mảng vòng tròn và lần lượt xét đến các vị trí h(x)+1, h(x)+2, ……
Câu 3
Tương tự câu 3 mã đề 04
Đề 18
Câu 1(3 điểm)
Tác dụng của hàm băm trong việc tạo một từ điển cài đặt bởi bảng băm, các tiêu chuẩn để lựa
chọn một hàm băm. Trình bày các phương pháp băm gấp, băm cắt bỏ, băm lấy phần dư. Cho ví
dụ minh họa.
Câu 3 (2điểm)
Vẽ cây nhị phân biểu diễn các biểu thức sau đây và viết chúng dưới dạng tiền tố, hậu tố
a) A/(B+C)+D*E-A*C
b) (x1 ^x2)v(x1^x2); với ^ là phép và(AND); v là phép hoặc (OR)
Câu 1
Tương tự câu 3 đề 16
Câu 2
+ Cài đặt cây nhị phân bằng mảng các nút: (0.5 đ)
PreOrder(T):
1) Visit (T);
2) preOrder(T.Left);
3) preOrder (T, Right);
InOrder(T):
InOrder(T.Left);
Visit (T);
InOrder (T, Right);
postOrder(T):
InOrder(T.Left);
InOrder (T, Right);
Visit (T);
Ưu điểm:
-
Truy cập đến các nút là trực tiếp, do đó tốc độ truy cập là nhanh
-
Dễ thực hiện các thao tác
Nhược điểm:
-
Tốn bộ nhớ khi cài đặt, vì có hiện tượng giữ chỗ để đấy mà không dùng đến
-
bị quy định bởi không gian nhớ kế tiếp của mảng
Câu 3
/
a) (1 đ)
/ -
Biểu thức tiền tố: //A+bc-d*ef
A + D *
Biểu thức hậu tố: Abc+/def*-/
B C E F
b) (1 đ) v
^ ^
Biểu thức tiền tố: v^x1x2^x1x2
Đề 19
Câu 1(4 điểm)
Xây dựng một cấu trúc dữ liệu thích hợp để biễu diễn đa thức P(x) có dạng :
P(x) = c1xn1 + c2xn2 +...+ck xnk
Biết rằng:
1) Các thao tác xử lý trên đa thức bao gồm :
+ Thêm một phần tử vào cuối đa thức
+ In danh sách các phần tử trong đa thức theo: - thứ
tự nhập vào
- ngược với thứ tự nhập vào
+ Hủy một phần tử bất kỳ trong đa thức
2) Số lượng các phần tử không hạn chế
3) Chỉ có nhu cầu xử lý đa thức trong bộ nhớ chính.
a) Giải thích lý do chọn CTDL đã định nghĩa.
b) Viết chương trình con ước lượng giá trị của đa thức P(x) khi biết x.
c) Viết chương trình con rút gọn biểu thức (gộp các phần tử cùng số mũ)
Câu 2 (4 điểm)
Cho một cây nhị phân tìm kiếm có các khóa là các số nguyên như hình vẽ.
25
20 39
15 21 30 40
Câu 1
+ Biểu diễn đa thức bằng danh sách liên kết đơn, một đa thức là một danh sách liên kết
.Mỗi nút trong danh sách là một bản ghi gồm hai trường: heso: lưu hệ số, trường somu: lưu số mũ
+ Chọn cấu trúc danh sách liên kết vì nó phù hợp với các thao tác yêu cầu từ 1->3
begin
tam:=x;
end;
-
Duyệt từ đầu đến cuối đa thức để tính giá trị của đa thức, giá trị này = kq
p:=L; {L: là con trỏ trỏ tới đầu danh sách biểu diễn đa thức}
while p<>nil do
begin
kq:=kq+q^.heso*pow(x,q^.somu);
p:=p&.next;
end;
a) nếu 2 nút nào có cùng số mũ thì cộng hệ số lại, lưu vào biến tong, nếu
tong=0, thì loại bỏ 2 nút đó và duyệt tiếp, nêu tong <>0, tạo ra một nút mới,
hệ số của nút này = tong, số mũ = số mụ của 1 trong 2 nút đó, loại bỏ hai nút
này khỏi danh sách, gắn nút mới vào vị trí loại bỏ, duyệt tiếp danh sách
Câu 2:
Tương tự câu 2 đề 16
Đề 20
Câu 1(1 điểm)
Anh (Chị) hãy nêu một vài cấu trúc dữ liệu mà anh(chị) đã được học và tự nghiên cứu. Cài đặt
các cấu trúc đó trên máy tính.
Câu 2 (3 điểm)
Hãy cho biết nội dung của stack sau mỗi thao tác trong dãy :
EAS*Y**QUE***ST***I*ON
Với một chữ cái tượng trưng cho thao tác thêm chữ cái tương ứng vào stack,
dấu * tượng trưng cho thao tác lấy nội dung một phần tử trong stack in lên màn hình.
Hãy cho biết sau khi hoàn tất chuỗi thao tác, những gì xuất hiện trên màn hình?
Viết các chương trình con thêm một ký tự vào ngăn xếp, lấy một ký tự từ ngăn xếp ra để hiển
thị lên màn hình
Câu 3 (4 điểm)
Cho biểu thức trung tố sau:
E = a-b*(c+e)/15.
Hãy trình bày phương pháp để chuyển một biểu thức trung tố sang hậu tố, có sử dụng đến cấu
trúc ngăn xếp. Minh họa cụ thể trên biểu thức đã cho. Viết giải thuật tương ứng
Câu 1 (1đ)
+ Một số cấu trúc dữ liệu như: mảng, bản ghi, tệp tin, danh sách, …..
+ Cài đặt:
Câu 2
+ Nội dung của ngăn xếp sau khi thực hiện các thao tác là: ON (1 đ)
+ Kết qua trên màn hình sau khi thực hiện các thao tác là: SYAEUQTSEI (1 đ)
+ Các thủ tục: thêm, lấy một phần tử ra khỏi ngăn xếp (1 đ)
Câu 3
1) Phương pháp chuyển một biểu thức trung tố sang hậu tố: (1,5 đ)
* Sử dụng ngăn xếp Sđể lưu các dấu mở ngoặc, các dấu phép toán, và dấu /. Ta đưa ký hiệu $ để đánh
dấu đáy của ngăn xếp. Khi đỉnh của ngăn xếp chứa $, có nghĩa là ngăn xếp rỗng
* Trên tập các ký hiệu S, (, +, -, *, / ta xác định hàm ưu tiên Pri như sau:
Pri($)<Pri(()<Pri(+)=Pri(-)<Pri(*)=Pri(/)
* Giả sử cần chuyển biểu thức rung tố E sang biểu thức hậu tố E1, ta thêm vào bên phải E dấu # để
đánh dấu hết biẻu thức E. Cách chuyển E sang E1 như sau:
1. Đọc một thành phần của biểu thức E, lưu vào x (đọc lần lượt từ trái qua phải)
b) Nếu Pri(y)>= Pri(x) thì loại y khỏi ngăn xếp, viết y vào bên phải E1 và quay lại bước
a)
b) Nếu y là dấu phép toán thì loại y khỏi ngăn xếp, viết y vào bên phải E1 và quay lại a)
c) Nếu y là dấu (thì loại nó khỏi ngăn xếp
2. Lặp lại bước 1 cho tới khi toàn bộ biểu thức E được đọc qua
3. Loại phần tử ở đỉnh ngăn xếp và viết nó vào bên phải E1. Lặp lại bước này cho đến khi ngăn
xếp rỗng
Đề 21
Câu 1(2 điểm)
Khái niệm ngăn xếp, hàng đợi, các cách cài đặt.
Câu 2 (3 điểm)
Cho một stack S, được cài đặt bởi mảng một chiều S có n = 6 phần tử, Top chứa chỉ số ở đỉnh
ngăn xếp. Thoạt đầu stack rỗng (Top=0). Anh(chị) hãy:
1) Viết dạng cài đặt của ngăn xếp
2) Hãy xác định kết quả cuỗi cùng khi thực hiện các phép tính sau? Giải thích:
a:= 2; b:= 5;
PUSH (a, S); PUSH (4, S); PUSH (b+2, S);
PUSH (9, S); PUSH (a+b, S);
while (Top<>0) do
begin
Pop (x, Top); Write(x);
end;
Biết rằng:
PUSH (n, S): Ứng với thao tác đẩy phần tử n vào ngăn xếp S
Pop (n, S): Ứng với thao tác lấy phần tử trong ngăn xếp S ra và lưu vào biến n
3) Anh(chị) hãy viết thủ tục PUSH, Pop tương ứng ở trên
Câu 3 (3 điểm)
1) Hãy cho biết nội dung của hàng đợi sau mỗi thao tác trong dãy :
EAS*Y**QUE***ST***I*ON
Với một chữ cái tượng trưng cho thao tác thêm chữ cái tương ứng vào hàng đợi,
dấu * tượng trưng cho thao tác lấy nội dung một phần tử trong hàng đợi in lên
màn hình.
2) Hãy cho biết sau khi hoàn tất chuỗi thao tác trên, những gì xuất hiện trên màn hình?
3) Viết dạng cài đặt hàng đợi trên bởi mảng
4) Với cách cài đặt trên, hãy viết thủ tục thêm một ký tự vào hàng đợi, lấy một ký tự ra từ hàng
đợi để hiển thị lên màn hình
Câu 1
+ Có hai phương pháp cài đặt ngăn xếp: Bởi mảng và bởi con trỏ: (1 đ)
-
Sử dụng mảng:
+ Có thể cài đặt hàng đợi bởi con trỏ hoặc bởi mảng:
-
Sử dụng mảng
Câu 2
Đề 22
Câu 1 (2 điểm)
Định nghĩa từ điển, Tư tưởng của bảng băm sử dụng trong việc cài đặt từ điển. Viết dạng cài đặt
từ điển bởi bảng băm mở. Với dạng cài đặt này anh(chị) hãy cài đặt phép toán tìm xem trong từ
điển T có chứa từ x hay không? (x là một từ được nhập từ bàn phím)
Câu 2(4 điểm)
Cho một danh sách liên kết đơn (DSLK) có nút đầu danh sách được trỏ bởi con trỏ L, các
phần tử trong danh sách có kiểu dữ liệu Item nào đó.
1) Viết các hàm trên DSLK đơn này:
a. insert_first (thêm một phần tử vào đầu danh sách),
b. insert_last (thêm một phần tử vào cuối danh sách),
c. remove_first(loại bỏ phần tử đầu tiên trong danh sách),
d. remove_last(loại bỏ phần tử cuối cùng trong danh sách)
2) Dùng các hàm ở ý 1) để tạo ra một hàng đợi và một ngăn xếp chứa n phần tử; (n là số
nguyên dương nhập từ bàn phím)
3) Lấy các phần tử trong ngăn xếp và hàng đợi ra hiển thị lên màn hình.
Câu 3 (2 điểm)
Dựng đồ thị có hướng G có giá trị ma trận lân cận kề như sau:
1 2 3 4 5 6
1 0 1 0 0 1 1
2 1 1 1 0 0 1
3 0 1 0 1 1 1
4 1 0 1 0 1 1
5 1 0 0 1 0 1
6 1 1 1 1 1 1
Nêu kết quả phép duyệt đồ thị G theo chiều sâu, và chiều rộng xuất phát từ V1.
Câu 1
Tương tự câu 1 đề 15
Câu 2
Các hàm:
1) procedure insert_first(x:item, var L: list); {thêm phần tử x vào đầu danh sách L} (0.5 đ)
Var m:list;
Begin
new(M);
m^.infor:= x;
M^.next:=L;
l:=M;
End;
2)procedure insert_last(x: Item, var L: list); (thêm một phần tử x vào cuối danh sách L) (0.5 đ)
var M, p:list;
Begin
p:=L; while (p^.next <>nil) do p:=p^.next;
new(M);
M^.infor:= x;
p^.next := M;
m^.next:=nil;
End;
3) Procedure remove_first(var m: list; var L:list)(loại bỏ phần tử đầu tiên trong danh sách L, M trỏ tới
phần tử sau khi bị loại bỏ khỏi danh sách); (0.5 đ)
Begin
if (L<>nil) then M:=L; L:=L^.next;
End;
4) Procedure remove_last(var M:list; var L:list)(loại bỏ phần tử cuối cùng trong danh sách L; M trỏ tới
nút sau khi loại bỏ khỏi danh sách) (0.5 đ)
var p,q:list;
Begin
if L<>nil Then
Begin
p:=L; q:=p^.next;
while (q^.next<>nil) do
begin
p:q; q:=q^.next;
end;
M:=q; p^.next:=nil;
End;
End;
2) tạo một hàng đợi và một ngăn xếp chứa n phần tử (1 đ)
Lấy các phần tử trong hàng đợi và trong ngăn xếp hiển thị lên màn hình(1 đ)
procedure hienthi_nganxep(top:list);
var m:list;
begin
while top<>nil do
begin
remove_firsts(M, Top);
write(M^.infor);
end;
Tương tự với hàng đợi
Câu 3
1 4
Đề 23
Câu 1 (2 điểm)
Định nghĩa từ điển, các phép toán trên từ điển, trình bày phương pháp cài đặt từ điển bởi bảng
băm mở (tư tưởng, dạng cài đặt). Cho ví dụ minh họa
Khái niệm cây? Trình bày cách cài đặt cây bằng con trưởng và em liền kề của mỗi đỉnh sử
dụng mảng. Vẽ ra một cây bất kỳ làm ví dụ minh họa. Viết thủ tục tìm con trưởng và em liền
kề của đỉnh thứ k trên cây T (k là một số nguyên dương nhập từ bàn phím; giả sử các đỉnh trên
cây đã được đánh số theo một thứ tự nào đó)
Câu 2 (3 điểm)
Cho 3 danh sách móc nối đơn, lần lượt có nút đầu tiên trong danh sách được trỏ bởi L1, L2,
L3. Anh(chị) hãy:
1) Viết dạng cài đặt của danh sách
2) Hãy viết các giải thuật:
a) Ghép danh sách L2 vào danh sách L1 và cho con trỏ L trỏ tới nút đầu danh
sách tổng hợp
b) Ghép danh sách L3 vào trước danh sách L2 và L1 vào sau L2 và cho con trỏ L
trỏ tới danh sách tổng hợp
3) Nhận xét về ưu nhược điểm của cách cài đặt trên
(Giả sử cả 3 danh sách đều khác rỗng).
Câu 1
Mô hình dữ liệu tập hợp, nhưng chi xét đến các phép toán thêm, xóa, tìm kiếm được gọi
là kiểu dữ liệu trừu tượng từ điển (dictionary).
const N= ..
Type pointer = ^ ele;
Ele= Record
Key: keytype;
Next: pointer;
End;
Dictionary = array[0..N-1] of pointer;
Var T: Dictionary;
+ Tư tưởng của bảng băm mở trong việc cài đặt từ điển: (0.5 đ)
-
Phân chia tập hợp đã cho thành một số cố định các lớp(giả sử N lớp được đánh số
từ 0 -> N-1)
-
Sử dụng một mảng T có chỉ số chạy từ 0 đến N-1 để chứa các phần tử trong tập
hợp, mỗi thành phần T[i] là một “rổ” đựng các phần tử thuộc lớp thứ I, các phần
tư trong mỗi lớp được tổ chức thành một danh sách liên kết, T[i] là con trỏ trỏ tới
phần tử đầu tiên trong lớp thứ i. T chính là bảng băm mở
Câu 2
+ Cây bao gồm một tập hợp hữư hạn các đỉnh, giữa các đỉnh có một mối quan hệ gọi là quan hệ phân
cấp cha – con (0.5 đ)
+ Cài đặt cây bởi con trưởng và em liền kề của mỗi đỉnh sử dụng mảng: (0.5 đ)
const n= 50;
type nut= record
infor:Item;
end;
tree=array[1..n]of nut;
var T: tree;
a 2 a 0
5 b 3
===>hình ảnh cây trong bộ nhớ:
b c d 0 c 4
0 d 0
e f 0 e 6
0 f 0
+ Thủ tục tìm con trưởng của đỉnh k trên cây T: Contruong:=T[k].eldest; (1 đ)
+ Thủ tục tìm em liền kề của đỉnh thứ k trên cây T: Emlienke:=T[k].nextsibling; (1 đ)
Câu 3
b) Ghép L2 vào sau L1, L trỏ tới danh sách kết quả: (1 đ)
c) Ghép L3 vào trước L2, L1 vào sau L2, L trỏ tới danh sách kết quả(1 đ)
Đề 24
Câu 1(2 điểm)
Thế nào là cấu trúc dữ liệu, giải thuật, mối quan hệ giữa chúng. Cấu trúc dữ liệu và giải thuật
đóng vai trò như thế nào trong việc giải quyết một bài toán tin học? Hãy cho một ví dụ minh
họa?
Câu 2 (3 điểm)
Trình bày một phương pháp cài đặt cây nhị phân tìm kiếm. Dựng một cây nhị phân tìm kiếm
có 13 nút, các đỉnh nhận giá trị là các số chẵn 2, 4, 6, … Viết thuật toán thêm một đỉnh mới x
= 13 vào cây nhị phân tìm kiếm và minh hoạ trên cây vừa dựng.
Câu 3 (3 điểm)
Một ma trận chỉ chứa rất ít phần tử với giá trị có nghĩa (ví dụ: phần tử 0 được gọi là phần tử
có nghĩa) được gọi là ma trận thưa. Ví dụ :
Hãy dùng cấu trúc danh sách liên kết để tổ chức biễu diễn một ma trận thưa sao cho tiết kiệm
bộ nhớ nhất (chỉ lưu trữ các phần tử có nghĩa).
a) Cấu trúc một nút trong danh sách có dạng như thế nào?
b) Viết dạng cài đặt ma trận trên bằng danh sách liên kết
c) Viết chương trình cho phép nhập, xuất ma trận
Câu 1
Tương tự câu 1 đề 09
Câu 2
Tương tự câu 1 đề 17
Câu 3
a) (1 đ) Ma trận sẽ thay bằng một danh sách liên kết đơn, danh sách này sẽ lưu các phần tử có nghĩa
của ma trận, mỗi phần tử trong ma trận được tổ chức dưới dạng một nút. Cấu trúc 1 nút trong danh sách
là một bản ghi gồm 4 trường có dạng:
b) Nhập ma trận (1 đ) Tương tự như nhập danh sách liên kết đơn thông thường
Đề 25
Câu 1 (1 điểm)
Thế nào là cấu trúc dữ liệu tiền định(định sẵn) của ngôn ngữ lập trình bậc cao? Cho ví dụ minh
họa
Câu 1(2 điểm)
Cho một danh sách liên kết đơn có n phần tử, các phần tử là các số nguyên. Hãy: Viết dạng cài
đặt của danh sách, và viết chương trình con đảo nhóm k phần tử đầu và nhóm k phần tử cuối
của danh sách cho nhau. Biết rằng: n > 2k
Câu 2 (4 điểm)
Cho một cây đa phân bất kỳ các đỉnh chứa các số nguyên. Anh(chị) hãy:
1) Viết dạng cài đặt của cây bởi danh sách các con của mỗi đỉnh.
2) Viết các chương trình con tương ứng với các yêu cầu sau:
a) Tạo một cây (điều kiên dừng nhập là: nhập số <0)
d) Tìm kiếm xem trên cây có chứa đỉnh có thông tin = x không? (x là số nguyên nhập từ
bàn phím)
Câu 1
1) Cấu trúc dữ liệu tiền định của ngôn ngữ lập trình bậc cao là các cấu trúc dữ liệu đã được định nghĩa
sẵn trong ngôn ngữ lập trình đó, người lập trình chỉ việc sử dụng mà không cần định nghĩa lại (0.5
đ)
3) Một vài cấu trúc dữ liệu tiền định như: mảng, bản ghi, tệp tin, ...... (0.5 đ)
Câu 2
+ Dạng cài đặt của danh sách: (1 đ)
Cách làm: - Chia danh sách L làm 3 đoạn, lần lượt cho L1, L2, L3 trỏ tới đầu mỗi đoạn
+ Tách k phần tử đầu của L, L1 trỏ tới phần tử đầu của danh sách này
+ Tách d-k phần tử đầu của L, L2 trỏ tới đầu đoạn này
Câu 2
+ Có thể cài đặt cây bằng danh sách các con của mỗi đỉnh: Tương tự y1) câu 3 đề 09 (1đ)
+ Viết các chương trình con tương ứng với các yêu cầu:
1) Tạo cây (1 đ)
b1) Nhập gốc cây, lưu vào hàng đợi. mức của gốc:=1
b2) Lấy một đỉnh từ hàng đợi ra, nhập các con của nó, các con này có mức:=mức +1,
gắn vào cây, mỗi khi nhập một con, lại đưa con đó vào hàng đợi,
b3) lặp đi lặp lại b2) cho đến khi nhập số 0. Ta thu được cây cần tạo
2) Có thể sử dụng một trong các phương pháp duyệt cây để tính số đỉnh trên cây(1 đ)
4) Tìm kiếm đỉnh có thông tin = x trên cây: Có thể sử dụng một trong các phương pháp duyệt cây
để tìm kiếm đỉnh có thông tin = x(1 đ)
Đề 26
Câu 1(2 điểm)
Khái niệm danh sách? Cho một danh sách chứa các số nguyên. Anh(chi) hãy:
1) Viết dạng cài đặt của danh sách bằng danh sách liên kết đơn
2) Viết chương trình con đổi ngược mối liên kết của các nút trong DSLK trên
Câu 2 (4 điểm)
1) Biểu diễn đa thức trên dưới dạng một danh sách liên kết đơn với mỗi phần tử là một cấu
trúc chứa hệ số và số mũ của thành phần đó.
2) Viết các chương trình con tương ứng với các yêu cầu sau:
1) Tối giản một đa thức (gộp các thành phần có cùng số mũ lại và sắp xếp đa thức theo
chiều số mũ giảm dần)
Câu 3 (2 điểm)
Anh(Chị) trình bày các cách cài đặt danh sách mà anh(chị) đã đươc học và tự nghiên cứu (Viết
dạng cài đặt, ưu nhược điểm của từng cách cài đặt)
Câu 1
+ Danh sách là một cấu trúc dùng để lưu trữ một tập hợp hữu hạn biến động các phần tử thuộc
cùng một lớp đối tượng nào đó
+ Cài đặt danh sách bởi danh sách liên kết đơn:
type list=^nut;
nut = record
infor: iteger;
next:list;
end;
var L: list;
2) 2) Đảo ngược mối liên kết của các phần tử trong d/s (1 đ)
+ Giả sử L là con trỏ trỏ tới nút đầu tiên trong danh sách.
2. Loại bỏ phần tử đầu tiên của danh sách L, p trỏ tới phần tử này
Lặp đi lặp lại bước 3 cho đến khi danh sách L rỗng; L:=L1
Câu 2
type list=^nut;
nut = record
heso: real;
somu: integer;
next:list;
end;
var L: list;
2) Các chương trình con
Cách làm:
1. Giả sử đa thức là một danh sách có nút đầu được trỏ bởi L
3. duyệt đa thức từ đầu đến cuối, xét 2 nút kế tiếp trong danh sách L:
Nếu tổng khác 0, thì lặp lại bước 3 cho đến khi gặp nút có hệ
số khác nó thì: loại bỏ các nút có cùng số mũ ra khỏi L, gắn
vào danh sách L1
+ Nếu khác số mũ, thì tách nút đứng trước ra khỏi L, gép vào L1
ý 2) Cách làm(1 đ)
a) Giả sử cần tính tổng 2 đa thức có các nút đầu được trỏ bởi con trỏ A,B
- Sử dụng 2 con trỏ p,q di chuyển đến các nút của 2 danh sách A,B từ đầu đến cuối:
+ Nếu p^.somu>q^.somu, thì: m^.heso:= p^.heso; m^.somu:=p^.somu; gắn m vào cuối danh
sách C; p:=p^.next
+ Nếu p^.somu<q^.somu, thì : m^.heso:= q^.heso; m^.somu:=q^.somu; gắn m vào cuối danh
sách C; q:=q^.next
+ Nếu một trong 2 danh A, B kết thúc trước, thì gắn phần còn lại của danh sách chưa kết thúc
vào cuối danh sách C
c) tính tích: , tách từng nút của danh sách A, nhân với các nút tương ứng của danh sách B, công các đa
thức thành phần lại
ý 3 cách làm: (1 đ)
duyệt toàn bộ đa thức từ đầu đến cuối, duyệt đến nút nào, hiển thị hệ số và số mũ của nút đấy
Câu 3
Ưu điểm:
-
Không gây hiện tượng lãng phí bộ nhớ (Hiện tượng giữ chỗ để đấy mà không
dùng đến như danh sách cài đặt bởi mảng)
-
Cấu trúc dữ liệu danh sách cài đặt bởi con trỏ còn gọi là cấu trúc dũ liệu động,
không gian bộ nhớ được cấp phát trong heap, do đó nó không bị giới hạn bởi kích
thước 64kb như đối với cấu trúc dữ liệu tĩnh
-
Các phần tử trong danh sách nằm ở những vị trí dải dác, do đó tận dụng được
những không gian trống này, mà không cần một vùng nhớ kế tiếp như cài đặt bởi
mảng
Nhược điểm:
-
Tốc độ truy cập đến các phần tử trong danh sách là chậm, không đồng đều đối với
mọi phần tử (truy cập tuần tự một chiều)
-
Từ phần tử trước không truy cập ngược lại phần tử đứng trước
-
mỗi phần tử trong danh sách tốn thêm một không gian là 4byte để lưu địa chỉ của
phàn tử đứng sau nó trong danh sách
b. Ưu điểm
1) truy cấp đến các phần tử là trực tiếp do đó nhanh và đồng đều đối với mọi
phần tử
c. nhược điểm
1) Có hiện tượng dư thừa bộ nhớ: Hiện tượng giữ chỗ để đấy mà không dùng
tới
3) Là cấu trúc dữ liệu tĩnh, bị giới hạn không gian bộ nhớ trong thanh ghi dữ
liệu và thanh ghi stack
4) có hiện tượng co giãn, dịch chuyển các phần tử khi thực hiện thao tác bổ
sung phần tử, hoặc loại bỏ phần tử, do đó là số lượng phép tính trong giải
thuật tăng= > độ phức tạp tính toán cũnh tăng theo
Đề 27 15
Câu 1(3 điểm) Cho cây nhị phân như hình vẽ: 10 21
9 12 31
0
Anh(chị) hãy:
1) Nêu khái niệm cây nhị phân tìm kiếm, cây đã cho có phải là cây nhị phân tìm kiếm
không? Giải thích tại sao?
2) Viết dạng cài đặt cây cân bằng bởi con trỏ.
3) Thêm một đỉnh có khoá x = 30 vào cây (minh họa vị trí được thêm trên cây, giải
thuật thêm tương ứng)
Câu 2(2 điểm)
Cho một danh sách kế tiếp biểu diễn cây thư mục (directory tree), mỗi phần tử gồm 2 thành
phần: tên thư mục, vị trí của thư mục cha trên danh sách này (số nguyên chỉ thứ tự thư mục
trong danh sách). Nếu là thư mục gốc thì giá trị thứ hai là 0. In cây thư mục này ra màn hình.
Câu 2 (3 điểm)
1) (1đ)
* khái niệm cây nhị phân tìm kiếm: Cây NPTK là một cây nhị phân thỏa mản 3 điều kiện:
Điều kiện 1: Khóa tại các đỉnh của cây con trái nhỏ hơn khóa tại gốc
Điều kiện 2: Khóa tại gốc > khóa tại các đỉnh của cây con bên phải
Điều kiện 3: Cây con bên trái và cây con bên phải đều là cây NPTK
* Cây nhị phân đã cho là cây NPTK vì nó thỏa mãn các điều kiện được nêu trong khái niệm cây NPTK
9 12 31
0
* Viết thủ tục thêm một đỉnh x vào cây R: Insert(x, R):
30
- Sử dụng con trỏ phụ M chứa địa chỉ của nút cần thêm
Câu 2:(2đ)
Duyệt danh sách để hiển thị các nút trong danh sách theo hình dạng cây thư mục
Đề 28
Câu 1(1 điểm)
Cho một danh sách kế tiếp biểu diễn cây thư mục (directory tree), mỗi phần tử gồm 2 thành
phần: tên thư mục, vị trí của thư mục cha trên danh sách này (số nguyên chỉ thứ tự thư mục
trong danh sách). Nếu là thư mục gốc thì giá trị thứ hai là 0. Anh (chị) hãy:
1) Viết dạng cài đặt của cây thư mục bởi danh sách kế tiếp như trên. Cho ví dụ và minh họa
bằng hình ảnh
2) Viết giải thuật đếm xem trên cây có tất cả bao nhiêu thư mục
3) Viết giải thuật xoá thư mục “Bai tap” và tất cả các thư mục con trong nó
4) Viết chương trình con hiển thị cây thư mục này ra màn hình.
Câu 3 (2 điểm)
Hãy dùng stack ở dạng liên kết đơn (cài đặt ngăn xếp bởi con trỏ) để đảo ngược vị trí của tất cả
các phần tử ở vị trí lẻ trong một DSLK đơn, có nút đầu danh sách được trỏ bởi con trỏ L; các
phần tử trong danh sách là các số nguyên
Câu 1
- Ngăn xếp 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ử ra khỏi ngăn xếp đều được thực hiện ở một đầu, đầu đó gọi là đỉnh của ngăn xếp (0.5
đ)
- Cấu trúc ngăn xếp thường được áp dụng cho những bài toán có trình tự truy xuất ngược với trình tự
lưu trữ. Ví dụ: (0.5 đ)
+ Bài toán chuyển đổi cơ số, tìm ước số chung của hai số nguyên, bài toán tính giá
trị biểu thức, ....
+ Thường áp dụng trong một số bài toán tìm đường đi trong lý thuyết đồ thị (lưu vết
đường đi)
+ làm môi trường lưu trữ các biến toàn cục và cục bộ của các thủ tục trong chương
trình dịch của ngôn ngữ lập trình.
.....
Câu 2
1
\users \BT\
2 3
Tin\ Toan\
4 5 6 7 8
Hình ảnh cây thư mục trong bộ nhớ MT với các cài đặt trên như sau:
BT1 Bt2 Bt3 BT1 BT2
Số thứ tự TenThuMuc Vitri
1 \users \BT\ 0
2 Tin\ 1
3 Toan\ 1
4 BT1 2
5 Bt2 2
6 Bt3 2
7 BT1 3
8 BT2 3
9 Nil 0
… …
n nil 0
2) Đếm số lượng các thư mục trên cây(1 đ)
b) Lặp đi lặp lại bước a) Cho đến khi xóa hết các thư mục con có vị trí là i
Duyệt danh sách từ đầu đến đêm, duyệt đến thư mục nào thì hiện thị tên và vị trí cha của thư
mục đó
Câu 3 (2 điểm)
+ Lần lượt tách các phần tử ở vị trí lẻ trong danh sách L, đưa vào trong ngăn xếp cho đến khi
duyệt hết danh sách
+ Lần lượt lấy từng phần tử trong ngăn xếp ra, gắn vào các vị trí lẻ trong danh sách L.
Đề 29
Câu 1(2 điểm)
Nêu khái niệm cây nhị phân (binary tree)? Các cách cài đặt? ưu nhược điểm của từng dạng cài
đặt?
Câu 2 (4 điểm)
Một ma trận chỉ chứa rất ít phần tử với giá trị có nghĩa (ví dụ: phần tử 0 được gọi là
phần tử có nghĩa) được gọi là ma trận thưa.
Ví dụ :
Hãy dùng cấu trúc danh sách liên kết để tổ chức biễu diễn một ma trận thưa sao cho tiết
kiệm bộ nhớ nhất (chỉ lưu trữ các phần tử có nghĩa).
a) Cấu trúc một nút trong danh sách có dạng như thế nào?
b) Viết dạng cài đặt của ma trận thưa đã cho bằng danh sách liên kết
Câu 2 (2 điểm)
Hãy dùng stack ở dạng liên kết đơn (cài đặt ngăn xếp bởi con trỏ) để đảo ngược vị trí của tất cả
các phần tử ở vị trí chẵn trong một DSLK đơn, có nút đầu danh sách được trỏ bởi con trỏ L; các
phần tử trong danh sách là các số nguyên
Câu 2
a) (1 đ) Ma trận sẽ thay bằng một danh sách liên kết đơn, danh sách này sẽ lưu các phần tử có nghĩa
của ma trận, mỗi phần tử trong ma trận được tổ chức dưới dạng một nút. Cấu trúc 1 nút trong danh sách
là một bản ghi gồm 4 trường có dạng:
Câu 3:
Cách làm tương tự câu 3 đề 28, tuy nhiên xét các phần tử ở vị trí chẵn thay vì xét các phần tử ỏ
vị trí lẻ
Đề 30
Câu 1(2 điểm)
Nêu khái niệm cây nhị phân (binary tree)? Các cách cài đặt? ưu nhược điểm của từng dạng cài
đặt?
Câu 2 (5 điểm)
Cho 3 danh sách móc nối đơn chứa các số nguyên, lần lượt có nút đầu tiên trong danh sách
được trỏ bởi L1, L2, L3. Anh (chị) hãy:
b) Viết các giải thuật tương ứng với các yêu cầu sau:
1. Ghép danh sách L2 vào danh sách L1 và cho con trỏ L trỏ tới nút
đầu danh sách tổng hợp
Câu 2 (1 điểm)
Hãy dùng stack ở dạng liên kết(cài đặt ngăn xếp bởi con trỏ) để đảo ngược vị trí của tất cả các
phần tử ở vị trí lẻ trong một DSLK đơn, có nút đầu danh sách được trỏ bởi con trỏ L; các phần
tử trong danh sách là các số nguyên
Câu 2:
b) Ghép L2 vào sau L1, L trỏ tới danh sách kết quả: (1 đ)
Kiểm tra xem danh sách L có rỗng hay không? Nếu rỗng trở về chương trình chính, nếu không
rỗng thực hiện loại bỏ như sau:
-
Sử dụng con trỏ phụ q duyệt tử đầu đến cuối danh sách, nếu q^.info =0 thì gọi thủ
tục loại bỏ phần tử được trỏ bởi q trong danh sách
-
Viết thủ tục loại bỏ phần tử được trỏ bởi con trỏ q trong danh sách L:
P:= L;
p^.next := q^.next;
dispose(q);
q:= p^.next;// lưu vị trí tiếp theo vị trí loại bỏ để còn loại bỏ tiếp
procedure Hienthi(l:list);
var i: integer;p: list;
begin
writeln(‘Danh sách cac so nguyen la:’);
p: =L;
while p<>nil do
begin
write(p^.info:6);
p:=p^.next;
end;
end;
Câu 3
Tương tự câu 3 đề 28