Chương 1: Giải thuật Chương 2: Cấu trúc dữ liệu Mặc dù có nhiều cố gắng, nhưng trong quá trình biên soạn, biên tập và in ấn khó tránh khỏi những thiếu sót. Chúng tôi rất mong nhận được sự đóng góp ý kiến từ phía các thầy cô và bạn đọc để hoàn thiện giáo trình hơn! Xin trân trọng cảm ơn! Hà Nội, ngày……tháng……năm……… Tham gia biên so¿n Trần Thị M¢ - Chủ biên 2 MþC LþC CH¯¡NG 1: GIÀI THUÀT. Các khái niám về giÁi thuÁt. Các đặc tr°ng của giÁi thuÁt.
Tính hiáu quÁ. Tính chính xác. Tính ứng dụng. Ngôn ngā dißn đ¿t giÁi thuÁt.
Ngôn ngā thông th°ờng. Ngôn ngā lÁp trình. Ph°¢ng pháp thiết kế giÁi thuÁt. Tinh chỉnh từng b°ớc.
11 CH¯¡NG 2: CÂU TRÚC DĀ LIàU. Danh sách tuyến tính. Danh sách liên kết. Danh sách liên kết đ¢n.
Các d¿ng khác của danh sách liên kết. Cây nhị phân. Biểu dißn cây nhị phân. Duyát cây nhị phân.
Cây nhị phân tìm kiếm. Duyát đồ thị theo chiều ráng. Duyát theo chiều sâu. 43 4 Tên môn hác: CÂU TRÚC Dþ LIàU VÀ GIÀI THU¾T Mã môn hác: MH10 Thái gian thāc hián môn hác: 60 giờ (Lý thuyết: 30 giờ; Thăc hành, thí nghiám, thÁo luÁn, bài tÁp: 27 giờ; Kiểm tra 03 giờ) I.
Vß trí, tính chÃt cÿa môn hác: - Vị trí: + Môn học đ°ợc bố trí ở kỳ học thứ 02. + Môn học tiên quyết: Không - Tính chÃt: là môn học c¢ sở ngành, cung cÃp các kiến thức c¢ bÁn về các khái niám c¢ bÁn, các kiểu cÃu trúc dā liáu thông dụng và mát số giÁi thuÁt trên các kiểu cÃu trúc dā liáu đó. Mÿc tiêu môn hác: 1. Về kiến thức: - Trình bày đ°ợc các khái niám về giÁi thuÁt, các đặc tr°ng của giÁi thuÁt; - Trình bày đ°ợc mát số ngôn ngā dißn đ¿t giÁi thuÁt; - Trình bày đ°ợc mát số ph°¢ng pháp thiết kế giÁi thuÁt; - Trình bày đ°ợc mát số kiểu dā liáu danh sách tuyến tính và thao tác trên kiểu dā liáu đó; - Trình bày đ°ợc mát số kiểu dā liáu danh sách liên kết và thao tác trên kiểu dā liáu đó; - Trình bày đ°ợc kiến thức về cây nhị phân, phép duyát và ứng dụng cây nhị phân tìm kiếm; - Trình bày đ°ợc kiến thức về đồ thị: biểu dißn đồ thị, phép duyát và ứng dụng của đồ thị.
Về kỹ năng: - VÁn dụng các kiểu dā liáu thông dụng nh° danh sách tuyến tính, cây nhị phân, đồ thị để cài đặt các ch°¢ng trình ứng dụng nhỏ. Về năng lăc tă chủ và trách nhiám: Có năng lăc tă định h°ớng, thích nghi với các môi tr°ờng làm viác khác nhau; tă học tÁp, tích lũy kiến thức, kinh nghiám để nâng cao trình đá chuyên môn nghiáp vụ. 5 CH¯¡NG 1: GIÀI THU¾T Mÿc tiêu bài hác 1. Cung cÃp cho ng°ời học các kiến thức c¢ bÁn về c¢ bÁn về giÁi thuÁt: các đặc tr°ng giÁi thuÁt, ngôn ngā dißn đ¿t giÁi thuÁt, ph°¢ng pháp thiết kế giÁi thuÁt, đánh giá đá phức t¿p của giÁi thuÁt trong mát số bài toán cụ thể.
CH¯¡NG 1: GIÀI THU¾T 1. Các khái niám vÁ giÁi thu¿t 1. GiÁi thu¿t Khái niám giÁi thuÁt hay thuÁt giÁi mà nhiều khi còn đ°ợc gọi là thuÁt toán dùng để chỉ ph°¢ng pháp hay cách thức (method) để giÁi quyết vần đề. GiÁi thuÁt có thể đ°ợc minh họa bằng ngôn ngā tă nhiên (natural language), bằng s¢ đồ (flow chart) hoặc bằng mã giÁ (pseudo code).
Trong thăc tế, giÁi thuÁt th°ờng đ°ợc minh họa hay thể hián bằng mã giÁ tăa trên mát hay mát số ngôn ngā lÁp trình nào đó (th°ờng là ngôn ngā mà ng°ời lÁp trình chọn để cài đặt thuÁt toán), chẳng h¿n nh° C, Pascal, ? Khi đã xác định đ°ợc cÃu trúc dā liáu thích hợp, ng°ời lÁp trình sẽ bắt đầu tiến hành xây dăng thuÁt giÁi t°¢ng ứng theo yêu cầu của bài toán đặt ra trên c¢ sở của cÃu trúc dā liáu đã đ°ợc chọn. Để giÁi quyết mát vÃn đề có thể có nhiều ph°¢ng pháp, do vÁy să lăa chọn ph°¢ng pháp phù hợp là mát viác mà ng°ời lÁp trình phÁi cân nhắc và tính toán. Să lăa chọn này cũng có thể góp phần đáng kể trong viác giÁm bớt công viác của ng°ời lÁp trình trong phần cài đặt thuÁt toán trên mát ngôn ngā cụ thể. CÃu trúc dÿ liáu Mối quan há giāa cÃu trúc dā liáu và GiÁi thuÁt có thể minh họa bằng đẳng thức: CÃu trúc dā liáu + GiÁi thuÁt = Ch°¢ng trình.
Nh° vÁy, khi đã có cÃu trúc dā liáu tốt, nắm vāng giÁi thuÁt thăc hián thì viác thể hián ch°¢ng trình bằng mát ngôn ngā cụ thể chỉ là vÃn đề thời gian. Khi có cÃu trúc dā liáu mà ch°a tìm ra thuÁt giÁi thì không thể có ch°¢ng trình và ng°ợc l¿i không thể có ThuÁt giÁi khi ch°a có cÃu trúc dā liáu. Mát ch°¢ng trình máy tính chỉ có thể đ°ợc hoàn thián khi có đầy đủ cÁ CÃu trúc dā liáu để l°u trā dā liáu và GiÁi thuÁt xÿ lý dā liáu theo yêu cầu của bài toán đặt ra. Để đánh giá mát cÃu trúc dā liáu chúng ta th°ờng dăa vào mát số tiêu chí sau: - CÃu trúc dā liáu phÁi tiết kiám tài nguyên (bá nhớ trong) - CÃu trúc dā liáu phÁi phÁn Ánh đúng thăc tế của bài toán - CÃu trúc dā liáu phÁi dß dàng trong viác thao tác dā liáu.
Các đặc tr°ng cÿa giÁi thu¿t - Tính xác định: Mßi b°ớc của thuÁt giÁi cần phÁi đ°ợc mô tÁ mát cách chính xác, chỉ có mát cách hiểu duy nhÃt. Bởi vì, nếu mát b°ớc có thể hiểu theo nhiều cách khác nhau, thì cùng mát dā liáu vào, nhāng ng°ời thăc hián thuÁt giÁi khác nhau có thể cho ra kết quÁ khác nhau. Nếu ta mô tÁ thuÁt giÁi bằng ngôn ngā tă nhiên, không có gì đÁm bÁo ng°ời đọc hiểu đúng ý của ng°ời viết thuÁt giÁi, bởi ngôn ngā tă nhiên th°ờng là đa nghĩa. Để đÁm bÁo đòi hỏi này, thuÁt giÁi cần đ°ợc mô tÁ trong mát ngôn ngā lÁp trình, chẳng h¿n mát ngôn ngā lÁp trình (Pascal, C.
trong các ngôn ngā này, các mánh đề đ°ợc t¿o thành theo các qui tắc cú pháp nghiêm nghặt và chỉ có mát ý nghĩa duy nhÃt. - Tính khả thi: TÃt cÁ các phép giÁi có mặt trong các b°ớc của thuÁt giÁi phÁi đủ đ¢n giÁn. Điều đó có nghĩa là các phép giÁi phÁi sao cho, ít nhÃt về nguyên tắc có thể 7 thăc hián đ°ợc bởi con ng°ời trong mát khoÁng thời gian hāu h¿n. Chẳng h¿n trong thuÁt giÁi Euclid, ta chỉ cần thăc hián các phép chia các số nguyên, các phép gán và các phép so sánh.
- Tính dừng: Với mọi bá dā liáu vào thoÁ mãn điều kián qui định, thuÁt giÁi phÁi dừng l¿i sau mát số hāu h¿n b°ớc thăc hián. Chẳng h¿n đối với thuÁt giÁi Euclid là thuÁt giÁi thoÁ mãn điều kián này. Bởi vì số d° r luôn nhỏ h¢n n, nếu r0 thì giá trị của n ở b°ớc sau là giá trị của r ở b°ớc tr°ớc, ta có n>r=n1>r1=n2>r2.Dãy số nguyên d°¢ng giÁm dần cần phÁi kết thúc ở 0, do đó sau mát số b°ớc giá trị của r=0 thuÁt giÁi dừng. Dÿ liáu vào - Input: Mßi thuÁt giÁi cần có mát số (có thể bằng không) dā liáu vào.
Đó là giá trị cần đ°a vào khi thuÁt giÁi bắt đầu làm viác. Dÿ liáu ra - Output: Mßi thuÁt giÁi cần có mát hoặc nhiều dā liáu ra. Đó là các giá trị có quan há xác định với giá trị vào và là kết quÁ của să thăc hián thuÁt giÁi. Tính hiáu quÁ Mát giÁi thuÁt nên là có thể thi hành đ°ợc với các nguồn có sẵn, tức là có khÁ năng giÁi quyết hiáu quÁ vÃn đề trong điều kián thời gian và tài nguyên cho phép.
Tính chính xác GiÁi thuÁt nên rõ ràng và không m¢ hồ. Mßi mát giai đo¿n (hay mßi b°ớc) nên rõ ràng và chỉ mang mát mục đích nhÃt định. Tính ứng dụng Mát giÁi thuÁt có tính phổ biến nếu giÁi thuÁt này có thể giÁi quyết đ°ợc mát lớp các vÃn đề t°¢ng tă. Tính hÿu h¿n Các giÁi thuÁt phÁi kết thúc sau mát số hāu h¿n các b°ớc.
Ngôn ngÿ dißn đ¿t giÁi thu¿t 1. Ngôn ngÿ thông thường Trong cách biểu dißn thuÁt giÁi theo ngôn ngā tă nhiên, ng°ời ta sÿ dụng ngôn ngā th°ờng ngày để liát kê các b°ớc của thuÁt giÁi (Các ví dụ về thuÁt giÁi trong mục 1 của ch°¢ng sÿ dụng ngôn ngā tă nhiên). Ph°¢ng pháp biểu dißn này không yêu cầu ng°ời viết thuÁt giÁi cũng nh° ng°ời đọc thuÁt giÁi phÁi nắm các quy tắc. Tuy vÁy, cách biểu dißn này th°ờng dài dòng, không thể hián rõ cÃu trúc của thuÁt giÁi, đôi lúc gây hiểu lầm hoặc khó hiểu cho ng°ời đọc.
Gần nh° không có mát quy tắc cố định nào trong viác thể hián thuÁt giÁi bằng ngôn ngā tă nhiên 1. Ngôn ngÿ lưu đồ L°u đồ hay s¢ đồ khối là mát công cụ trăc quan để dißn đ¿t các thuÁt giÁi. Biểu dißn thuÁt giÁi bằng l°u đồ sẽ giúp ng°ời đọc theo dõi đ°ợc să phân cÃp các tr°ờng hợp và quá trình xÿ lý của thuÁt giÁi. Ph°¢ng pháp l°u đồ th°ờng đ°ợc dùng trong nhāng thuÁt giÁi có tính rắc rối, khó theo dõi đ°ợc quá trình xÿ lý.
8 Các nút biểu diễn giải thuật bằng sơ đồ khối: Nút thao tác Nút điều khiển: trong đó ghi điều kián cần kiểm tra trong quá trình tính toán. Nút khởi đầu, kết thúc Cung Vẽ l°u đồ hoặc s¢ đồ khối, mßi khối mô tÁ mát b°ớc. Sÿ dụng mũi tên nối khối này với khối kia để chỉ trình tă thăc hián các b°ớc. Để dß dàng nhÁn biết chức năng của từng khối, mßi khối đ°ợc thể hián ở mát d¿ng nh° sau: Ví dụ: Tìm nghiám thăc của ph°¢ng trình bÁc hai ax2+bx+c=0.
ThuÁt toán gồm các b°ớc sau: + NhÁp dā liáu a, b, c. + Tính biát số = b2-4ac. + So sánh với 0. B°ớc tiếp theo sẽ phụ thuác vào giá trị của .
+ Nếu <0, đáp số của bài toán là <Vô nghiám=. + Nếu =0, tính và ghi đáp số trị của nghiám kép. + Nếu >0, tính và ghi đáp số trị của hai nghiám phân biát:. L°u đồ biểu dißn thuÁt toán này đ°ợc thể hián nh° sau: 9 1.
Ngôn ngÿ l¿p trình Tuy s¢ đồ khối thể hián rõ quá trình xÿ lý và să phân cÃp các tr°ờng hợp của thuÁt toán nh°ng l¿i cồng kềnh. Để mô tÁ mát thuÁt toán nhỏ ta phÁi dùng mát không gian rÃt lớn. Đôi khi, ta có thể thể hián thuÁt toán bằng ngôn ngā lÁp trình nào đó. Mọi ngôn ngā lÁp trình đều có nhāng thao tác c¢ bÁn là xÿ lý, rẽ nhánh và lặp.