1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tiểu luận ngành khoa học máy tính thiết kế và phân tích thuật toán

36 0 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

Tiêu đề Tiểu Luận Thiết Kế Và Phân Tích Thuật Toán
Tác giả Cao Chí Hiển
Người hướng dẫn TS: Hoàng Quang
Trường học Trường Đại Học Khoa Học Huế
Chuyên ngành Khoa Học Máy Tính
Thể loại tiểu luận
Năm xuất bản 2019
Thành phố Gia Lai
Định dạng
Số trang 36
Dung lượng 1,99 MB

Nội dung

34 Trang 3 LỜI NÓI ĐẦU Việc xác định độ phức tạp tính toán của một thuật toán là một công việc không hề đơn giản, trước đây chúng ta ít quan tâm đến việc đánh giá thuật toán mà chỉ dừn

Trang 1

TRƯỜNG ĐẠI HỌC KHOA HỌC HUẾ KHOA CÔNG NGHỆ THÔNG TIN

BÀI TẬP - TIỂU LUẬN THIẾT KẾ VÀ PHÂN TÍCH THUẬT TOÁN

LỚP CAO HỌC: NGÀNH KHOA HỌC MÁY TÍNH

Trang 2

MỤC LỤC

LỜI NÓI ĐẦU 1

PHẦN I: NỘI DUNG 2

I: ĐỘ PHỨC TẬP THUẬT TOÁN 2

1 Độ phức tạp thuật toán: 2

2: Bài tập: 3

Bài 1: So sánh độ phức tập thuật toán O ( N ) O(log2n) 3

Bài 2: Viết hàm tính an (với a real, n word) có độ phức tạp tính toán là O(1) 3

II PHƯƠNG PHÁP ĐỆ QUY 5

1 Tim hiểu đệ quy 5

2 Bài tập Đệ quy trên kiểu dữ liệu mảng 6

Bài 3: Xóa tất cả các phần tử của dãy A gồm n phần tử có giá trị là X 6

Bài 4 Viết chương trình tìm Max của dạy A gồm n phần tử (n>0) 7

3 Bài tập Đệ quy trên kiểu dữ liệu danh sách liên kết đơn 9

Bài 5: Xóa tất cả các nút có trường Info là giá trị x 9

Bài 6: Tìm Max của trường Info trong danh sách liên kết đơn 9

4 Bài tập Đệ quy trên kiểu dữ liệu cây nhi phân 12

Bài 7 Viết hàm đếm số nút của cây có trường Info = x 13

Bài 8 Viết thủ tục đệ quy bổ sung 1 nút lá vào cây tìm kiếm nhị phân 13

Cây tìm kiếm nhị phân: 13

III PHƯƠNG PHÁP QUY HOẠCH ĐỘNG 1 Cơ sở lý thuyết 17

a) Tư tưởng của phương pháp: 17

b) Phạm vi áp dụng: 17

c) Nguyên lý của phương pháp: 17

2 Phương pháp thực hiện 17

3 Giải bài toán bằng phương pháp Quy hoạch động: (gồm 4 bước) 17

4 Một số bài toán Giải bằng phương pháp Quy hoạch động 17

Bài 9 Bài toán cái túi nguyên (Số lượng các loại đổ vật không hạn chế) 17

Bài 10 Bài toán Sinh viên ôn thi 21

Bài 11 Người đi du lịch 25

Bài 12: Bài toán xâu trong cực đại: 30

TÀI LIỆU THAM KHẢO 34

Tiểu luận tài chính

Trang 3

LỜI NÓI ĐẦU

Việc xác định độ phức tạp tính toán của một thuật toán là một công việc không hề đơn giản, trước đây chúng ta ít quan tâm đến việc đánh giá thuật toán mà chỉ dừng lại ở mức độ đưa ra một thuật toán để giải quyết bài toán Tuy nhiên một bài toán có thể có nhiều thuật toán để giải Do đó ta phải lựa chọn thuật đoán tối

ưu Độ phức tạp thuật toán là cơ sở để đánh giá thuật toán đó có tốt hơn thuật toán khác hay không Đối với những thuật toán phức tạp thì việc xác định độ phức tạp một cách chính xác là rất khó khăn đặc biệt đối với những thuật toán sử dụng giải thuật đệ qui

Trong phần náy, nhóm tôi đánh giá độ phức tạp của một số thuật toán Đưa

ra một số bài toán giải hệ thức truy hồi:

