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

Bai Tap Thuc Hanh Toan Roi Rac.pdf

21 0 0
Tài liệu đã được kiểm tra trùng lặp

Đ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 đề Bài Tập Thực Hành Toán Rời Rạc
Tác giả Nguyễn Thị Anh Đào
Trường học Trường Đại Học Duy Tân
Chuyên ngành Công nghệ thông tin
Thể loại Bài tập thực hành
Năm xuất bản 2021
Thành phố Đà Nẵng
Định dạng
Số trang 21
Dung lượng 1,61 MB

Nội dung

Xây dÿng giải thuật đệ quy Khi cài đặt thuÁt toán đá quy ta tiến hành nhÿng b°ßc sau: • B°ßc 1: Xác đßnh mục đích, đầu vào và đầu ra để từ đó xác đßnh tên tiêu đề hàm tên hàm và tham số

Trang 1

TR¯àNG Đ¾I HàC DUY TÂN KHOA CÔNG NGHà THÔNG TIN

Khoa: Công nghá thông tin

BÁc đào t¿o: Đ¿i hác – Cao đẳng

Đà Nẵng, tháng 01 năm 2021

Trang 2

Nguyễn Thị Anh Đào Trang 1

Cấu trúc của giải thuật đệ quy

Một giải thuÁt đá quy bao giá cũng gồm 2 phần

• Phần neo: Xác đßnh điểm kết thúc cÿa một giải thuÁt đá quy Tr°áng hợp này còn đ°ợc gái là tr°áng hợp suy biến Nếu một giải thuÁt đá quy không có tr°áng hợp suy biến thì sẽ d¿n đến lặp vô h¿n và sinh lỗi khi thi hành

• Phần đá quy: Phân tích và xây dāng tr°áng hợp chung cÿa bài toán (có nghĩa

là đ°a bài toán về bài toán cùng lo¿i nh°ng vßi dÿ liáu nhỏ h¡n)

Xây dÿng giải thuật đệ quy

Khi cài đặt thuÁt toán đá quy ta tiến hành nhÿng b°ßc sau:

• B°ßc 1: Xác đßnh mục đích, đầu vào và đầu ra để từ đó xác đßnh tên tiêu đề hàm (tên hàm và tham số hình thāc cÿa nó)

• B°ßc 2: Xác đßnh tr°áng hợp suy biến (neo)

Trang 3

• B°ßc 3: Phân tích và xây dāng tr°áng hợp chung cÿa bài toán (phần đá quy)

Có nghĩa là đ°a bài toán về bài toán cùng lo¿i nh°ng vßi dÿ liáu nhỏ h¡n

Từ 3 b°ßc trên, áp dụng nguyên tắc viết ngôn ngÿ ta xây dāng đ°ợc hàm đá qui (thông th°áng sử dụng toán tử điều kián (if&else) để viết hàm đá quy

Ví dụ 1: Tính x yvßi xyđ°ợc đßnh nghĩa nh° sau: 1 0

0

* 1

= þ

y khi x y

y

x

• B°ßc 1: Xác đßnh tham số đầu vào là x và y, tham số đầu ra là Ta luôn nhÁn xy

đ°ợc giá trß xy duy nhất, do đó ta sử dụng hàm có kiểu trả về

• B°ßc 2: Phần neo: y=0 thì tổng x0 = 1

• B°ßc 3: Phần đá quy: là tr°áng hợp thāc hián l¿i bài toán vßi giá trß nhỏ h¡n y =

y - 1 Tāc là āng vßi tr°áng hợp thāc hián l¿i lái gái cũng đều có chung tham số đầu vào là y nh°ng vßi giá trß nhỏ h¡n y = y – 1 và đều có khuynh h°ßng đến tr°áng hợp suy biến y = 0

Trang 4

Nguyễn Thị Anh Đào Trang 3

int dem(long n)

{

if(n==0) return 0;

else return (1+ dem(n/10));

Ví dụ Xuất đảo ng°ợc một số nguyên d°¡ng ra màn hình3:

Trang 5

− Hiáu cÿa 2 tÁp hợp: hiáu cÿa 2 tÁp hợp A B là một tÁp hợp chāa các phần \

tử thuộc A mà không thuộc B

Trang 6

Nguyễn Thị Anh Đào Trang 5

− Hợp cÿa hai tÁp hợp: hợp cÿa 2 tÁp A B là một tÁp hợp chāa các phần tử ø hoặc thuộc A hoặc thuộc B

− Giao cÿa hai tÁp hợp: giao cÿa 2 tÁp A ÷ B là một tÁp hợp chāa các phần

tử vừa thuộc A vừa thuộc B

− Tích Đề các cÿa hai tÁp A, B là tÁp A - B = {(a,b) a A & b  þ þ B}

Biểu diễn tập hợp trên máy tính: dùng mảng

Trang 7

2) Viết ch°¡ng trình kiểm tra 2 tÁp A, B có bằng nhau không

Gợi ý: Sử dụng mảng, sắp xếp tr°ßc khi tính

3) Viết ch°¡ng trình tính hợp, giao, hiáu và tích Descartes cÿa 2 tÁp A, B

