CHƯƠNG I: GIẢI THUẬT Giới thiệu về môn học: “Cấu trúc dữ liệu và giải thuật là một trong những môn học cơ bản của sinh viên nghành CNTT khi muốn tiếp cận với lập trình và xây dựng phần mềm. liệu và các giải thuật được xem như là yếu tổ quan trọng nhất trong lập trình. CChuong trình phần mềm= Cấu trúc + Giải thuật. Cấu trúc dữ liệu có thé được xem như là một phương pháp lưu trữ dữ liệu trong.
máy tỉnh nhằm sử dụng một cách có hiệu quả những dữ liệu này. Và để sử dụng các dữ liệu một cách hiệu quả thì cẳn có các thuật toán áp dụng trên các dữ liệu đó. Đo vậy Cấu trúc dữ liệu và giải thuật là 2 yếu tổ không thể tách rời và có những, liên quan chặt ch với nhau. Cấu trúc dữ liệu và giải thuật ~_ Giải thuật (Thuật toán): Giải thuật là một tập hữu hạn các phép toán cơ sở .được sắp đặt theo quy tắc chính xác, nhằm giái một bài toán.
~ _ Các phép toán cơ sở là các phép toán đơn giản mà thời gian thực hiện nó luôn là một bằng số, nghĩa là nó không phụ thuộc vào kích thước của toán hạng ~ _ Các phép toán trong giải thuật luôn được xác định rõ rằng „không mập mở, si cũng có thể hiểu được cách thực hiện của nó. ~ _ Chú ý: Giải thuật có thể thay đổi khi cấu trúc dữ liệu thay đổi 1.2 Ngôn ngữ diễn giả: ~ _ Nếu sử dụng đến một ngôn ngữ lập trình cắp cao nào đó chẳng hạn như. Như vậy sẽ gặp một số hạn chế sau: ¬+ Phái luôn tuân thủ cú pháp chặt chế của ngôn ngữ đó, khiến cho việc trình bảy giải thật và cầu trúc dữ liệu có thiên hướng nặng nẻ, gò bó. + Phải phụ thuộc vào cấu trúc dữ liệu tiễn định (Mỗi một ngôn ngữ dữ liệu.
cđề ấn định sẵn những cấu trúc dữ liệu cho riêng mình)của ngôn ngữ. lên không thể hiện được dầy đủ các ý của từng giải thuật -+ Ngôn ngữ đã chọn không phải ai cũng ưa thích và sử dụng ~ _ Như vậy ở đây ta sẽ dùng ngôn ngữ thô hơn có đủ khả năng diễn đặt đc giải thuật ta tạm gọi bằng các tên ngôn ngữ tựa Pascal.Các quy tác bắt đầu 12 ‘Quy tác về cấu trúc chương trình: Mỗi chương trình đều được ngắn một tên để phân biệt, tên này được viết bằng chữ in hoa, có thể thêm dấu gạch nối va bắt đầu bằng từ khóa. Program VD: Program TEN_CHUONG_TRINH Độ dài tên không bị bạn chế: Sau tên có thể kèm theo lời thuyết minh (Ở đây ta quy ước dùng tiếng việt) Phin thuyết minh được đặt giữa 2 đầu (. Ký tự và biểu thức Ký tự dùng ở đây giống như các ngôn ngữ chuẳn 26 chữ cái Latinh in hoa hoặc in thường 10 chữ số thập phân Các dấu phép toán số học +, -, *,/, † (Lũy thừa) ‘Cc dau phép toán quan hệ: <,>, =, 52,# Git tri logic: True, false Dầu phép toán logic: and, or, not "Tên biển: Dấy chữ si và chữ số, đầu bằng chữ cái Biển chỉ số có hạng: A[f], B[(J] vv.
Còn bigu thức, cũng như th tự ưu tiên cũng giống như các ngôn ngỡ lập trình khác. (Cộng trừ trước nhân chia sau.) 123 “Các câu lệnh (Hay các chị thị) “Các câu lệnh trong chương trình được viết cách nhau bằng đâu chấm phải .V: Chỉ tên biến tên hàm. E: Chí biểu thức 6day cho phép dùng phép gán chung VD: A:=B:=4 2. Câu lệnh phép Có dạng: SLÍE 1,.n là các câu lệnh 'Nó chỗ phép nghép nhiều câu lệnh lại để thành một câu lệnh.
Câu lệnh điền kiện. Có dạng Tí BthenS Với B là biểu thức logic; S: Là một câu lệnh khác. Bu: Sx Else : Soot End case 'Với B,(I=12.n) là các điều kiện S(ŒE 1.n);là các câu lệnh. “Câu lệnh này cho phép phân biệt các tỉnh huồng xử lý khác nhau trong các điều kiện khác nhau mà không cần dùng đến câu lệnh iF lồng nhau.
Có thể điễn tả bởi sơ đỗ 6. Câu lệnh lặp s& Với số lần lặp biết trước. For ï:=m to n doS Nhằm thực hiện câu lệnh S với ắt giá trị nguyên từ m tới n (n>=m) với bước nhay tăng =1 Hoge: For i:=n down to m doS “Tương tự như câu lệnh trên với bước nhay giảm 1 'b. Với số lần lặp không biết trước While B do faise " ‘Chimg nào B có giá trịtrue thì thực hiện S Hoặc; Repeat $ until B Lặp S cho tới khi B có giá trị đúng (S có thể là một dãy lệnh) 7.
Câu lệnh vào ra “Có dạng: Read (<Danh sich bién>) ‘Write(<Danh sich biến hoặc dòng ký tự>) “Các biến trong danh sách cách nhau bởi dấu phẩy Dông ký tự là một dãy các ký tự đặt giữa 2 dấu °* I8. Câu lệnh kết thúc chương trình End 1.4 Chương trình con 1. Chương trình conn him Có dạng ameon <tên hàm>{<danh sách tham số>) S,:8.iSn Reture (Cau Ign két thúc chương trinh 6 day la reture thay cho end. Chương trình con thủ tye "Tương tự như trên chỉ khác ở chỗ: 2 Từkhóa oe w thaychofunetiom “Trong cấu tạo của chương trình con hàm bao giờ cũng có câu lệnh gán mà tên hảm nắm ở vế trái.
Còn đối với tên hàm con thủ tục thì không có Lời gọi chương trình con hàm thể hiện bằng tên hàm. Lời gọi của chương trình con thủ tục thể hiện bằng câu lệnh call có dạng: “Call<Tên thủ tục>(<Danh sách tham số thực>) 1.3 Thiết kế giải thuật ~_ Thiết kể kiểu top-down (Cách thiết kế đi từ tổng thể đến chỉ it — Chia để ti) Là tách bài toán ra thành các bài ra thành các bài toán con mỗi bài toán con này lại áp dụng một chiến thuật tương tự (Chia nhỏ dần) cho tới khi tới những bài toán con đủ nhỏ để có thể giải trực tiếp được. Sau đó chỉ cần tổng. hợp lại các phéo xử lý để có giải thuật cũa bài toán gốc.
Cách làm: ~ Xác định được dỡ dữ liệu yêu cầu: Cho biết cái gi (Input) và đôi hồi cái ‘(out put) = Dé gidi quyết được yêu cầu thì phải làm gì ~ _ Với mỗi công việc ấy thì phải làm thể nào ? 'VD: Ta xét bài toán sau : Sắp xếp dãy số (a:, a2, .a,) Thành dãy số tăng. din, 'Nhờ vậy đấy số Input nếu có dạng chẳng hạn (33,77,11, 55, 99, 22, 44, 88, 66) "Thi day #6 œutput phải có dạng (11, 22, 33, 44, 55, 66, 77, $8, 99) « _ Để có đc kết quả output như vậy th phải làm gi? .Có thể thấy rằng sắp xếp theo kiểu tăng dẫn nghĩa là: -+ Số bé nhất trong N số phải được đặt ở vị trí đầu tiên + Số bé nhất trong (N-1) số côn lại phải đc đặt vào vị trị thứ 2 + aw ‘Nhu vậy có 2 công việc chính phải làm: -+ Chọn số bé nhất trong diy số chưa được sắp xếp 2 + Dat né vio vj tri sau phiin tử cuối của dây số đã được sắp xếp. “Chủ ý: Lúc đầu đây số còn rồng, sau đó nó được bổ xung dẫn dẫn các phần tử vào Các công việc trên được thực lặp lại (n-1) lẫn: lần đầu với n số, lẫn cuối với 286. « _ Tới đây ta có thể điễn đặt sơ bộ gii thuật sắp XẾp của tạ như sau: Procedure selection-sort(A,n); {A là veeio gồm n phần từ là các số cho] 1.
2 công việc được lặp lãi n-1 lần or i=l to (n-l) do begin 2. Chọn số nhỏ nhất Ak] trong đãy các số Ai Afi*1]. Hoán vị giữa Afk] va Afi] 4. End; Bây giời ta đi sâu vào từng công việc + Chon số nhỏ nhất trong dãy s6: Afi], A[ï*1.
Loc == Akl; Alk] = Ali: Ali] = Loc; 6 And: 7. Reture 14 Đánh giá giải thuật ~ Khi một giải thuật được thực hiện thường nó liên quan đến 2 yếu tố -+ Không gian nhớ cần thiết cho những cầu trúc lưu trữ ¬+ Thời gian cần thiết để thực hiện 'Nếu Thời gian thực hiện giải thuật cảng nhanh thì không gian nhớ cần thiết cho cấu trúc lưu trữ dữ liệu cảng lớn. Thông thường thời gian thực hiện giải thuật vẫn được chủ ý nhiễu hơn. Vì vậy ta sét tới việc đánh giá thời gian thực hiện giải thuật ~_.
_ Củng một bải toán nếu giải thuật AI có thời gian thực hiện là : Tinj=än ~_ Giảithuật A2 có thời gian thực hiện là: T,(n)=2n ~ ___ Tathấy khin đủ lớn thì T,ƒn)< T;ín) (Chỉ cần m4) và n cảng lớn thì sự chênh lệnh cảng rõ. Như vậy lúc đó ta có thể nồi: ~_. Khin đủ lớn thì giải thuật A1 nhanh hơn giải thuật A2, 1.8 Giải thuật đệ quy 1.1 Định nghĩa: ~- Đệ quy là một khái niệm rất qua trọng trong tin học ~ Một đối tượng gọi là đệ quy nếu nó bao gồm chính nó như một bộ phận ~_ Một hảm gọi là đệ quy nếu trong định nghĩa của nó lại có dang là chính nó. 'VD : Hảm tính giai thừa của một số nguyên dương với quy ước 0!=1 thi hàm này sẽ được định nghĩa như sau: 1.
Néu N>O thi n!= n(n-1)! ‘Nhu vay trong định nghia n! lại có (n-1)! Dé chinh li tính đệ quy ‘VD: Ta muốn tinh 4! Theo dinh nghia ta 6: 4I=4.2! 22 Ueto! Như vậy 4!= 4. Ví dụ về thủ tục đệ quy 1. Hàm tính nt Function FACT(n); Ifn=0 then FACT ==1 Ele FACT:=n *FACT(a-1); Reture 2. Diy sé FIBONACCI Day fibonacei ¢6 dạng như sau: 1,1,2,3,5,8,13,21,34,55, ‘Voi số đầu la 1 va 1 thi số sau là tổng của hai số đứng trước nó.
Các số này được cai là giá trị của bảm Eib với đối số là số nguyên dương n mà ta gọi là hàm Eibonaeci. Ta có thể định nghĩa hảm này như sau: ~ Néu n=l hoge n=2 thi Fib(n)=1 ~_ Nếu m2 thi Fib(n)=Fib(n-1) + Fib (n-2) ~_ Từ đó ta có thé viết giải thuật tính giá trị của Fib(n) dưới dạng thủ túc đệ quy như sau Function Fib(a) If nc=2 then Fib:=1; Else FIB:=Fib(a-1)}+Fib(a-2) Reture 3. Bài toán thấp Hà Nội Đây là một bài toán mang tính chất một trò chơi và có nội dung như sau: 'Có n đĩa kích thước nhỏ dẫn , đĩa có lỗ ở giữa , có thể sắp xếp chúng chồng. lên nhau xuyên qua một cọc, to ớ đưới nhỏ ở trên ,để cuỗi cùng có một chồng đĩa giống như cái tháp (Như dang tap rủa ở hồ gương Hà Nội) ~ Cổ n cọc A, B, C.
Hiện N đĩa đang được xếp ở cột A yêu cầu đặt ra: Chuyển. 'cọe đĩa từ cọc A sang cọc C, theo những điều kiện sau 1. Mỗi lần chỉ được chuyển 1 dia '2. Không khi nảo có tỉnh huồng đĩa to ở trên „ đĩa nhỏ ở dưới .