- Dùng phương pháp Đệ quy để giải các bài toán trên nhiều kiểu dữ liệu như: Kiểu dữ liệu cơ bản, kiểu mảng, danh sách liên kết đơn, cây nhị phân và cây tìm kiếm nhị phân

- Dùng phương pháp Quy hoạch động để giải một số bài toán tối ưu

Đây là nội dung chính trong đề tài bài tập tiểu luận của nhóm em: THIẾT

KẾ VÀ PHÂN TÍCH THUẬT TOÁN

Mặc dù đã rất cố gắng nhưng tiểu luận này không tránh khỏi những sai sót Nhóm chúng em rất mong nhận được các ý kiến góp ý của thầy hướng dẫn và các bạn

Xin chân thành cảm ơn TS HOÀNG QUANG đã tận tình hướng dẫn và tạo

điều kiện cho chúng em hoàn thành môn học này

Gia Lai, ngày 10 tháng 01 năm 2019

Học viên thực hiện

Cao Chí Hiển

Tiểu luận tài chính

Trang 4

PHẦN I: NỘI DUNG I: ĐỘ PHỨC TẬP THUẬT TOÁN

1 Độ phức tạp thuật toán:

Thời gian mà máy tính khi thực hiện một thuật toán không chỉ phụ thuộc vào bản thân thuật toán đó, ngoài ra còn tùy thuộc từng máy tính Để đánh giá hiệu quả của một thuật toán, có thể xét số các phép tính phải thực hiện khi thực hiện thuật toán này Thông thường số các phép tính được thực hiện phụ thuộc vào cỡ của bài toán, tức là độ lớn của đầu vào Vì thế độ phức tạp thuật toán là một hàm phụ thuộc đầu vào Tuy nhiên trong những ứng dụng thực tiễn, chúng ta không cần biết chính xác hàm này mà chỉ cần biết một ước lượng đủ tốt của chúng

Để ước lượng độ phức tạp của một thuật toán ta thường dùng khái niệm bậc

O-lớn

Bậc O-lớn: Gọi n là độ lớn đầu vào Tùy thuộc từng bài toán mà n có thể

nhận những giá trị khác nhau Chẳng hạn, bài toán tính giai thừa thì n chính là số cần tính giai thừa Nhiều bài toán số trị, chẳng hạn tính sai phân thì n là số chữ số

có nghĩa cần đạt được Trong các phép tính đối với ma trận thì n là số hàng hoặc cột của ma trận

Độ phức tạp của bài toán phụ thuộc vào n Ở đây ta không chỉ đặc trưng độ phức tạp bởi số lượng phép tính, mà dùng một đại lượng tổng quát là tài nguyên cần dùng R(n) Đó có thể là số lượng phép tính (có thể tính cả số lần truy nhập bộ nhớ, hoặc ghi vào bộ nhớ); nhưng cũng có thể là thời gian thực hiện chương trình (độ phức tạp về thời gian) hoặc dung lượng bộ nhớ cần phải cấp để chạy chương trình (độ phức tạp về không gian)

Xét quan hệ giữa tài nguyên và độ lớn đầu vào, nếu như tìm được hằng số C>0, không phụ thuộc vào n, sao cho với n đủ lớn, các hàm R(n),g(n) đều dương

và R(n) ≤ C.g(n) thì ta nói thuật toán có độ phức tạp cỡ O(g(n))

Các độ phức tạp thường gặp đối với các thuật toán thông thường gồm có:

Độ phức tạp hằng số, O(1) Số phép tính/thời gian chạy/dung lượng bộ nhớ không phụ thuộc vào độ lớn đầu vào Chẳng hạn như các thao tác hệ thống: đóng,

mở Tập tin

Tiểu luận tài chính

Trang 5

Độ phức tạp tuyến tính, O(n) Số phép tính/thời gian chạy/dung lượng bộ nhớ có xu hướng tỉ lệ thuận với độ lớn đầu vào Chẳng hạn như tính tổng các phần

) Trường hợp này bất lợi nhất và sẽ rất phi thực

tế nếu thực hiện thuật toán với độ phức tạp này

Bài 2: Viết hàm tính an (với a  real, n  word) có độ phức tạp tính toán là O(1)

1 Phân tích thuật toán

Trang 6

if a=0 then LuyThua:=0

else if a>0 then LuyThua:=Exp(n*ln(a))

Trang 7

II PHƯƠNG PHÁP ĐỆ QUY

1 Tim hiểu đệ quy