Gợi ý: Sử dụng mảng, sắp xếp tr°ßc khi tính

4) Giải quyết bài 4 vßi cấu trúc danh sách liên kết (đ¡n, đôi)

5) Viết ch°¡ng trình tính hợp, giao, hiáu và tích Descartes cÿa 3 tÁp A, B, C.Gợi ý: Sử dụng nguyên lý bù trừ

6) Viết ch°¡ng trình kiểm tra 1 phần tử x có trong tÁp hợp A không?

7) Viết ch°¡ng trình thêm phần tử x vào tÁp hợp A

8) Tìm phần tử bé nhất, lßn nhất trong tÁp hợp

III Hệ thức truy hồi

A Lý thuyết

Định nghĩa hệ thức truy hồi: Há thāc truy hồi đối vßi dãy số {a } là công thāc n

biểu dißn a qua một hay nhiều số h¿ng đi tr°ßc cÿa dãy, cụ thể là an 1, a2, &, an-1

vßi mái n  n0nguyên d°¡ng Dãy số đ°ợc gái là lái giải hay nghiám cÿa há thāc truy hồi nếu các số h¿ng cÿa nó thỏa mãn há thāc truy hồi

Giải hệ thức truy hồi:

− Bằng ph°¡ng pháp lặp

− Bằng ph°¡ng trình đặc tr°ng

Giải hệ thức truy hồi trên máy tính: dùng giải thuÁt đá quy

Ví dụ 1: Viết ch°¡ng trình cài đặt bài toán lãi kép

Trang 8

Nguyễn Thị Anh Đào Trang 7

Trang 9

2) Cho các dãy số thỏa mãn há thāc truy hồi sau đây, hãy viết ch°¡ng trình A(n) để tính giá trß cÿa há thāc (n nhÁp từ bàn phím):

a LÁp há thāc truy hồi cho dân số thế gißi n năm sau năm 2004

b Giải há thāc truy hồi cho dân số thế gißi n năm sau năm 2004

c Dân số thế gißi năm 2020 là bao nhiêu ?

d Viết hàm A(n) để tính kết quả

4) Cho dãy số {an} thoả mãn há thāc truy hồi: an= 5a - 6an-1 n-2; a =0 và a =1 0 1

a Giải há thāc truy hồi trên

b Viết hàm A(n) để tính an

5) Cho dãy số {an} thoả mãn há thāc truy hồi: an= 6a - 9an-1 n-2; a =1 và a =3 0 1

a Giải há thāc truy hồi trên

b Viết hàm A(n) để tính an

6) Xây dāng há thāc truy hồi và cài đặt thuÁt tóan đá quy cho các yêu cầu sau:

Trang 10

Nguyễn Thị Anh Đào Trang 9

a Tìm số xâu nhß phân độ dài bằng 3 không có ba số 1 liền nhau

b Giả sử số vi trùng trong một quần thể sẽ tăng gấp 3 lần sau mỗi giá LÁp há thāc truy hồi tính số vi trùng sau n giá

c Giả sử rằng mỗi cặp thỏ trên đảo khi đ°ợc 1 tháng tuổi đẻ đ°ợc 2 cặp thỏ con

