- Rèn kỹ năng xác định cấu trúc dữ liệu, giải thuật một số bài toán cụ thể.. ?Hãy nêu các kiểu dữ liệu chuẩn đơn giản được sử dụng trong TP Bài toán tình huống: Nhập dữ liệu cho một dãy
Trang 2Ngày soạn Ngày giảng:
Chương 1 THIẾT KẾ VÀ PHÂN TÍCH GIẢI THUẬT
- Rèn kỹ năng khai thác tri thức từ giáo trình, tài liệu tham khảo
- Rèn kỹ năng xác định cấu trúc dữ liệu, giải thuật một số bài toán cụ thể
3 Thái độ
SV tự tin, ham học hỏi trong quá trình tiếp thu tri thức
B CHUẨN BỊ
1 Giảng viên: Giáo án, đồ dùng giảng dạy
2 Sinh viên: Giáo trình, đồ dùng học tập
C PHƯƠNG PHÁP
- Phương pháp đặt - giải quyết vấn đề
- Phương pháp thuyết trình tích cực
- Phương pháp đàm thoại
D TÀI LIỆU THAM KHẢO
1 Cấu trúc dữ liệu, Nguyễn Thị Tĩnh (chủ biên), Nxb ĐHSP Hà Nội
2 Cấu trúc dữ liệu và thuật toán, Đinh Mạnh Tường, Nxb Giao thông Vận tải
E TIẾN TRÌNH LÊN LỚP
1 Ổn định tổ chức
2 Nội dung bài giảng
? Nếu các dữ liệu có quan hệ với nhau thì kết nối chúng như thế nào
+ Các dữ liệu được kết nối với nhau bởi các phép toán
? Có thể đồng nhất các dữ liệu đó được không
+ Không thể đồng nhất các dữ liệu được vì chúng thuộc nhiều dạngkhác nhau
Trang 3? Kiểu dữ liệu là gì
- Kiểu dữ liệu là một sự quy định về cấu trúc, miền trị của dữ liệu và tậpcác phép toán tác động lên miền trị đó
?Hãy nêu các kiểu dữ liệu chuẩn (đơn giản) được sử dụng trong TP
Bài toán tình huống: Nhập dữ liệu cho một dãy n số
Vậy với các kiểu dữ liệu đơn giản vừa nêu, bài toán trên có được giải quyết không, nếu được thì giải quyết như thế nào, nếu không được thì những vấn đề nào cần phải được xử lý để giải quyết bài toán.
+ Khi giải các bài toán phức tạp, nếu chỉ sử dụng các kiểu dữ liệu đơngiản thì không thể giải quyết được Do vậy, ta cần phải tìm đến các cấutrúc dữ liệu khác được xây dựng từ các kiểu dữ liệu đơn giản đã có
Ta có thể hiểu cấu trúc dữ liệu là một mô hình toán học nhằm mô tả cácđối tượng (dữ liệu) và các phép toán thực hiện được trên mô hình đó
- Trong tin học, khi giải quyết các bài toán thì điều quan trọng là phảichọn chính xác cấu trúc dữ liệu và từ đó xác định được thuật toán giảiquyết bài toán
2 Ngôn ngữ
lập trình
? Em hiểu thế nào là ngôn ngữ lập trình
- Ngôn ngữ lập trình là một hệ thống được ký hiệu hóa để miêu tảnhững tính toán (qua máy tính) trong một dạng mà cả con người và máyđều có thể đọc và hiểu được
? Máy tính xử lý thông tin như thế nào
- Ngôn ngữ lập trình bao giờ cũng phải kèm theo bộ dịch để dịch sangngôn ngữ máy
- Ngôn ngữ lập trình chia làm 2 loại: biên dịch và thông dịch
? Thực hiện thao tác này ta sẽ thu được điều gì
- Việc xác định bài toán sẽ cho ta biết phải giải quyết vấn đề gì, với cácgiả thiết (input) đã cho và kết quả (input) cần đạt được thỏa mãn nhữngyêu cầu gì
Khác với bài toán thuần túy toán học chỉ cần xác định rõ giả thiết và kết luận chứ không cần xác định yêu cầu về lời giải, đôi khi những bài toán tin học ứng dụng trong thực tế chỉ cần tìm lời giải tốt tới mức nào đó, thậm chí là tới mức chấp nhận được bởi lời giải tốt nhất đòi hỏi quá nhiều thời gian và chi phí.
Lựa chọn cấu trúc dữ liệu thích hợp để biểu diễn bài toán
? Cấu trúc dữ liệu được lựa chọn phụ thuộc vào yếu tố nào
Trang 4Tiêu mục Hoạt động của thầy - trò
- Việc lựa chọn cấu trúc dữ liệu cho bài toán phụ thuộc vào vấn đề cầngiải quyết và những thao tác sẽ tiến hành trên dữ liệu vào
Có những thuật toán chỉ thích ứng với một cách tổ chức dữ liệu nhất định, đối với những cách tổ chức dữ liệu khác thì sẽ kém hiệu quả hoặc không thể thực hiện được Chính vì vậy thao tác này không thể tách rời thao tác xây dựng thuật toán giải quyết bài toán.
? Theo em khi lựa chọn cấu trúc dữ liệu, các tiêu chuẩn nào sẽ được dùng làm tiêu chí để chọn.
- Các tiêu chuẩn khi lựa chọn cấu trúc dữ liệu:
+ Phải biểu diễn được đầy đủ các thông tin và và ra của bài toán
+ Phải phù hợp với các thao tác theo các bước của thuật toán mà ta đãxây dựng để giải quyết bài toán
+ Phải cài đặt được trên máy tính với ngôn ngữ lập trình đang sử dụng
Thiết kế thuật toán
? Thuật toán là gì
- Thuật toán là một dãy hữu hạn các thao tác có thể thực hiện, được sắpxếp theo một trình tự xác định nhằm mô tả quá trình giải quyết một bàitoán, để từ các dữ kiện đầu vào sau một số thao tác ta sẽ có được kếtquả như mong muốn
? Trình bày các đặc trưng của thuật toán
- Tính dừng: Giải thuật phải kết thúc và đưa ra kết quả sau một số hữu hạncác thao tác
- Tính xác định: các thao tác dùng để mô tả giải thuật phải hòan toànđược xác định, không có sự nhập nhằng, tùy tiện
- Tính phổ dụng: giải thuật phải áp dụng được với một lớp các bài toánvới input thay đổi chứ không áp dụng cho một trường hợp cụ thể
Cần lưu ý là tính dừng và tính xác định là điều kiện cần trong quá trình tìm giải thuật, còn tính phổ dụng chỉ là một tính chất thường thấy vì có nhiều bài toán có input hoàn toàn xác định nhưng không tồn tại một lớp các bài toán tương tự.
- Dữ liệu đầu vào: mỗi giải thuật bắt buộc phải có một hoặc nhiều đạilượng vào
- Dữ liệu đầu ra: sau khi giải thuật được thực hiện xong thì nó phải đưa
ra được kết quả như mong muốn
Sử dụng ngôn ngữ lập trình đã lựa chọn để mô tả thuật toán
Sau khi đã xây dựng được thuật toán, ta phải tiến hành lập trình mô tả thuật toán
đó Muốn lập trình đạt hiệu quả cao, cần phải có kỹ thuật lập trình tốt Kỹ thuật lập
Trang 5trình tốt thể hiện ở kỹ năng viết chương trình, khả năng gỡ rối và thao tác nhanh Nếu lập trình tốt không phải chỉ cần nắm vững ngôn ngữ lập trình là đủ mà phải biết cách viết chương trình uyển chuyển, khôn khéo và phát triển dần dần để chuyển các ý tưởng thành chương trình hoàn chỉnh Kinh nghiệm cho thấy một thuật toán hay nhưng do cài đặt vụng về nên khi chạy lại cho kết quả sai hoặc tốc
- Chạy thử và tìm lỗi: các lỗi thường gặp khi lập trình gồm
+ Lỗi cú pháp: lỗi này hay gặp nhất nhưng lại dễ sửa nhất, chỉ cần nắmvững ngôn ngữ lập trình là đủ
+ Lỗi cài đặt: việc cài đặt thể hiện không đúng thuật toán đã định, vớilỗi này thì phải xem tổng thể chương trình, kết hợp với các chức năng
gỡ rối để sửa lại cho đúng
+ Lỗi thuật toán: lỗi này ít gặp nhất nhưng nguy hiểm nhất, nếu nhẹ thìphải điều chỉnh lại thuật toán, nếu nặng thì có khi phải loại bỏ hoàn toànthuật toán sai và làm lại từ đầu
- Xây dựng các bộ test:
Có nhiều chương trình rất khó kiểm tra tính đúng đắn, nhất là khi ta không biết kết quả đúng là khi nào Vì vậy nếu chương trình vẫn chạy ra kết quả thì việc tìm lỗi rất khó khăn Khi đó ta nên làm các bộ test để thử chương trình của mình.
Tối ưu chương trình
Một chương trình đã chạy đúng không có nghĩa là việc lập trình đã xong, ta phải sửa đổi lại một vài chi tiết để chạy chương trình có thể chạy nhanh hơn, hiệu quả hơn Thông thường, trước khi kiểm thử thì ta nên đặt mục tiêu viết chương trình sao cho đơn giản, miễn sao chạy ra kết quả đúng là được, sau đó khi tối ưu chương trình, ta xem lại những chỗ viết chưa tốt thì tối ưu lại mã lệnh để chương trình ngắn gọn hơn, chạy nhanh hơn Không nên viết tới đâu tối ưu đến đó vì chương trình có
mã lệnh tối ưu thường phức tạp và khó kiểm soát.
? Các tiêu chí nào có thể dùng để đánh giá sự tối ưu của một chương trình
- Các tiêu chí để đánh giá sự tối ưu một chương trình
+ Tính tin cậy: chương trình phải chạy đúng như dự định, mô tả đúnggiải thuật
+ Tính uyển chuyển: chương trình phải dễ sửa đổi
+ Tính trong sáng: chương trình viết ra phải dễ đọc, dễ hiểu để sau một
Trang 6Tiêu mục Hoạt động của thầy - trò
thời gian dài khi đọc lại còn hiểu mình làm cái gì, để nếu có điều kiệncòn có thể sửa sai (nếu phát hiện lỗi mới), cải tiến hay biến đổi để đượcchương trình giải quyết bài toán khác
+ Tính hữu hiệu: chương trình phải chạy nhanh và tiêu tốn bộ nhớ ítnhất có thể được
Để có một chương trình hữu hiệu, cần phải có giải thuật tốt và những tiểu xảo khi lập trình, tuy nhiên việc áp dụng quá nhiều tiểu xảo có thể khiến chương trình trở nên rối, khó hiểu khi sửa đổi Tiêu chí này chỉ nên dừng ở mức chấp nhận được, không quan trọng bằng ba tiêu chí trên.
Từ những phân tích trên ta thấy rằng việc làm ra một chương trình đòi hỏi rất nhiều công đoạn và tiêu tốn khá nhiều công sức Chỉ một công đoạn không hợp lý
sẽ làm tăng chi phí viết chương trình Nghĩ ra cách giải quyết vấn đề đã khó, biến ý tưởng đó thành hiện thực cũng không dễ chút nào.
- Nghiên cứu lại nội dung bài cũ
- Tìm hiểu về cách phân tích thời gian thực hiện giải thuật
Trang 7§2 Phân tích thời gian thực hiện giải thuật
A MỤC TIÊU
1 Kiến thức
Giúp SV nắm được các vấn đề như: khái niệm giải thuật, các cách biểu diễngiải thuật, độ phức tạp của giải thuật; bước đầu biết xác định độ phức tạp giải thuậtcủa một số bài toán cụ thể
2 Kỹ năng
- Rèn kỹ năng khai thác tri thức từ giáo trình, tài liệu tham khảo
- Rèn kỹ năng đánh giá độ phức tạp thông qua việc đánh giá một số giảithuật cụ thể
3 Thái độ
SV tự tin, ham học hỏi trong quá trình tiếp thu tri thức
B CHUẨN BỊ
1 Giảng viên: Giáo án, đồ dùng giảng dạy
2 Sinh viên: Giáo trình, đồ dùng học tập
C PHƯƠNG PHÁP
- Phương pháp đặt - giải quyết vấn đề
- Phương pháp thuyết trình tích cực
- Phương pháp đàm thoại
D TÀI LIỆU THAM KHẢO
1 Cấu trúc dữ liệu, Nguyễn Thị Tĩnh (chủ biên), Nxb ĐHSP Hà Nội
2 Cấu trúc dữ liệu và thuật toán, Đinh Mạnh Tường, Nxb Giao thông Vận tải
E TIẾN TRÌNH LÊN LỚP
1 Ổn định tổ chức
2 Nội dung bài giảng
1 Giải
thuật
- Giải thuật là một dãy hữu hạn các thao tác có thể thực hiện, được sắpxếp theo một trình tự xác định nhằm mô tả quá trình giải quyết một bàitoán, để từ các dữ kiện đầu vào sau một số thao tác ta sẽ có được kếtquả như mong muốn
Trang 8Tiêu mục Hoạt động của thầy - trò
a Phương pháp liệt kê từng bước
- Là phương pháp sử dụng ngôn ngữ tự nhiên để liệt kê các thao tác, cácchỉ thị cần thực hiện để giải quyết bài toán
- Ví dụ:
? Cho cô biết cách tìm nghiệm của phương trình bậc hai ax 2 +bx+c = 0
? Cho cô biết cách tìm ước chung lớn nhất của hai số nguyên dương a, b
Các nhóm SV trao đổi rồi trả lời
b Phương pháp sử dụng lưu đồ
- là phương pháp sử dụng các hình vẽ đã quy định để mô tả giải thuật mộtcách trực quan
- Các khối được sử dụng:
trong đó chỉ có khối dùng để kiểm tra điều kiện là có một đường vào và
2 đường ra còn tất cả các khối khác đều chỉ có một đường vào và mộtđường ra
3 Ví dụ ? Hãy vẽ lưu đồ mô tả giải thuật giải phương trình bậc hai ax 2 +bx+c =
Nhập dữ liệuKiểm tra điều kiệnHướng đi của giải thuật
Begin
End
a, b, c delta := b*b - 4*a*c delta < 0 delta = 0
PT có no kép
x := -b/(2*a)
PT có 2 nox:=(-bSQRT(delta))/
(2*a)
PT vô no
1 0
0 1
End
Trang 9c Sử dụng ngôn ngữ phỏng trình
- Theo phương pháp này ta sẽ dùng các ký hiệu và quy tắc để mô tả giảithuật một cách nhất quán
- Ví dụ 1: mô tả giải thuật tìm UCLN(a.b)
C1: Khi a còn khác b thì thực hiện thao tác sau
Nếu a > b thì a sẽ có giá trị bằng a - b (bớt a đi một lượng b) Ngược lại thì b sẽ nhận giá trị bằng b - a (bớt b đi một lượng a)Cho đến khi a = b thì thông báo UCLN của a và b là bằng a (hoặc bằng b).C2: Khi b còn khác 0 thì thực hiện các thao tác sau
Chia a cho b được phần dư r; a nhận giá trị của b; b nhận giá trị của rcho đến khi b = 0 thì thông báo UCLN của a và b là a
Thời gian thực hiện một giải thuật bằng chương trình máy tính phụ thuộc vào rất nhiều yếu tố Một yếu tố cần chú ý nhất là kích thước của dữ liệu vào Dữ liệu vào càng lớn thì thời gian xử lý càng chậm, chẳng hạn như thời gian sắp xếp một dãy số phụ thuộc vào số lượng các số thuộc dãy số đó Nếu gọi n là kích thước dữ liệu đưa vào thì thời gian thực hiện của giải thuật có thể biểu diễn một cách tương đối như một hàm của n: T(n).
Ta biết rằng phần cứng máy tính, ngôn ngữ viết chương trình và chương trình dịch ngôn ngữ ấy đều ảnh hưởng tới thời gian thực hiện Những yếu tố này không giống nhau trên các loại máy, vì vậy không thể dựa vào chúng để xác định T(n), tức là T(n) không thể biểu diễn bằng đơn vị thời gian giờ, phút, giây được Tuy nhiên, không phải vì thế mà không thể so sánh được các giải thuật về mặt tốc độ
Nếu thời gian thực hiện một giải thuật là T 1 (n) = n 2 và thời gian thực hiện của một giải thuật khác là T 2 (n) = 100n thì khi n đủ lớn, thời gian thực hiện giải thuật T 2 rõ ràng nhanh hơn giải thuật T 1 Khi đó, nếu nói rằng thời gian thực hiện giải thuật tỷ lệ thuận với n hay tỷ lệ thuận với n 2 cũng cho ta một cách đánh giá tương đối về tốc độ thực hiện của giải thuật đó khi n khá lớn Cách đánh giá thời gian thực hiện giải thuật độc lập với máy tính và các yếu tố liên quan tới máy tính như vậy sẽ dẫn tới khái niệm “độ phức tạp tính toán của giải thuật”
Tại sao phải thiết kế thuật toán có hiệu quả nhất ?
Begin
a, b
a = b
a > b 01
1
UC = a 0
End
r := a mod b;
a := b;
b := r;
Trang 10Tiêu mục Hoạt động của thầy - trò
- VD: Bài toán tháp Hà Nội: Có 3 cọc A, B, C Trên cọc A có n đĩađược đặt theo thứ tự từ bé đến lớn Ta cần chuyển n đĩa từ cọc A sangcọc C, được phép sử dụng cọc B làm trung gian nhưng không đượcphép để đĩa lớn trên đĩa bé
? Trình bày cách làm trong thực tế
- Phân tích: + Chuyển n - 1 đĩa từ cọc A sang cọc B
+ Chuyển 1 đĩa từ cọc A sang cọc C+ Chuyển n - 1 đĩa từ cọc B sang cọc C
? Phải có bao nhiêu lần chuyển nếu ký hiệu số lần chuyển là F(n)
Phải có F(1) = 1 lần; F(n) = 2F(n-1) + 1 với n > 1 lần chuyển
và nếu tuổi của vũ trụ là 10 tỷ năm thì cần 50 lần tuổi của vũ trụ để chuyển 64
chiếc đĩa Phải tìm thuật toán có hiệu quả nhất Tuy nhiên có những bài toán không tồn tại những thuật toán có hiệu quả nhất.
Đánh giá độ phức tạp theo phương pháp lý thuyết
+ Sử dụng hàm số T(n) để biểu diễn thời gian thực hiện giải thuật
+ Có thể xác định thời gian thực hiện T(n) là số phép toán sơ cấp phảitiến hành khi thực hiện giải thuật (+, - , *, /, phép so sánh)
Đánh giá độ phức tạp theo phương pháp toán học: Sử dụng ký hiệu O
để mô tả độ lớn của hàm T(n)
- Định nghĩa: Giả sử n là số nguyên không âm, T(n) và F(n) là các hàmthực không âm Khi đó T(n) được xác định: T(n) = O(F(n)) nếu và chỉnếu tồn tại các hằng số c, n0 sao cho T(n) cF(n) n n0
Nghĩa là nếu xét những giá trị n n0 thì hàm T(n) sẽ bị chặn trên bởi mộthằng số nhân với F(n) Khi đó, nếu T(n) là thời gian thực hiện giải thuật thì
ta nói giải thuật đó có cấp là F(n) (hay độ phức tạp tính toán là O(F(n))
Ta có T(n) = O(n2) (Trường hợp này ta nói giải thuật có thời gianthực hiện cấp n2
Trang 11- Các dạng hàm thể hiện độ phức tạp của giải thuật
O(Log2n) Lôgarit O(nlog2n) n log2n
? Đánh giá độ phức tạp của đoạn lệnh trong ví dụ trên
T1(n) = O(1);(do thực hiện phép gán)
T2(n) = O(2n) (thực hiện n lần 2 phép toán: gán và cộng)
T(n) = O(max(1,2n)) = O(2n)
Quy tắc nhân: Nếu đoạn chương trình T được biểu diễn bởi haiđoạn chương trình T1 và T2 lồng nhau thì O(T) = O(T1).O(T2) tức làO(T) = T(n) = T1(n).T2(n) = O(f(n).g(n))
- Ví dụ:
? Viết đoạn lệnh để sắp xếp mảng một chiều A theo chiều giảm dần (tăng dần)
For i := 1 To n - 1 DoFor j := i + 1 To n Do
If A[i] < A[j] ThenBegin
tg := A[i]; A[i] := A[j]; A[j] := tg;
End;
? Đánh giá độ phức tạp của đoạn lệnh trong ví dụ trên
T1(n) = O(n-1) = O(n) (For vòng ngoài chạy n - 1 lần)
T2(n) = O(4(n-1) = O(n) (For trong thực hiện tối đa n - 1 lần và mỗi lần thực hiện 4 phép toán)
T(n) = O(n.n) = O(n2)
* Chú ý: Khi đánh giá độ phức tạp của giải thuật ta chỉ cần chú ý tới các
Trang 12Tiêu mục Hoạt động của thầy - trò
bước tương ứng với một phép toán mà ta gọi là phép toán tích cực Đó làphép toán thuộc giải thuật mà thời gian thực hiện nó không ít hơn cácphép toán khác (hoặc số lần thực hiện không kém gì các phép toán khác)
- Ví dụ: Tính
!
! 2
! 1
n
x x
P := P*(x/i);
S := S + P;
End;
T(n) = T1(n)+T2(n)+T3(n), trong đó T1(n) = T2(n) = O(1); T3(n) = ?
? Xác định phép toán tích cực trong đoạn lệnh T 3
Lệnh tích cực có thể là P := P* (x/i) hoặc S := S + P T3(n) = O(n)
T(n) = O(max(1,1,n)) = O(n)
Khi đánh giá độ phức tạp của thuật toán, có những trường hợp thừoi gian thực hiện giải thuật không phụ thuộc vào kích thước dữ liệu mà phụ thuộc vào chính tình trạng của dữ liệu đầu vào.
- Ví dụ 1: Sắp xếp một dãy số theo chiều tăng dần (giảm dần)
Trường hợp dãy đó đã theo đúng thứ tự tăng dần (giảm dần) sẽ khác với trường hợp dãy số chưa được sắp thứ tự Thời gian phân tích giải thuật sẽ phải chú ý tới T(n) trong trường hợp tốt nhất, xấu nhất và thời gian trung bình.
- Ví dụ 2: Cho biết x có mặt trong dãy A (n phần tử) không?
? Viết đoạn lệnh xử lý yêu cầu trên
OK:= False;
Trang 13vào i := 1;
While (i <= n) and (not OK) Do
If A[i] = x ThenBegin
OK := True; k := i; Write(k :4);
EndElse i := i + 1;
? Phép toán nào là phép toán tích cực? Trường hợp tốt nhất là trường hợp nào, trường hợp nào là xấu nhất.
Khái niệm độ phức tạp tính toán đặt ra là để đánh giá chi phí thực hiện một giải thuật
về mặt thời gian Nhưng chi phí thực hiện giải thuật còn có rất nhiều yếu tố khác nữa: không gian bộ nhớ phải sử dụng là một ví dụ Tuy nhiên, trên phương diện phân tích lý thuyết, ta chỉ có thể xét tới vấn đề thời gian bởi việc xác định các chi phí khác nhiều khi rất mơ hồ và phức tạp Đối với người lập trình thì khác, một giải thuật với độ phức tạp
dù rất thấp cũng sẽ là vô dụng nếu không thể cài đặt được trên máy tính Chính vì vậy, khi bắt tay cài đặt một thuật toán, ta phải biết cách tổ chức dữ liệu một cách khoa học, tránh lãng phí bộ nhớ cần thiết Có một quy luật tương đói khi tổ chức dữ liệu: tiết kiệm được bộ nhớ thì thời gian thực hiện thường sẽ chậm hơn và ngược lại Biết cân đối, dung hòa hai yếu tố đó là một kỹ năng cần thiết của người lập trình.
F CỦNG CỐ, HỌC TẬP TẠI NHÀ
* Củng cố
Qua bài học này các em nắm được các vấn đề như: khái niệm giải thuật, cáccách biểu diễn giải thuật, khái niệm và cách xác định độ phức tạp của giải thuật; bướcđầu biết xác định độ phức tạp giải thuật của một số bài toán cụ thể
* Nhiệm vụ học tập tại nhà
- Nghiên cứu lại nội dung bài cũ
- Tìm hiểu về đệ quy và giải thuật đệ quy
§3 Đệ quy và giải thuật đệ quy
A MỤC TIÊU
1 Kiến thức
Giúp SV nắm được các vấn đề như: khái niệm đệ quy, cách xây dựng giải thuật
đệ quy của một số bài toán cụ thể
Trang 142 Kỹ năng
- Rèn kỹ năng khai thác tri thức từ giáo trình, tài liệu tham khảo
- Rèn kỹ năng xây dựng giải thuật đệ quy thông qua việc tìm hiểu cách xâydựng giải thuật đệ quy của một số bài toán cụ thể
3 Thái độ
SV tự tin, ham học hỏi trong quá trình tiếp thu tri thức
B CHUẨN BỊ
1 Giảng viên: Giáo án, đồ dùng giảng dạy
2 Sinh viên: Giáo trình, đồ dùng học tập
C PHƯƠNG PHÁP
- Phương pháp đặt - giải quyết vấn đề
- Phương pháp thuyết trình tích cực
- Phương pháp đàm thoại
D TÀI LIỆU THAM KHẢO
1 Cấu trúc dữ liệu, Nguyễn Thị Tĩnh (chủ biên), Nxb ĐHSP Hà Nội
2 Cấu trúc dữ liệu và thuật toán, Đinh Mạnh Tường, Nxb Giao thông Vận tải
E TIẾN TRÌNH LÊN LỚP
1 Ổn định tổ chức
2 Nội dung bài giảng
? Trình bày khái niệm đệ quy theo ý hiểu của mình
- Đệ quy là một khái niệm mà để định nghĩa nó ta phải dùng chính nó
để định nghĩa
? Từ khái niệm đó em có nhận xét gì
- Nhận xét: + Luôn luôn tồn tại một trường hợp đặc biệt phải chấp nhận
+ Luôn dùng chính khái niệm đó để định nghĩa
2 Giải
thuật đệ
quy
? Thế nào là giải thuật đệ quy
- Giải thuật đệ quy là giải thuật mà để thiết kế nó ta phải dùng chínhgiải thuật đó để thiết kế
? Phải xác định được các vấn đề nào khi muốn thiết kế một giải thuật
Trang 15dệ quy
- Lưu ý: Để thiết kế được một giải thuật đệ quy cần phải
+ Định nghĩa được đệ quy+ Xác định trường hợp đặc biệt để giải thuật dừng+ Có lời gọi tới chính giải thuật đó nhưng với cấp thấp hơn
3 Ví dụ Ví dụ 1: Xây dựng hàm tính n!
?Định nghĩa đệ quy ( n! = 1 nếu n = 0 ; = n.(n-1)! nếu n 1)
? Xác định trường hợp đặc biệt để giải thuật dừng (n = 0)
? Sử dụng các kiến thức đã học để xây dựng hàm tính n! theo đệ quy
Function GT (n: integer): Longint;
Begin
If n = 0 Then GT := 1Else GT := n * GT(n-1);
End;
? Hãy chỉ ra lời gọi đệ quy trong giải thuật tính n! như trên
Ví dụ 2: Bài toán sinh sản thỏ (Phibônaxi)
Xuất phát từ 1 cặp thỏ
Sau 2 tháng thì bắt đầu sinh sản
Mỗi lần sinh đúng một cặp
Các con thỏ không bao giờ chết
? Vẽ mô hình thể hiện bài toán trên
End;
? Tại sao nói giải thuật là giải thuật đệ quy
Bài tập về nhà:
Trang 16Tiêu mục Hoạt động của thầy - trò
1 Viết chương trình hoàn chỉnh sử dụng các giải thuật đệ quy đã nghiêncứu trong giờ lý thuyết
2 Lập trình tìm xâu ngược của một xâu bằng giải thuật đệ quy
(XN = st nếu length(st) = 1; = st[n]+copy(st,1,n-1) nếu n = length(st) > 1)
* Mối quan hệ giữa đệ quy và toán học
? Em có nhận xét gì về các lời giải đệ quy
- Lời giải đệ quy dựa trên việc cố định rõ lời giải cho trường hợp đặcbiệt rồi thiết kế sao cho lời giải của bài toán được suy ra từ lời giải củabài toán nhỏ hơn, cùng loại
? Nhắc lại cách chứng minh sự đúng đắn của một bài toán bằng phương pháp quy nạp toán học
- Cách chứng minh sự đúng đắn của một bài toán bằng phương phápquy nạp toán học:
+ Chứng minh bài toán đúng với n = 1+ Giả sử bài toán đúng với n = k+ Chứng minh bài toán đúng với n = k + 1
- Ví dụ: Chứng minh tính đúng đắn của giải thuật tính n! theo cách đệquy bằng phương pháp quy nạp toán học
+ Ta có: n = 0 thì GT(0) = 1 (đúng)
+ Giả sử đúng với n = k tức là GT(k) = k * (k-1) * (k-2) * * 2*1.+ Chứng minh đúng với n = k + 1
Ta có: GT(k+1) = (k+1)*GT(k) = (k+1)*k * (k-1) * (k-2) * * 2*1
= (k+1)! đpcm
Bài tập về nhà: Chứng minh tính đúng đắn của các giải thuật đệ quy (đã
Trang 17xây dựng) bằng phương pháp quy nạp toán học.
- Nghiên cứu lại nội dung bài cũ, làm bài tập về nhà
- Tìm hiểu về con trỏ, biến động và cấu trúc dữ liệu biểu diễn danh sách
Trang 18Ngày soạn Ngày giảng:
- Rèn kỹ năng khai thác tri thức từ giáo trình, tài liệu tham khảo
- Rèn kỹ năng xác định cấu trúc dữ liệu, giải thuật một số bài toán cụ thể
3 Thái độ
SV tự tin, ham học hỏi trong quá trình tiếp thu tri thức
B CHUẨN BỊ
1 Giảng viên: Giáo án, đồ dùng giảng dạy
2 Sinh viên: Giáo trình, đồ dùng học tập
C PHƯƠNG PHÁP
- Phương pháp đặt - giải quyết vấn đề
- Phương pháp thuyết trình tích cực
- Phương pháp đàm thoại
D TÀI LIỆU THAM KHẢO
1 Cấu trúc dữ liệu, Nguyễn Thị Tĩnh (chủ biên), Nxb ĐHSP Hà Nội
2 Cấu trúc dữ liệu và thuật toán, Đinh Mạnh Tường, Nxb Giao thông Vận tải
E TIẾN TRÌNH LÊN LỚP
1 Ổn định tổ chức
2 Nội dung bài giảng
1 Biến tĩnh ? Nêu cú pháp chung được dùng để khai báo các biến? Cho ví dụ
Khi sử dụng cách khai báo này, các biến đã khai báo được gọi là biến tĩnh
? Các biến này có đặc điểm gì (luôn được máy tính đánh sẵn ô nhớ trong RAM để chứa dữ liệu cho dù không sử dụng trong chương trình)
Trang 19 Phải có một cơ chế sinh biến để khi cần đến ô nhớ thì tự động sinh ra, còn khi
không cần thì lại xóa bỏ.
2 Biến
động
- Biến động là loại biến không được mô tả bằng từ khóa Var, nó có đặcđiểm là khi cần thì tự động sinh ra, khi không cần thì người lập trình cóthể thu hồi lại bộ nhớ đã cấp phát cho nó
- Để giữ địa chỉ của các biến này ta phải sử dụng con trỏ
3 Con trỏ - Con trỏ là một loại biến đặc biệt nhằm đảm bảo cơ chế giữ địa chỉ của
các biến động để người dùng có thể truy cập thông qua địa chỉ đó
4 Khai báo ? Nhắc lại cách khai báo các biến thông qua từ khóa Type
- Cú pháp: Type Pt = ^ Kiểu dữ liệu;
Var Tên biến: Pt;
- Giải thích: + Kiểu dữ liệu là các kiểu dữ liệu đã học (trừ kiểu File);
+ Pt, Tên biến: là tên do người dùng tự đặt
- Ý nghĩa: Thu hồi bộ nhớ đã cấp phát cho biến động P^
- Chú ý: + Không tồn tại các thao tác đối với con trỏ mà chỉ tồn tại cácthao tác đối với biến động (Ví dụ: Readln(P^);)
+ Nếu P, Q là 2 biến con trỏ thì lệnh P := Q; có ý nghĩa: P sẽtrỏ vào ô nhớ mà Q đang trỏ
+ Khi thao tác với con trỏ phải tuân thủ 3 nguyên tắc:
Khi cần thì sinh ra
Khi không cần thì thu hồi
Không được làm mất địa chỉ+ P := nil; có ý nghĩa: P không trỏ vào đâu cả
6 Ví dụ - Ví dụ 1: Viết chương trình giải phương trình bậc nhất bằng cách sử
Trang 20- Rèn kỹ năng khai thác tri thức từ giáo trình, tài liệu tham khảo.
- Rèn kỹ năng với danh sách thông qua nghiên cứu các thủ tục cài đặt danhsách bằng mảng một chiều và con trỏ
3 Thái độ
SV tự tin, ham học hỏi trong quá trình tiếp thu tri thức
B CHUẨN BỊ
1 Giảng viên: Giáo án, đồ dùng giảng dạy
2 Sinh viên: Giáo trình, đồ dùng học tập
C PHƯƠNG PHÁP
- Phương pháp đặt - giải quyết vấn đề
- Phương pháp thuyết trình tích cực
- Phương pháp đàm thoại
D TÀI LIỆU THAM KHẢO
1 Cấu trúc dữ liệu, Nguyễn Thị Tĩnh (chủ biên), Nxb ĐHSP Hà Nội
2 Cấu trúc dữ liệu và thuật toán, Đinh Mạnh Tường, Nxb Giao thông Vận tải
E TIẾN TRÌNH LÊN LỚP
1 Ổn định tổ chức
2 Nội dung bài giảng
- Giả sử danh sách có n phần tử, ký hiệu: L = (a1, a2, , an)
? Theo em, trên danh sách các phép toán nào có thể thực hiện được
Khởi tạo danh sách
Procedure Create (Var L: List);
Xác định độ dài của danh sách
Function Leng(Var L : List): Integer;
Loại bỏ phần tử ở vị trí thứ k
Procedure Delete (k: Integer; Var L : List);
Trang 21 Thêm phần tử có giá trị x vào sau phần tử ở vị trí thứ k
Procedure InsertAfter(k: Integer; x: Item; Var L : List);
Thêm phần tử có giá trị x vào trước phần tử ở vị trí thứ k
Procedure InsertBefore(k: Integer; x: Item; Var L : List);
Tìm kiếm một phần tử trong danh sách
Function Find(x: Item; L : List) : Boolean;
Kiểm tra xem danh sách có rỗng không
Function Empty (L : List) : Boolean;
Kiểm tra xem danh sách đã đầy chưa
Function Full (L : List) : Boolean;
Type List = Record
Element : Array [1 n] Of Item;
count : 0 n;
End;
Var L : List;
- Giải thích: + Element : tên kiểu mảng
+ Item : Tên 1 kiểu dữ liệu - là kiểu dữ liệu các phần tử của mảng+ count : dùng để đếm số phần tử của mảng
+ List : Tên kiểu bản ghi
- Cài đặt các phép toán
Khởi tạo danh sách
? Khi khởi tạo danh sách có đặc điểm gì (chưa có phần tử nào)
Procedure Create (Var L: List);
BeginL.count := 0;
End;
Xác định độ dài của danh sách
? Trình bày cách xác định độ dài của một danh sách
Function Leng(Var L : List): Integer;
BeginLeng := L.count;
End;
Loại bỏ phần tử ở vị trí thứ k
? Vẽ mô hình loại bỏ phần tử ở vị trí thứ k của danh sách
Trang 22Tiêu mục Hoạt động của thầy - trò
i := k;
While i < L.count DoBegin
Thêm phần tử có giá trị x vào sau phần tử ở vị trí thứ k
? Vẽ mô hình thêm phần tử có giá trị x vào sau phần tử ở vị trí thứ k củadanh sách
Cách làm: Dồn tất cả các phần tử từ vị trí k+1 xuống một vị trí, sau đó đưa giá trị x vào vị trí k + 1.
? Độ dài của danh sách sẽ thay đổi như thế nào sau khi thêm phần tử này.
Procedure InsertAfter(k: Integer; x: Item; Var L : List);
VarBegin
If Full(L) Then Writeln(‘Danh sach da day khong them duoc’)Else
With L DoBegin
Trang 23i := count + 1;
While i > k + 1 DoBegin
Thêm phần tử có giá trị x vào trước phần tử ở vị trí thứ k
? Vẽ mô hình thêm phần tử có giá trị x vào trước phần tử ở vị trí thứ k
của danh sách
Cách làm: Dồn tất cả các phần tử từ vị trí k xuống một vị trí, sau đó đưa giá trị x vào vị trí k.
? Độ dài của danh sách sẽ thay đổi như thế nào sau khi thêm phần tử này.
Procedure InsertBefore(k: Integer; x: Item; Var L : List);
i := count + 1;
While i > k DoBegin
Tìm kiếm một phần tử trong danh sách
? Trình bày cách tìm kiếm một phần tử trong danh sách
Function Find(x: Item; L : List) : Boolean;
Trang 24Tiêu mục Hoạt động của thầy - trò
Var ok : Boolean; i : Integer;
Begin
ok := False;
For i := 1 To L.count Do
If x = Element[i] Then Begin
Kiểm tra xem danh sách có rỗng không
? Danh sách rỗng khi nào
Function Empty (L : List) : Boolean;
BeginEmpty := L.count = 0;
End;
Kiểm tra xem danh sách đã đầy chưa
? Danh sách đầy khi nào
Function Full (L : List) : Boolean;
BeginFull := L.count = n;
End;
b Sử dụng con trỏ
? Tại sao phải sử dụng con trỏ
Phương pháp mô tả như sau: mỗi phần tử của danh sách là một bản ghi, mỗi bản ghi gồm 2 trường: trường infor dùng để chứa dữ liệu của danh sách, trường next để liên kết giữa các phần tử của danh sách với nhau; Sử dụng con trỏ Head để trỏ tới phần tử đầu tiên của danh sách; con trỏ Head không có infor.
?Hãy mô tả hình ảnh danh sách khi sử dụng con trỏ để biểu diễn
Trang 25 Khởi tạo danh sách
? Khi khởi tạo danh sách có đặc điểm gì (chưa có phần tử nào)
? Viết thủ tục khởi tạo khi sử dụng con trỏ Head để trỏ vào đầu danh sách
Procedure Create (Var Head : Pt);
BeginHead := nil;
End;
Xác định độ dài của danh sách
? Trình bày cách xác định độ dài của một danh sách
Function Leng(Var Head : Pt): Integer;
Var d : Integer;
Begin
P := Head; d := 0;
While P <> nil DoBegin
Thêm phần tử có giá trị x vào sau phần tử ở vị trí thứ k
? Vẽ mô hình thêm phần tử có giá trị x vào sau phần tử ở vị trí thứ k của danh sách
Cách làm: P^.next := Q^.next; Q^.next := P; với Q là con trỏ trỏ tới phần tử thứ k, P là con trỏ trỏ tới phần tử có thông tin x cần chèn vào.
? Hãy xác định con trỏ Q trỏ vào thành phần thứ k của danh sách
Cách làm: Đi từ đầu danh sách (Q := Head) cho tới khi đến phần tử thứ k của danh sách thì dừng.
Q Q^.next
Trang 26Tiêu mục Hoạt động của thầy - trò
? Xử lý như thế nào nếu danh sách không có đến k phần tử
? Để chèn thêm phần tử có giá trị x vào sau phần tử ở vị trí thứ k ta phải thực hiện các thao tác nào
Các thao tác cần thực hiện: Nếu danh sách có nhiều hơn k phần tử thì thực hiện 2 thao tác: + Xác định con trỏ Q trỏ vào phần tử thứ k của danh sách; + Tiến hành chèn ; Ngược lại danh sách không có đến k phần tử thì đưa ra lời thông báo
Procedure InsertAfter(k: Integer; x: Item; Var Head : Pt);
Q := Head; d := 0;
While Q <> nil DoBegin
d : = d + 1;
If d = k Then BreakElse Q := Q^.next;
End;
{Tien hanh chen}
New(P); P^.infor := x; P^.next := Q^.next; Q^.next := P; End;
End;
Thêm phần tử có giá trị x vào trước phần tử ở vị trí thứ k
? Vẽ mô hình thêm phần tử có giá trị x vào trước phần tử ở vị trí thứ
Q Q^.next
Trang 27Cách làm: Đi từ đầu danh sách (Q := Head) cho tới khi đến phần tử đứng trước phần tử thứ k của danh sách thì dừng.
? Xử lý như thế nào nếu k = 1 Hãy vẽ mô hình mô tả quá trình chèn
? Để chèn thêm phần tử có giá trị x vào trước phần tử ở vị trí thứ k ta phải thực hiện các thao tác nào
Các thao tác cần thực hiện: Nếu danh sách có nhiều hơn k phần tử thì: Nếu k >
1 thực hiện 2 thao tác: + Xác định con trỏ Q trỏ vào phần tử thứ k-1 của danh sách; + Tiến hành chèn ; Nếu k = 1 thì P^.next := Head; Head := P; Ngược lại danh sách không có đến k phần tử thì đưa ra lời thông báo
Procedure InsertBefor(k: Integer; x: Item; Var Head : Pt);
Begin{Xac dinh con tro Q tro vao phan tu thu k-1 cua danh sach}
Q := Head; d := 0;
While Q <> nil DoBegin
d : = d + 1;
If d = k - 1 Then BreakElse Q := Q^.next;
End;
{Tien hanh chen}
New(P); P^.infor := x; P^.next := Q^.next; Q^.next := P; End;
nil
Trang 28Tiêu mục Hoạt động của thầy - trò
? Viết thủ tục
Procedure InsertBefor(k: Integer; x: Item; Var Head : Pt);
Var d: integer; Q: Pt; tg : Item;
BeginInsertAfter(k,x,Head);
{Xac dinh con tro Q tro vao phan tu thu k cua danh sach}
Q := Head; d := 0;
While Q <> nil DoBegin
d : = d + 1;
If d = k Then BreakElse Q := Q^.next;
End;
tg := Q^.infor; Q^.infor := (Q^.next)^.infor; (Q^.next)^.infor := tg;End;
Tìm kiếm một phần tử trong danh sách
? Trình bày cách tìm kiếm một phần tử trong danh sách
Function Find(x: Item; Head : Pt) : Boolean;
Var ok : Boolean; i : Integer;
Begin
ok := False; P := Head;
While P <> nil DoBegin
If P^.infor = x ThenBegin
Kiểm tra xem danh sách có rỗng không
? Danh sách rỗng khi nào
Function Empty (Head : Pt) : Boolean;
Trang 29BeginEmpty := Head = nil;
? Hãy vẽ mô hình danh sách móc nối vòng tròn
? Thế nào là danh sách móc nối vòng tròn
- Danh sách móc nối vòng tròn là danh sách mà con trỏ next của phần
tử cuối cùng lại trỏ về phần tử đầu tiên của danh sách
? Trình bày ưu, nhược điểm của danh sách móc nối vòng tròn
- Ưu điểm: + Mọi thành phần đều có vai trò như nhau
+ Khi cần thao tác chỉ cần con trỏ chỉ vào một thành phần bất kỳ+ Xuất phát từ một phần tử bất kỳ ta luôn xác định được cácphần tử còn lại
- Nhược điểm: Trong quá trình xử lý nếu không cẩn thận sẽ dẫn tới mộtchu trình không kết thúc
- Khắc phục: Đưa thêm vào một con trỏ đặc biệt (gọi là Basic), con trỏnày có trường infor không chứa dữ liệu gì và nó trỏ vào một thành phầnbất kỳ của danh sách
? Trình bày cách khai báo
Basic Basic^.next
Trang 30Tiêu mục Hoạt động của thầy - trò
? Trình bày cách xử lý khi danh sách rỗng
? Xử lý trường hợp danh sách rỗng (như xử lý khi chèn vào bên phải phần
tử được trỏ bởi Basic)
Procedure InsertBefore(x: Item; Var Basic);
Begin
Basic
x
P 2 1
a1 ak-1 ak ak+1 am
x
P
1 2
Basic 3 Basic^.next
Trang 31InsertAfter(x, Basic); Basic := Basic^.next;
End;
? Trình bày cách khác xử lý yêu cầu trên
Xác định P là con trỏ trỏ tới phần tử đứng trước phần tử được trỏ bởi Basic, sau đó chèn vào bên phải phần tử được trỏ bởi P.
Yêu cầu SV về nhà viết thủ tục xử lý theo cách vừa nêu.
+ Loại bỏ phần tử bên phải phần tử được trỏ bởi Basic ra khỏi danh sách
và lưu giá trị vào biến x
? Vẽ mô hình thể hiện quá trình loại bỏ
? Xử lý trường hợp danh sách chỉ có một phần tử và danh sách rỗng
? Viết thủ tục
Procedure DeleteAfter(Var Basic: Pt; Var x: Item);
VarBegin
If Basic = nil Then Writeln(‘Danh sach rong’)Else
If Basic = Basic^.next Then Writeln(‘Danh sach chi co 1 PT’)Else
Danh sách hai liên kết
- Mô tả: mỗi phần tử của danh sách gồm 3 phần: infor (chứa thông tin),nextleft (liên kết với phần tử bên trái), nextright (liên kết với phần tửbên phải)
a1 ak-1 ak ak+1 am
1 Basic (Basic^.next)^.next
Trang 32Tiêu mục Hoạt động của thầy - trò
? Trình bày cú pháp khai báo
- Nghiên cứu lại nội dung bài cũ
- Tìm hiểu về danh sách đặc biệt: Ngăn xếp (Stack)