Đệ quy (tiếng Anh: recursion) là phương pháp dùng trong các chương trình máy tính trong đó có một hàm tự gọi chính nó

Định nghĩa theo đệ quy: Một khái niệm X được định nghĩa theo đệ quy nếu

trong định nghĩa X có sử dụng ngay chính khái niệm X

Ví dụ 1: Định nghĩa số tự nhiên

- 0 là một số tự nhiên

- n là số tự nhiên nếu n - 1 là số tự nhiên

Đệ quy trong khoa học máy tính: Có một phương pháp chung để giải các bài toán là

chia bài toán thành các bài toán con đơn giản hơn cùng loại Phương pháp này được gọi là k thuật lập trình chia để trị Chính nó là chìa khóa để thiết kế nhiều giải thuật quan trọng, là cơ sở của quy hoạch động

Chương trình con đệ quy: Trong lập trình, có khái niệm: một chương trình con

(hàm, thủ tục) được gọi là đệ quy nếu trong quá trình thực hiện nó có phần phải gọi đến chính

Cấu trúc chính: Một chương trình con đệ quy căn bản gồm hai phần

Phần cơ sở: chứa các tác động của hàm hoặc thủ tục với một số giá trị cụ thể ban đầu của tham

số

Phần đệ quy: định nghĩa tác động cần được thực hiện cho giá trị hiện thời của các tham số bằng

các tác động đã được định nghĩa trước đây với kích thước tham số nhỏ hơn

Ví dụ: Hàm tính giai thừa của một số tự nhiên n (Đoạn mã sau được viết bằng ngôn ngữ Pascal)

function gt(n: Word): Longint;

Trang 8

2 Bài tập Đệ quy trên kiểu dữ liệu mảng

Bài 3: Xóa tất cả các phần tử của dãy A gồm n phần tử có giá trị là X

1 Thủ tục:

Procedure DeletePT(var n: word; x: integer);

var tam: integer;

begin

if n > 0 then

if A[n] = x then

begin

n := n - 1; {Xoa 1 phan tu tim thay}

DeletePT(n, x); {Tiep tuc tim va xoa neu co} end

Procedure DeletePT(var n: word; x: integer);

var tam: integer;

begin

if n > 0 then

if A[n] = x then

begin

n := n - 1; {Xoa 1 phan tu tim thay}

DeletePT(n, x); {Tiep tuc tim va xoa neu co} end

Trang 9

Writeln('Xoa phan tu co gia tri: X= ', x);

Writeln('So luong PT con lai: N= ', N);

Trang 11

3 Bài tập Đệ quy trên kiểu dữ liệu danh sách liên kết đơn

Bài 5: Xóa tất cả các nút có trường Info là giá trị x

Procedure GhiMax(P: TroNode);

var fo: text;

Begin

Tiểu luận tài chính

Trang 12

3 Cài đặt chương trình Bài 5 và Bài 6

{Một số thủ tục hàm xử lý danh sách liên kết đơn bằng phương pháp đệ quy}

fi, fo: text;

Procedure Init(Var P: TroNode);

Trang 14

Procedure GhiDS(P: TroNode);

Procedure GhiMax(P: TroNode);

var fo: text;

4 Bài tập Đệ quy trên kiểu dữ liệu cây nhi phân

Cho khai báo cây nhị phân T như sau:

Type TreeB = ^Node;

Node = Record

Info: Integer;

Left,Right: TroNode;

End;

Var T: TreeB;{ Cây nhị phân T}

Tiểu luận tài chính

Trang 15

Bài 7 Viết hàm đếm số nút của cây có trường Info = x

{Dem so Nut cu truong Info la X}

Function DemNut(T: treeB; x: integer): integer;

Bài 8 Viết thủ tục đệ quy bổ sung 1 nút lá vào cây tìm kiếm nhị phân

Cây tìm kiếm nhị phân:

Là một dạng cây nhi phân được tổ chức theo một trật tự nào đó của các nút để thuận lợi cho việc tìm kiếm Giả sử dữ liệu tại một nút của cây có thành phần Info là khóa của các phần tử

và trên cây các nút không có 2 phần tử trùng khóa Khái niệm cây tìm kiếm nhị phân được định nghĩa như sau:

Cây tìm kiếm nhị phân là một cây nhi phân mà tại mỗi cây con của nó thỏa điều kiện: Khóa của nút gốc lớn hơn khóa của tất cả các nút của cây con bên trái và nhỏ hơn khóa của tất cả các nút của cây con bên phải