và từ 2 tháng tuổi mỗi tháng đẻ đ°ợc 6 cặp thỏ con Giả sử rằng trong thái gian thí nghiám không có con nào bß chết hoặc rái khỏi đảo.Tìm há thāc truy hồi cho số cặp thỏ trên đảo sau n tháng kể từ khi thả 1 cặp thỏ mßi sinh lên đảo

d Có bao nhiêu xâu nhß phân có độ dài n và không chāa 2 bít 0 liên tiếp

IV Bài toán liệt kê

A Lý thuyết

Phương pháp sinh

Ph°¡ng pháp sinh có thể áp dụng để giải bài toán liát kê tổ hợp đặt ra nếu nh° 2 điều kián sau đ°ợc thāc hián:

− Có thể xác đßnh đ°ợc một thā tā trên tÁp các cấu hình tổ hợp cần liát kê Từ

đó có thể xác đßnh đ°ợc cấu hình đầu tiên và cấu hình cuối cùng trong thā tā

đã xác đßnh

− Xây dāng đ°ợc thuÁt toán từ cấu hình ch°a phải là cuối cùng đang có, đ°a ra cấu hình kế tiếp nó

Ta sẽ gái thuÁt toán nói trong điều kián thā 2 là thuÁt toán sinh kế tiếp Rõ ràng

là thā tā trong điều kián thā 1 cần đ°ợc lāa chán sao cho có thể xây dāng đ°ợc thuÁt toán sinh kế tiếp Giả thiết rằng 2 điều kián nêu ra đã đ°ợc thāc hián, khi đó, thuÁt toán sinh để giải bài toán liát kê đ°ợc mô tả nh° sau:

Trang 11

Có nhiều thuÁt toán đã đ°ợc nghiên cāu để có thể t¿o đ°ợc các cấu hình tổ hợp liền

kề ngay sau một cấu hình đã có Một trong nhÿng thā tā hay đ°ợc dùng đó là thā

tā từ điển, trong bài hác này chúng ta sẽ tìm hiểu về ph°¡ng pháp sinh cấu hình tổ hợp theo thā tā này

Cho = s1 s2 sp và ñ ò = t1 t2 tq là các dãy số hoặc ký tā Ta nói rằng ñ nhỏ h¡n ò (theo kiểu từ điển) , ký hiáu ñ < ò, nếu hoặc

(i) p < q và si = ti vßi mái i = 1, 2, , p

Giả sử dãy b1b2&bnlà dãy đang có, nhÁn xét rằng nếu dãy này toàn số 1 thì chính

là dãy cuối cùng cần tìm, quá trình liát kê kết thúc, còn nếu ch°a phải thì sẽ cộng thêm 1 (theo modun 2 có nhß) vào dãy đang có để nhÁn đ°ợc dãy kế tiếp Từ đó ta

có qui tắc nh° sau:

o Tìm i đầu tiên (theo thā tā i = n, n – 1, &,1) mà bi = 0

o Gán l¿i bi = 1 và b j= 0 vßi tất cả j > i Dãy mßi thu đ°ợc sẽ là dãy cần tìm

o ThuÁt toán:

o Đầu vào: n

o Đầu ra: Danh sách tất cả dãy nhß phân độ dài n theo thā tā từ điển tăng dần

o Các b°ßc:

1) Khởi t¿o dãy xuất phát: Gán b = 0 vßi mái i = 1, 2, , ni

2) Đ°a ra cấu hình đang có

Trang 12

Nguyễn Thị Anh Đào Trang 11

5) Quay l¿i b°ßc 2

Thuật toán quay lui

Ý t°ởng chính cÿa thuÁt toán này là xây dāng dần các thành phần cÿa cấu hình bằng cách thử tất cả các khả năng Giả thiết cấu hình cần đ°ợc mô tả bằng một bộ gồm n thành phần x1, x2, , xn Giả sử đã xác đßnh đ°ợc i 1 thành phần x1, x2, − , xi-1 Ta xác đßnh thành phần thā i bằng cách duyát tất cả khả năng có thể đề cử cho nó (đánh số các khả năng từ 1 đến ni) Vßi mỗi khả năng j, kiểm tra xem khả năng j có chấp nhÁn đ°ợc không Có thể xảy ra 2 tr°áng hợp:

