1. Trang chủ
  2. » Công Nghệ Thông Tin

Thực hành cấu trúc dữ liệu và giải thuật 6

26 31 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 26
Dung lượng 4,19 MB

Nội dung

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 1

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 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 2

2 | 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 3

DATA_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 4

2 | 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 5

TRƯỜ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 6

b) 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 7

b) 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 8

2 | 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 9

DATA_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 10

2 | 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 11

3 | 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 12

4 | 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 13

5 | 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 14

Cross-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 15

Ta 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 18

p->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)

Ngày đăng: 01/03/2022, 09:01

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w