1 Thuật toán đệ quy thêm một nút vào cây tìm kiếm nhị phấn

Nếu cây rỗng thì x là nút gốc của cây, thuật toán dừng

Nếu khóa của nút gốc bằng khóa của x thì thuật toán dừng (nút đã có)

Nếu khóa của nút gốc lớn hơn khóa của x thì thêm x vào cây con trái

Nếu khóa của nút gốc nhở hơn khóa của x thì thêm x vào cây con phải

2 Thủ tục Bổ sung 1 nút vào BST

//Them 1 nut vao cay BST sao cho cay van la BST}

procedure addnut(var t:treeB; x:integer);

Trang 16

Cài đặt chương trình cây nhị phân: Một số thủ tục duyệt cây nhị phân

//Them 1 nut vao cay BST sao cho cay van la BST}

procedure addnut(var t:treeB; x:integer);

Trang 17

if (t^.left = nil ) and (t^.right = nil) then

DemNutLa := 1 + DemNutLa(T^.left) + DemNutLa(T^.right) else

DemNutLa := DemNutLa(T^.left) + DemNutLa(T^.right)

end;

{Dem so Nut cu truong Info la X}

Function DemNut(T: treeB; x: integer): integer;

write('Nhap phan tu can tim: x= '); readln(x);

writeln('So luong pt x:', DemNut(T,x));

Tiểu luận tài chính

Trang 18

writeln('So luong nut la =', demNutLa(T));

writeln;

readln;

END

Dữ lieu tập tin được đưa vào:

Phần tử cuối cùng có giá trị 30 không được bổ sung vì đã tồn tại rồi

// input: file tree.inp co noi dung nhu sau: //

// 15 9 25 7 12 20 30 17 16 27 28 37 (gom 12 nut) //

// voi du lieu tren, su dung thuat toan tao cay BST //

// thi hinh dang cay se duoc tao ra nhu sau: //

// //

// 15 //

// / \ //

// 9 25 //

// / \ / \ //

// 7 12 20 30 //

// / / \ //

// / / \ //

// 17 27 37 //

// / \ //

// 16 28 //

Tiểu luận tài chính

Trang 19

III PHƯƠNG PHÁP QUY HOẠCH ĐỘNG

1 Cơ sở lý thuyết

a) Tư tưởng của phương pháp:

- Sử dụng nguyên lý chia để trị (tránh tính toán lại các bài toán con đã xét)

- Cách tiếp cận từ dưới lên

b) Phạm vi áp dụng:

- Các bài toán có được bằng việc tổng hợp các nghiệm của các bài toán con

- Các bài toán tối ưu rời rạc

c) Nguyên lý của phương pháp:

Vận dụng nguyên lý tối ưu của Bellman: “Trong một dãy tối ưu của các lựa chọn thì một dãy con của nó cũng là tối ưu”

2 Phương pháp thực hiện

o Phân tích bài toán (biểu diễn bài toán dưới dạng một bài toán nhiều mức)

o Xây dựng giải pháp đệ quy (lập công thức truy hồi)

o Lập bảng (sử dụng các mảng để tính toán các giá trị theo kiểu dưới-lên)

o Tổng hợp kết quả (kiến tạo một lời giải cho bài toán từ các thông tin đã tính toán)

3 Giải bài toán bằng phương pháp Quy hoạch động: (gồm 4 bước)

Bước 1: Phân tích bài toán

Bước 2: Giải pháp đệ quy

Bước 3: Lập bảng tính toán

Bước 4: Tổng hợp kết quả

Đánh giá độ phức tạp tính toán

4 Một số bài toán Giải bằng phương pháp Quy hoạch động

Bài 9 Bài toán cái túi nguyên (Số lượng các loại đổ vật không hạn chế)

Có n loại đồ vật có kích thước và giá trị khác nhau c[i]R;m[i]N* tương

ứng là giá trị và kích thước của loại đồ vật thứ i; số lượng mỗi loại không hạn chế Một tên trộm mang theo một chiếc túi có kích thước là pN* Vậy hắn phải

lựa chọn mỗi loại đồ vật lấy số lượng bao nhiêu để giá trị lấy cắp được là lớn nhất

Tiểu luận tài chính

Trang 20

1 Xác định bài toán

Input: n, p N*; c[i]R; m[i]N*; i=1 n

Output: x[i]: Số lượng loại đồ vật thứ i cần lấy sao cho