− Nếu ch p nhấ Án j thì xác đßnh xi theo j, sau đó nếu i = n, thì ta đ°ợc mộ ất c u hình, còn trái l i ta ti¿ ến hành xác đßnh xi+1

− Nếu th tất cả khả năng mà không khả năng nào đ°ợử c ch p nh n thì quay l i ấ Á ¿b°ßc tr°ßc để xác đßnh l¿i xi 1 −

Điều quan tráng cÿa thuÁt toán là phải ghi nhß, t¿i mỗi b°ßc đã đi qua, nhÿng khả năng đã thử để tránh trùng lặp Rõ ràng nhÿng thông tin này cần đ°ợc l°u trÿ theo c¡ cấu ngăn xếp (stack vào sau ra tr°ßc) Vì thế thÿ tục đá qui rất phù hợp vßi - thuÁt toán này B°ßc xác đßnh xi có thể dißn tả qua thÿ tục

<xác định xi theo j> và trả l¿i tr¿ng thái cũ sau lái gái Try(i+1) Các tr¿ng thái này đ°ợc ghi nhÁn nhá một số biến toàn cục (global), gái là biến tr¿ng thái

Trang 13

Sau khi xây dāng thÿ tục đá qui Try , ch°¡ng trình chính giải bài toán liát kê có d¿ng :

Ví dụ: Liệt kê các dãy nhị phân có đß dài n

Ta biểu dißn dãy nhß phân d°ßi d¿ng x1, x2, xn, trong đó xi {0,1} Thÿ tục þTry(i) xác đßnh xi {0,1} Các giá trß này đ°ợc mặc nhiên chấp nhÁn mà không cần þphải thoả mãn điều kián gì (vì thế bài toán không cần biến tr¿ng thái)

//Ham liet ke cac day nhi phan do dai n

void Nhiphan( int i)

3 Cho số nguyên d°¡ng n, liát kê tất cả các hoán vß cÿa n số tā nhiên đầu tiên

4 Cho dãy a , a1 2,&,an các phần tử trong dãy khác nhau từng đôi một Liát kê tất các các hoán vß cÿa các giá trß trong dãy

Trang 14

Nguyễn Thị Anh Đào Trang 13

5 *Cho ph°¡ng trình x1 + x2 +&+xn= C vßi C là hằng nguyên không âm Hãy liát

kê tất các các bộ nghiám (x1, x2,&,xn) vßi xi nguyên không âm

6 Cho n là số quân hÁu trên 1 bàn cá vua kích th°ßc n x n Hãy viết ch°¡ng trình liát kê tất các cách xếp các quân hÁu trên bàn cá sao cho chúng không ăn đ°ợc l¿n nhau

7 Bài toán quân Mã: cho bàn cá vua kích th°ßc n x n Hãy chỉ ra hành trình cÿa một quân Mã xuất phát từ ô đang đāng, đi qua tất cả các ô còn l¿i trên bàn cá, mỗi ô đúng 1 lần

o Ma trÁn liền kề là ma trÁn đối xāng đối vßi đồ thß vô h°ßng

o Đối vßi đồ thß vô h°ßng tổng hàng i = tổng cột i = deg(i)

o Đối vßi đồ thß có h°ßng

▪ Tổng hàng i = deg (i) = số cung xuất phát từ đỉnh i+

▪ Tổng cột i = deg (i) = số cung vào đỉnh i

-Trong nhiều āng dụng cÿa lý thuyết đồ thß thì mỗi c¿nh e = (u, v) đ°ợc gán vßi một con số c(e) hay c(u, v) gái là trọng số cÿa c¿nh e Đồ thß trong tr°áng hợp này gái

Trang 15

Ví dụ:

Duyệt đồ thị: 2 phương pháp

Duyệt theo chiều sâu

Ý t°ởng cÿa thu t toán có th trìÁ ể nh bày nh° sau Ta sẽ ắt đầ b u tìm ki m t m t ế ừ ộ

đỉnh v0 nào đó cÿa đồ ß Sau đó chán u là đỉ th nh tùy ý kề vßi v và l0 ặp l¿i quá trình

đối vßi u Tổng quát hóa, giả s ta đang xét đỉử nh v Nếu nh° trong số các đỉnh kề vßi v tìm đ°ợc đỉnh w là ch°a đ°ợc xét thì ta sẽ xét đỉnh này (nó trở thành đã xét)

