b Đánh giá thời gian thực hiện tồi nhất của hàm sau theo O-lớn double fastPower double x, int n c So sánh ưu nhược điểm của phương pháp tổ chức tìm kiếm dùng mảng và áp dụng thuật toán
Trang 1b) Đánh giá thời gian thực hiện tồi nhất của hàm sau theo O-lớn
double fastPower( double x, int n)
c) So sánh ưu nhược điểm của phương pháp tổ chức tìm kiếm dùng mảng và áp dụng thuật toán tìm kiếm
nhị phân, cây nhị phân tìm kiếm và dùng bảng băm theo các tiêu chí sau
Tiêu chí Tìm kiếm nhị phân Cây nhị phân tìm kiếm Bảng băm
a) Biểu thức dạng hậu tố là gì? Ưu điểm của biểu thức dạng hậu tố?
b) Chuyển biểu thức dạng trung tố sau sang dạng hậu tố
𝑎 + 3/(2 ∗ 𝑎 − 𝑐 ∗ 𝑏) − 𝑒 c) Vẽ cây biểu thức biểu diễn cho biểu thức ở phần b (không cần phải trình bày các bước trung gian)
Mã đề
CD 2011 - 01
Trang 22 | P a g e
Bài 3
a) Cho cây nhị phân tìm kiếm ban đầu như hình
thêm lần lượt dãy khóa 43, 12, 36, 78, 29, 16, 9, 65, 27, 32 Hãy vẽ cây nhị phân kết quả thu được cuối cùng (không cần trình bày các bước trung gian)
b) Với cây nhị phân tìm kiếm thu được ở phần a, thực hiện xóa lần lượt khóa 18 và 36 Hãy vẽ cây kết quả thu được sau mỗi lần xóa
Chú ý: chọn nút thay thế là nút phải nhất trên cây con trái
Bài 4 Cho một đơn đồ thị vô hướng 𝐺(𝑉, 𝐸) như sau
𝑉 = {𝐴, 𝐵, 𝐶, 𝐷, 𝐸, 𝐹, 𝐺, 𝐻}
𝐸 = {(𝐴, 𝐵), (𝐴, 𝐶), (𝐴, 𝐸), (𝐵, 𝐸), (𝐵, 𝐺), (𝐶, 𝐷), (𝐶, 𝐵), (𝐷, 𝐸), (𝐹, 𝐷), (𝐹, 𝐸), (𝐹, 𝐺), (𝐻, 𝐵), (𝐻, 𝐺)} a) Hãy biểu diễn đồ thị trên dùng danh sách kề
b) Thực hiện DFS từ đỉnh D, hãy đưa ra thứ tự các đỉnh được thăm
c) Hãy đưa ra các loại cạnh thu được khi DFS tại đỉnh D (BackEdge, CrossEdge, TreeEdge và ForwardEdge) Lưu ý: Các đỉnh trên đồ thị được thăm theo thứ tự ABC
Bài 5 Để biểu diễn các tập hợp số nguyên ta dùng danh sách liên kết đơn với cấu trúc một phần tử được
khai báo như sau:
typedef struct Node
Trang 3DATA_TYPE data; //là kiểu dữ liệu lưu trữ tại nút
struct BNode * Lchild, *Rchild; //con trỏ tới cây con trái và con phải
}
Theo các tiêu chí:
• Bộ nhớ,
• thời gian truy cập một nút bất kỳ,
• tìm nút cha của một nút bất kỳ trên cây
b) Đánh giá thời gian thực hiện tồi nhất của hàm sau theo O-lớn
double fastPower( double x, int n)
if (n%2==0) return fract* fract;
else return fract*fract*x;
}
c) So sánh ưu nhược điểm của phương pháp tổ chức tìm kiếm dùng mảng và áp dụng thuật toán tìm kiếm
nhị phân, cây nhị phân tìm kiếm và dùng bảng băm theo các tiêu chí sau
Tiêu chí Tìm kiếm nhị phân Cây nhị phân tìm kiếm Bảng băm
Trang 42 | P a g e
Bài 2
a) Biểu thức dạng hậu tố là gì? Ưu điểm của biểu thức dạng hậu tố?
b) Định giá biểu thức dạng hậu tố sau (trình bày rõ các trạng thái trung gian của STACK
10 2 3 + / 2 ^ 4 12 8 − % + c) Vẽ cây biểu thức biểu diễn cho biểu thức ở phần b (không cần phải trình bày các bước trung gian)
Bài 3
a) Cho cây nhị phân tìm kiếm ban đầu như hình
thêm lần lượt dãy khóa 33, 43, 12, 36, 78, 29, 16, 9, 65, 27, 32 Hãy vẽ cây nhị phân
kết quả thu được cuối cùng (không cần trình bày các bước trung gian)
b) Với cây nhị phân tìm kiếm thu được ở phần a, thực hiện xóa lần lượt khóa 18
và 33 Hãy vẽ cây kết quả thu được sau mỗi lần xóa
Chú ý: chọn nút thay thế là nút phải nhất trên cây con trái
Bài 4 Cho một đơn đồ thị vô hướng 𝐺(𝑉, 𝐸) như sau
𝑉 = {𝐴, 𝐵, 𝐶, 𝐷, 𝐸, 𝐹, 𝐺, 𝐻}
𝐸 = {(𝐴, 𝐵), (𝐴, 𝐶), (𝐴, 𝐸), (𝐵, 𝐸), (𝐵, 𝐺), (𝐶, 𝐷), (𝐶, 𝐵), (𝐷, 𝐸), (𝐹, 𝐷), (𝐹, 𝐸), (𝐹, 𝐺), (𝐻, 𝐵), (𝐻, 𝐺)} a) Hãy biểu diễn đồ thị trên dùng danh sách kề
b) Thực hiện BFS từ đỉnh B, hãy đưa ra thứ tự các đỉnh được thăm
c) Hãy đưa ra các loại cạnh thu được khi BFS tại đỉnh B (BackEdge, CrossEdge, TreeEdge và ForwardEdge) Lưu ý: Các đỉnh trên đồ thị được thăm theo thứ tự ABC
Bài 5 Để biểu diễn các tập hợp số nguyên ta dùng danh sách liên kết đơn với cấu trúc một phần tử được
khai báo như sau:
typedef struct Node
Trang 5TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
BỘ MÔN KHOA HỌC MÁY TÍNH
Bài 1 Cho hàm khai báo như sau (tham số 𝑎, 𝑏 là các số nguyên không âm)
long mistery( int a, int b) {
if (a==0) return 0;
if (a%2==0) return 2*mistery(a/2,b);
return b+2*mistery((a-1)/2,b);
}
a Hàm sau thực hiện công việc gì? Tính giá trị của hàm với a=5 và b=7
b Đánh giá độ phức tạp của hàm mistery theo O-lớn
Bài 2 Cho cây biểu thức sau
a Duyệt cây biểu thức để đưa ra biểu thức dạng tiền tố, hậu tố
b Với a=36 và b=5, hãy minh họa thuật toán định giá biểu thức hậu tố
trên biểu thức hậu tố thu được từ phần a
Chú ý: √ là ký hiệu của toán tử căn bậc hai
Bài 3 Cây nhị phân tìm kiếm
a) Thêm lần lượt các nút 25, 32, 14, 21, 19, 17, 23, 5, 9 vào cây nhị
phân tìm kiếm ban đầu rỗng, vẽ cây kết quả thu được
b) Với cây kết quả trong phần b ta xóa nút 1, hãy vẽ cây kết quả thu được
Thay bằng nút trái nhất trên con phải
c) Cho cấu trúc một nút trên cây được khai báo như sau
Hãy hoàn thiện hàm tìm và trả về số lượng nút có giá trị nhỏ hơn hoặc bằng x trên cây
int *CountNodes( struct BinaryNode *root, double x)
struct BinaryNode {
Trang 6b) Giả sử chúng ta có một danh sách gồm 100 phần tử kiểu double được lưu trữ trong mảng, và cần
phải thực hiện sắp xếp Khi đó ta nên chọn thuật toán sắp xếp nào trong các thuật toán đã học để
thu được hiệu quả tốt nhất? Giải thích lý do?
Nếu số lượng phần tử là 1 000 000 và được lưu trữ dùng danh sách liên kết đơn thì nên dùng thuật
toán nào? Giải thích lý do?
c) Giả sử chúng ta cần quản lý một danh sách khách hàng có tối đa 1000 người (không biết trước số
lượng) và cần thực hiện tìm kiếm theo họ tên Hãy mô tả phương pháp của bạn để:
Thực hiện việc tìm kiếm khách hàng một cách nhanh nhất
Thực hiện lưu trữ và tìm kiếm tiết kiệm bộ nhớ nhất có thể
Hãy giải thích?
d) Giả sử chúng ta có một danh sách các số nguyên gồm 1 000 000 số Hãy đưa ra một thuật toán hiệu
quả để thống kê các số trùng nhau trong danh sách
Đánh giá thời gian thực hiện của thuật toán của bạn theo
O lớn
Bài 5 Cho đồ thị vô hướng như hình bên
a) Minh họa cách lưu trữ đồ thị trên sử dụng ma
Figure 2 Đồ thị G (V, E)
Trang 7b) Cho một cây nhị phân tìm kiếm có khóa là các số nguyên, và
một giá trị k, Hãy viết hàm tìm và in ra tất cả các cặp phần
tử (a, b) trên cây sao cho 𝑎 + 𝑏 ≤ 𝑘
c) So sánh thời gian thêm và tìm kiếm của các cấu trúc dữ liệu
sau: Bảng băm, mảng, danh sách liên kết, hàng đợi
Bài 2 Cho hai văn bản A và B đã được tách từ, gọi số lượng từ
phân biệt của văn bản A là n, và của văn bản B là m
(𝑛 ≤ 𝑚) Hãy đưa ra thuật toán tìm tập từ chung của hai
văn bản theo tiêu chí
a) Thời gian thực hiện nhanh nhất
b) Bộ nhớ phụ tốn ít nhất
Trong cả hai trường hợp, hãy chỉ rõ thời gian thực hiện theo O-lớn và bộ nhớ phụ cần sử dụng
Bài 3 Cho một từ điển tiếng anh gồm n từ, và một danh sách ký tự phân biệt độ dài m (𝑚 ≪ 𝑛) Hãy xây
dựng thuật toán tìm và đưa ra từ dài nhất trong từ điển được tạo từ các ký tự trong danh sách
Thời gian của thuật toán cần là 𝑂(𝑛)
Bài 4 Cho một danh sách số nguyên dương gồm n phần tử (𝑛 ≈ 1 𝑡ỷ) và một số nguyên dương k(𝑘 ≪ 𝑛),
Hãy đưa ra thuật toán đếm số cặp trong danh sách ban đầu có tổng < 𝑘 với thời gian thực hiện nhỏ hơn 𝑂(𝑛 log 𝑛)
Bài 5 Cho một luồng các ký tự liên tục, hãy xây dựng thuật toán đưa ra danh sách ký tự không được lặp
trong luồng ký tự đó (giả sử rằng tồn tại ít nhất một ký tự như vậy)
Chú ý: với luồng ta chỉ có thể duyệt các ký tự 1 lần và theo 1 chiều
Trang 82 | P a g e
Bài 6 Cho danh sách thông tin của n cuộc họp với thời điểm bắt đầu và thời điểm kết thúc Hãy đưa ra thuật
toán sắp xếp các cuộc họp này vào các phòng sao cho số lượng phòng được sử dụng là nhỏ nhất có thể
Độ phức tạp của thuật toán bạn đề xuất là bao nhiêu?
Bài 7 Trong một trình duyệt cần lưu trữ các URL đã được thăm theo tần số truy cập giảm dần
Hãy xây dựng CTDL lưu trữ các URL hỗ trợ các thao tác
Thêm/xóa
Tìm kiếm
Với thời gian 𝑂(log 𝑛), liệu có thể lưu trữ để hực hiện các thao tác trên với thời gian 𝑂(1)?
Bài 8 Cho 2 Queue thông thường, hãy xây dựng thuật toán sắp xếp chỉ dung 2 queue đó (không sử dụng
thêm bộ nhớ phụ) để sắp xếp danh sách gồm n phần tử số nguyên
Các thao tác được dùng chỉ là enqueue và
dequeue
Bài 9 Cho m mảng số nguyên với số lượng
phần tử mỗi mảng là n, các phần tử trong
mỗi mảng đều đã được sắp xếp Hãy xây
dựng thuật toán để tìm khoảng nhỏ nhất sao
Gợi ý: Dùng priority queue
Bài 10 Cho đồ thị sau
a) Thực hiện DFS tại E
b) Đưa ra phân loại cạnh theo thứ tự duyệt ở phần a
Thứ tự thăm theo ABC
Chú ý: Những bài yêu cầu viết hàm mới phải viết code cho hàm, các bài xây dựng thuật toán chỉ cần nêu
ý tưởng (và ví dụ minh họa cho ý tưởng)
A B
H
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trang 9DATA_TYPE data; //là kiểu dữ liệu lưu trữ tại nút
struct BNode * Lchild, *Rchild; //con trỏ tới cây con trái và con phải }
Theo các tiêu chí:
• Bộ nhớ,
• thời gian truy cập một nút bất kỳ,
• tìm nút cha của một nút bất kỳ trên cây
Biểu diễn cây nhị phân dùng mảng: dùng mảng có số lượng phần tử bằng số lượng nút trên cây nhị phân đầy đủ chiều
cao ℎ (số lượng phần tử của mảng sẽ là 2ℎ+1− 1 phần tử)
Với nút thứ 𝑖 (𝑖 ≥ 0) thì nút con của nó sẽ là 2𝑖 + 1 và 2𝑖 + 2, nút cha của nó sẽ là �𝑖−12 �
Biểu diễn cây nhị phân dùng cấu trúc liên kết: mỗi nút có thêm hai con trỏ là con trỏ tới cây con trái và con trỏ tới cây
con phải
Tiêu chí Biểu diễn dùng mảng Biểu diễn dùng cấu trúc liên kết
Bộ nhớ Biểu diễn 1 phần tử: không cần sử dụng thêm
bộ nhớ phụ
Biểu diễn cho cả cây: luôn cần bộ nhớ
2ℎ+1− 1 cho cây nhị pahan bất kỳ chiều cao
ℎ, nên sẽ rất lãng phí bộ nhớ nếu cây nhị phân
đó không phải là cây gần hoàn chỉnh
Biểu diễn 1 phần tử: Cần thêm bộ nhớ phụ lưu trữ
con trỏ tới cây con trái và cây con phải
Biểu diễn cho cả cây: Cây có bao nhiêu nút thì cấp
phát động bấy nhiêu bộ nhớ Tiết kiệm bộ nhớ hơn nếu dùng biểu diễn cho cây nhị phân bất kỳ Thời gian
truy cập 1
nút bất kỳ
𝑂(1)
Cấu trúc liên kết không hỗ trợ truy cập ngẫu nhiên,
ta phải truy cập thông qua các nút tổ tiên của nút
đó Tìm nút cha
của một nút
bất kỳ
Thời gian là 𝑂(1) Thời gian trung bình cỡ 𝑂(𝑛), vì ta phải duyệt từ
gốc để tìm tới nút cha của nút đó
Mã đề
CD 2011 - 02
Trang 102 | P a g e
b) Đánh giá thời gian thực hiện tồi nhất của hàm sau theo O-lớn (1 điểm)
double fastPower( double x, int n) {
double fract;
if (n==0) return 1;
fract = fastPower(x,n/2);
if (n%2==0) return fract* fract;
else return fract*fract*x;
} Hàm trên được cài đặt đệ quy, lời gọi đệ quy là fract = fastPower(x,n/2);
Được gọi 1 lần trong hàm, ta có công thức đệ quy tổng quát là
𝑇(𝑛) = � 𝑇�𝑛 2 � � + 1 𝑛ế𝑢 𝑛 > 01 𝑛ế𝑢 𝑛 = 0
Ta có thể viết gọn lại là 𝑇(𝑛) = 𝑇 �𝑛2� + 1
Áp dụng định l ý thợ với 𝑎 = 1, 𝑏 = 2 và 𝑓(𝑛) = 1
𝑛log𝑏𝑎= 𝑛log21 = 1 trường hợp 2 của định l ý thợ
Vậy kết luận 𝑇(𝑛) = 𝜃(log 𝑛)
c) So sánh ưu nhược điểm của phương pháp tổ chức tìm kiếm dùng mảng và áp dụng thuật toán tìm kiếm nhị phân, cây nhị phân tìm kiếm và dùng bảng băm theo các tiêu chí sau (1 Điểm)
Bộ nhớ dùng lưu
trữ các phần tử 𝑂(𝑛)
Tỉ lệ với số phần tử, tuy nhiên mỗi phần tử không phải lưu trữ thêm dữ liệu thừa
nếu muốn in ta phải duyệt toàn bộ bảng băm
Bài 2
a) Biểu thức dạng hậu tố là gì? Ưu điểm của biểu thức dạng hậu tố? (1 Điểm)
Biểu thức dạng hậu tố: Là cách biểu diễn biểu thức trong đó toàn tử đứng sau các toán hạng mà nó tác động
Ví dụ: 3 5 + a –
Ưu điểm của biểu thức dạng hậu tố là chỉ có một cách định giá (cách tính) duy nhất Không như biểu thức dạng trung tố
cần quy định thêm về độ ưu tiên của toán tử, và dấu ngoặc
Biểu thức dạng hậu tố được dùng để biểu diễn biểu thức trong máy tính
b) Định giá biểu thức dạng hậu tố sau (trình bày rõ các trạng thái trung gian của STACK (1 Điểm)
Trang 113 | P a g e
10 2 3 + / 2 ^ 4 12 8 − % +
a) Cho cây nhị phân tìm kiếm ban đầu như hình
thêm lần lượt dãy khóa 33, 43, 12, 36, 78, 29, 16, 9, 65, 27, 32 Hãy vẽ cây nhị phân kết
quả thu được cuối cùng (không cần trình bày các bước trung gian)
(1 Điểm)
Trang 124 | P a g e
b) Với cây nhị phân tìm kiếm thu được ở phần a, thực hiện xóa lần lượt khóa 18 và 33
Hãy vẽ cây kết quả thu được sau mỗi lần xóa
Chú ý: chọn nút thay thế là nút phải nhất trên cây con trái
(1 Điểm)
Bài 4 Cho một đơn đồ thị vô hướng 𝐺(𝑉, 𝐸) như sau
𝑉 = {𝐴, 𝐵, 𝐶, 𝐷, 𝐸, 𝐹, 𝐺, 𝐻}
𝐸 = {(𝐴, 𝐵), (𝐴, 𝐶), (𝐴, 𝐸), (𝐵, 𝐸), (𝐵, 𝐺), (𝐶, 𝐷), (𝐶, 𝐵), (𝐷, 𝐸), (𝐹, 𝐷), (𝐹, 𝐸), (𝐹, 𝐺), (𝐻, 𝐵), (𝐻, 𝐺)} a) Hãy biểu diễn đồ thị trên dùng danh sách kề (1 Điểm)
Trang 135 | P a g e
b) Thực hiện BFS từ đỉnh B, hãy đưa ra thứ tự các đỉnh được thăm (1 Điểm)
(Chỉ cần vẽ được hình trạng hàng đợi hoặc cây khung BFS là được đủ điểm)
Trang 14Cross-Edge AC, AE, ED, GF, GH, DF
Bài 5 Để biểu diễn các tập hợp số nguyên ta dùng danh sách liên kết đơn với cấu trúc một phần tử được
khai báo như sau:
typedef struct Node
b) Hãy đánh giá thời gian thực hiện trong trường hợp tồi nhất của hàm bạn viết theo O-lớn (0.5 điểm)
int FindMax (NODE *pHead)
pos = i;
} ptr = ptr->pNext;
Trang 15Ta thấy điều này không xảy ra vì c là hằng số nên
Liệu ta có cần tăng độ phức tạp của tiệm cận lên là ?
Ta thấy giữa vế trái và vế phải của bất đẳng thức chỉ sai khác nhau một hằng số (là 1) Vì vậy thay vì giả
sử ta giả sử ta giả sử với là hằng số dương nào đó
Trang 17Đây là một dạng của chuối số Harmonic (http://en.wikipedia.org/wiki/Harmonic_number)
(Hằng số Euler-Mascheroni)
Một số công thức hay dùng
Với , và Nếu
Source code danh sách liên kết đơn
#include <stdlib.h>
#include <stdio.h>
typedefint DATA_TYPE; //dat DATA_TYPE la kieu int
typedefstruct list {
DATA_TYPE item; /* data item */
struct list *pNext; /* point to successor */
} LIST;
void insert_list(LIST *&l, DATA_TYPE x)
{
LIST *p; /* temporary pointer */
p = (LIST*)malloc( sizeof (LIST) );
Trang 18p->item = x;
p->pNext = l;
l = p;
}
//ham chen phan tu moi vao cuoi danh sach
void insert_last(LIST *&l, DATA_TYPE x)
{
LIST *p,*ptr; /* temporary pointer */
p = (LIST*)malloc( sizeof (LIST) );
//tra ve phan tu truoc phan tu can xoa
LIST *predecessor_list(LIST *l, DATA_TYPE x)
{
if ((l == NULL) || (l->pNext == NULL)) {
printf( "Error: Danh sach rong hoac co 1 phan tu.\n" ); return (NULL);
LIST *p; /* item pointer */
LIST *pred; /* predecessor pointer */
p = search_list(l, x);
if (p != NULL) {
Trang 19//Ham dung de in danh sach
void display(LIST *Head)
//Ham dung de them cac phan tu vao cuoi day
void input_list(LIST *&Head)
Trang 20ĐỀ THI: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
(Thời gian 90’)
Mã đề CDK54-2010-01 Sinh viên được sử dụng tài liệu
b) Đánh giá thời gian thực hiện của thuật toán đệ quy sau theo mô hình O-lớn
Cho ma trận A kích thước 𝑛 × 𝑚, ma trận B kích thước 𝑚 × 𝑙
for (i = 0; i < n; i++)
for ( k = 0; k < m; k++)
for ( j = 0; j < l; j++)
C[i][j] += A[i][k] * B[k][j];
Hãy đánh giá độ phức tạp của đoạn chương trình trên theo O-lớn
Lệnh cơ sở là lệnh C[i][j] += A[i][k] * B[k][j];
Có 3 vòng lặp lồng nhau, thời gian thực hiện
𝑇(𝑛) = � � � 1
𝑙−1 𝑗=0
𝑚−1 𝑘=0
𝑛−1 𝑖=0
= � � (𝑙 − 1 + 1)
𝑚−1 𝑘=0
𝑛−1 𝑖=0
= = 𝑛 × 𝑚 × 𝑙 Vậy độ phức tạp cỡ 𝑂(𝑛 × 𝑚 × 𝑙)
Bài 2 Trả lời các câu hỏi sau
a) Trong các phương pháp sắp xếp: lựa chọn, chèn, đổi chỗ(nổi bọt), quicksort (sắp xếp nhanh), mergesort (sắp xếp trộn), thì phương pháp nào là phù hợp nhất để sắp xếp trên danh sách liên kết đơn? Giải thích lựa chọn của bạn
Các thuật toán trên được chia thành 2 loại là cơ bản (𝑂(𝑛2)) và nâng cao (𝑂(𝑛 log 𝑛))
Sắp xếp trên danh sách liên kết đơn thì mergesort là phù hợp hơn vì :
• Thời gian trung bình trong trường hợp tồi nhất cỡ 𝑂(𝑛 log 𝑛)
• Cài đặt đơn giản hơn QuickSort
b) Danh sách tên của 1000 sinh viên được lưu trữ trong mảng nhưng không theo 1 thứ tự nào.Hãy nêu những ưu điểm và nhược điểm của phương pháp lưu trữ này
(các tiêu chí đánh giá: bộ nhớ, thời gian tìm kiếm, thêm, xóa)