1

[i] m[ ]

n i

Sử dụng phương pháp quy hoạch động theo 4 bước sau:

Bước 1: Phân tích bài toán:

Gọi P(r,s) là bài toán cái túi trong đó: r là kích thước túi, s là số loại đồ vật Các giá trị cần tìm: U[r,s] là số lượng loại đồ vật thứ s cần lấy sao cho L[r,s]

là giá trị cực đại của bài toán P(r,s). Bài toán ban đầu P(p,n)

Trang 21

u[r,1]:= r div m[1];

l[r,1]:=u[r,1] * c[1];

end else Tinh_UL(r,s);

end;

Tiểu luận tài chính

Trang 22

Writeln(f,'Gia tri toi uu: ',L[p,n]);

Writeln(f,'Cac vat duoc chon:');

for i:=1 to n do writeln(f,'Vat thu ',i,' so luong ',x[i]); close(f);

Trang 23

Bộ test 2

Bộ test 3

Bài 10 Bài toán Sinh viên ôn thi

Một sinh viên còn m ngày để ôn thi n môn Theo kinh nghiệm của anh ta, nếu

ôn môn j trong i ngày thì được điểm là a[i,j] Giả sử cho biết các a[i,j] (với a[i,j]<=a[i+1,j])

Tìm bộ x[j] (số ngày ôn môn j, với j=1 n) sao cho x[j]=m và sinh viên đạt tổng điểm lớn nhất (a[x[j], j]max)

1 Xác định bài toán

Input: + m,n (m là số ngày, n là số môn)

+ A[i,j] (với i=1 m, j=1 n ) số điểm đạt được khi ôn môn j trong i ngày Output: + Tổng số điểm lớn nhất

+ X[j] (j=1 n) số ngày ôn môn j sao cho x[j]=m (j=1 n)

Tiểu luận tài chính

Trang 24

Sử dụng phương pháp quy hoạch động theo 4 bước sau:

Bước 1: Phân tích bài toán

Gọi P(r,s) là bài toán sinh viên ôn thi

L[r,s]: giá trị tối ưu của bài toán P(r,s)

U[r,s] là số lượng ngày dành để ôn môn s tức X[s]

Trang 25

Writeln('Ket qua diem lon nhat: ',L[m,n]);

Writeln('Lich hoc nhu sau:');

Trang 26

U[r,s]:=r;

L[r,s]:=A[r,1];

End Else TinhUL(r,s);

Writeln(fo,'Ket qua diem lon nhat: ',L[m,n]);

Writeln(fo,'Lich hoc nhu sau:');

Trang 27

Bài 11 Người đi du lịch

Một người đi từ thành phố 0 đến thành phố n và có thể đi qua n-1 thành phố khác 1, 2, , n-1, theo lộ trình: 0  i1  i2 …  ik  n, trong đó: 0 < i1 < i2 < …<

ik < n,Giá vé của xe đi từ thành phố i đến thành phố j là c[i,j] Tìm một lộ trình từ thành phố 0 đến thành phố n sao cho tổng chi phí về giá vé đạt cực tiểu

1 Xác định bài toán

Input + N: với ý nghĩa là có N+1 thành phố từ thành phố 0 đến thành phố N

+ Ma trận C[i,j] (i=0 N, j=0 N) là ma trận chi phí, trong đó C[i,j] là chi phí trực tiếp để đi từ thành phố i đến thành phố j (i có đường đi trực tiếp đến j) Nếu i không có đường đi trực tiếp đến j thì C[i,j] = +∞

Tiểu luận tài chính

Trang 28

Output + Chi phí nhỏ nhất để đi từ thành phố 0 đến thành phố N

+ X[i] (i=1 m) là số thứ tự của các thành phố phải đi qua khi đi từ thành phố 0 đến thành phố n (0X[1]X[2]…X[m]n)

2 Phương pháp thực hiện,

Sử dụng phương pháp quy hoạch động theo 4 bước sau:

Bước 1: Phân tích bài toán

Gọi P(r) là bài toán du lịch

Giả sử giá trị nhỏ nhất đạt được tại i‟ ta có K[r]=i‟

+ Trường hợp suy biến (r=0)

Ta có Nếu r=0 ta có L[0]=0; K[0] không xác định

Bước 3: Lập bảng

Tiểu luận tài chính

Ngày đăng: 30/01/2024, 10:02

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

TÀI LIỆU LIÊN QUAN

w