và bắt đầ ừu t nó ta s ti p t c quá trình tìm ki m Còn nẽ ế ụ ế ếu nh° không còn đỉnh nào

kề vßi v là ch°a xét thì ta sẽ nói rằng đỉnh này đã duyát xong, và quay trở l¿i tiếp tục tìm ki m tế ừ đỉnh mà tr°ßc đó ta đến đ°ợc đỉnh v (n u v = v thì k t thúc tìm ế 0 ếkiếm) Độ phāc t¿p cÿa thuÁt toán là O(n+m)

Thủ tục đệ qui mô t thu t toán DFSả ậ :

Trang 16

Nguyễn Thị Anh Đào Trang 15

Ví dụ: Xét đồ ß cho trong hình sau Các đỉ th nh cÿa nó đ°ợc đánh số ¿ l i theo th ā

tā chúng đ°ợc thăm theo thÿ tục tìm kiếm theo chiều sâu mô tả ở trên Gi thi t ả ếrằng các đỉnh trong danh sách kề cÿa đỉnh v (Ke(v)) đ°ợc sắp xếp theo th tā ā tăng dần cÿa chỉ số

Hình minh háa: Chỉ số mßi (trong ngoặc) cÿa các đỉnh đ°ợc đánh l¿i theo thā tā chúng đ°ợc thăm trong thuÁt toán tìm kiếm theo chiều sâu

Duyệt theo chiều rßng

Trong thu t toán tìm ki m theo chiÁ ế ều sâu, đỉnh đ°ợc thăm càng muộn s càng ẽsßm trở thành đỉnh đã duyát xong Bởi vì các đỉnh đ°ợc thăm sẽ ần l°ợt đ°a vào lngăn xếp (Stack), nên đỉnh đ°ợc thăm sau cùng sẽ đ°ợc hoàn thành tr°ßc tiên Tìm kiếm theo chiều rộng trên đồ th , nß ếu nói m t cách ngộ ắn gán, đ°ợc xây dāng dāa trên c¡ sở thay thế ngăn xếp (Stack) bởi hàng đợi (Queue) V i s c i biß ā ả ến nh° vÁy, đỉnh đ°ợc thăm càng sßm sẽ sßm trở thành đỉnh duyát xong (tāc là sßm rái khỏi hàng đợi) Một đỉnh sẽ trở thành đã duyát xong ngay sau khi ta xét xong t t c các ấ ảđỉnh kề (ch°a đ°ợc thăm) vßi nó Thÿ t c có th mô t ụ ể ả nh° sau:

4(3)

7(8) 6(4)

5(5)

8(6)

9(7)

Trang 17

// kh i t o các giá tr cở ạ ị ủa các bi n toàn c c ế ụ

For v V Chuaxet[v]= false; þ

Hình minh h a: Ch s m i (trong ngo c) cá ỉ ố ß ặ ÿa các đỉnh đ°ợc đánh l¿i theo th t ā āchúng đ°ợc thăm trong thuÁt toán tìm ki m theo chi u r ng ế ề ộ

Āng dụng cÿa 2 thu t toán tìm kiÁ ếm trên đồ ß th :

• Tìm đ°áng đi (chu trình) trên đồ thß

• Liát kê tất c ả các đ°áng đi có trong đồ thß

• Kiểm tra tính liên thông

5(6)

8(8)

9(9)

Trang 18

Nguyễn Thị Anh Đào Trang 17

Tìm đưßng đi ngắn nhất trên đồ thị

Bài toán

Cho đồ thß G = (V, E) là đồ thß đ¡n liên thông có tráng số không âm, tìm đ°áng đi có tổng tráng số nhỏ nhất từ đỉnh s đến f þ V

Thuật toán Dijkstra

Đầu vào: Đồ thß vô h°ßng G = (V, E) vßi n đỉnh, s V là đỉnh khởi đầu, þ

a[u,v] là tráng số cÿa c¿nh e(u, v), u, v þ V

Giả thiết: a[u, v] 0 , u, v V  þ

Đầu ra: Độ dài đ°áng đi từ s đến f Truoc[v], v V, ghi nhÁn đ°áng đþ i là các đỉnh tr°ßc v trong đ°áng đi ngắn nhất từ s đến f

B1: Gán nhãn L = , x V, Lx   þ s = 0, T = V //T là tÁp các đỉnh ch°a duyát B2: Lặp khi nào T còn chāa đỉnh f

Tìm cây khung nhỏ nhất trên đồ thị

Thuật toán Prim

Đối vßi nhÿng đồ thß dày (số c¿nh m n(n  − 1)/2) thuÁt toán Kruskal làm viác kém hiáu quả Trong tr°áng hợp đó, thuÁt toán Prim đ°ợc trình bày sau đây tỏ ra hiáu quả h¡n ThuÁt toán Prim còn đ°ợc gái là ph°¡ng pháp lân cÁn gần nhất Đầu vào: Đồ thß G = (V, E) đ¡n, liên thông, có tráng số a(u, v), u, v V, vþ *là đỉnh khởi đầu

Đầu ra: Cây khung T = (V , ET T) là cây khung nhỏ nhất trong đồ thß

Trang 19

B1: V = {vT *}, trong đó v là đỉnh tuỳ ý cÿa đồ thß G.*

E = T ö

B2: Vßi mỗi đỉnh vj ÿ VT, tìm đỉnh wj þ V sao cho a(w , v ) = min a(x , v ) = | T j j i j òj

xi þ V dùng T òj để ghi nhÁn độ dài cÿa c¿nh có độ dài ngắn nhất trong số các c¿nh nối đỉnh v vßi các đỉnh đang có cÿa cây khung Và gán cho đỉnh vj nhãn [w , ] j òj

(hiểu là đỉnh v kề vßi đỉnh w cÿa cây khung nhất và có độ dài là ) Nếu không j j òj

tìm đuợc wj nh° vÁy (tāc là khi v không kề vßi bất cā đỉnh nào trong Vj T) thì gán cho v nhãn [0, j ]

Nếu òj > a(v , vj* j) thì đặt òj = a(v , vj* j) và nhãn cÿa vj là [vj*, ] òj

Ng°ợc l¿i, ta giÿ nguyên nhãn cÿa vj

Thuật toán: Kruskal

Đầu vào: Đồ thß G=(V,E) đ¡n, liên thông, có tráng số

Đầu ra: Cây khung T=(V, E ) là cây khung nh nh t T ỏ ấ

Đồ th không liên thông ß

Ng°ợc l¿i: Thu đ°ợc cây khung nhỏ nhất T có tÁp c¿nh ET

Trang 20

Nguyễn Thị Anh Đào Trang 19

Tìm chu trình Euler trên đồ thị

Thuật toán:

Đầu vào: Đồ thß G=(V,E) có chu trình Euler và đỉnh a V bất kỳþ

Đầu ra: Chu trình Euler bắt đầu bằng đỉnh a

1 Kiểm tra đồ thß vô h°ßng có liên thông không?

2 Hãy tìm số thành phần liên thông trong một đồ thß

3 Hãy liát kê tất cả đ°áng đi giÿa 2 đỉnh cÿa một đồ thß (có h°ßng và vô h°ßng)

4 Tìm đ°áng đi trong mê cung kích th°ßc (nxm): quy °ßc: E là ô nhà thám hiểm đang đāng, O là an toàn, X là ô nguy hiểm Mỗi b°ßc đi thì nhà thám hiểm có thể đi đến ô an toàn liền kề

5 Kiểm tra xem đồ thß có chu trình Euler không? Nếu có hãy tìm chu trình đó

6 Kiểm tra xem đồ thß có đ°áng đi Euler không? Nếu có hãy tìm đ°áng đi đó

Trang 21

7 Cài đặt thuÁt toán Dijkstra để tìm đ°áng đi ngắn nhất trong đồ thß có tráng số d°¡ng

8 Cài đặt thuÁt toán Prim (Kruskal) tìm cây khung nhỏ nhất

Dÿ liáu các bài toán trên đ°ợc lấy từ bài tÁp toán rái r¿c trong tÁp bài giảng hoặc từ bài giảng ở lßp

Ngày đăng: 26/04/2024, 16:28

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

TÀI LIỆU LIÊN QUAN

w