Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 33 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
33
Dung lượng
238,5 KB
Nội dung
LỜI NÓI ĐẦU “Alorithms + Data Structures = Programs” N Wirth “Computing is an art form Some programs are elegant, some are exquisite, some are sparkling My claim is it is possible to write grand programs, noble programs, truly magnifient programs” D.E.Knuth Cuốn sách trình bày vấn đề bản, quan trọng Cấu trúc liệu (CTDL) thuật toán đề xuất IEEE/ACM computing curricula, theo quan điểm đại Khi thiết kế thuật toán để giải vấn đề, cần phải sử dụng đối tượng liệu phép toán đối tượng liệu mức độ trừu tượng Một nội dung sách nghiên cứu kiểu liệu trừu tượng (KDLTT) CTDL để cài đặt KDLTT KDLTT quan trọng tập động (một tập đối tượng liệu với phép tốn tìm kiếm, xen, loại, …), KDLTT sử dụng rộng rãi chương trình ứng dụng Các KDLTT khác nghiên cứu : danh sách, ngăn xếp, hàng đợi, hàng ưu tiên, từ điển, … Chúng ta cài đặt KDLTT lớp C + + Sự cài đặt KDLTT lớp C + + cho phép ta biểu diễn đối tượng liệu phép toán đối tượng liệu chương trình ứng dụng cách tốn học, ngắn gọn dễ hiểu, tương tự ta sử dụng số nguyên, số thực chương trình Một ưu điểm quan trọng khác là, cho phép thiết kế cài đặt phần mềm, làm việc mức độ quan niệm cao, thực hành nguyên lý lập trình Với KDLTT, nghiên cứu cách cài đặt CTDL khác Hiệu phép toán cách cài đặt đánh giá Sự đánh giá so sánh cách cài đặt giúp cho người sử dụng có lựa chọn thích hợp cho chương trình ứng dụng Thơng qua cài đặt lớp C + + cho KDLTT chương trình ứng dụng chúng, độc giả cung cấp thêm nhiều kỹ thuật lập trình hữu ích Sự nghiên cứu KDLTT tiến hành qua bước sau • Đặc tả KDLTT Chúng ta mô tả đối tượng liệu cách sử dụng ký hiệu, khái niệm toán học logic Các phép toán đối tượng liệu mơ tả hàm tốn học • Lựa chọn CTDL thích hợp để cài đặt đối tượng liệu • Thiết kế cài đặt lớp C + + • Phân tích hiệu phép tốn • Các ví dụ ứng dụng Tổ chức sách Nội dung sách tổ chức thành ba phần Phần nghiên cứu CTDL sử dụng để cài đặt KDLTT, danh sách liên kết (DSLK), tìm kiếm nhị phân (TKNP), thứ tự phận (heap), bảng băm Danh sách, ngăn xếp, hàng đợi cài đặt mảng DSLK Cây TKNP sử dụng để cài đặt tập động Hàng ưu tiên cài đặt hiệu heap Bảng băm CTDL thích hợp để cài đặt từ điển Trong phần nghiên cứu CTDL cao cấp Các CTDL có đặc điểm chung tổ chức liệu phép toán CTDL phức tạp, song bù lại thời gian thực phép toán lại hiệu Chúng ta nghiên cứu loại tìm kiếm cân bằng, CTDL tự điều chỉnh, CTDL đa chiều, … Đặc biệt, đưa vào kỹ thuật phân tích trả góp, kỹ thuật phân tích hoàn toàn mới, sử dụng để đánh giá thời gian chạy dãy phép toán CTDL tự điều chỉnh Phần dành để nói thuật tốn Chúng ta trình bày phương pháp đánh giá thời gian chạy thuật tốn ký hiệu lớn, kỹ thuật để phân tích, đánh giá thời gian chạy thuật toán Một nội dung quan trọng phần nghiên cứu chiến lược thiết kế thuật tốn Chúng ta trình bày chiến lược thiết kế thuật toán hay sử dụng : chia - để trị, quy hoạch động, quay lui, … Các thuật toán xếp, thuật toán đồ thị nghiên cứu Cuối trình bày vấn đề có tính chất lý thuyết, tốn NP – khó NP - đầy đủ Sử dụng sách Để đọc sách này, độc giả cần phải biết lập trình định hứơng đối tượng với C + + Tuy nhiên, đưa vào chương để trình bày số vấn đề quan trọng liên quan tới thiết kế lớp C + +, giúp cho độc giả chưa biết C + + hiểu chương Nội dung sách đề cập tới nhiều vấn đề nội dung giáo trình Cấu trúc liệu thuật tốn cho sinh viên công nghệ thông tin Theo quan điểm chúng tơi, giáo trình Cấu trúc liệu thuật tốn cho sinh viên cơng nghệ thơng tin, nên đưa vào chương 1, 4, 5, 6, 7, 8, phần I chương 15, 16, 17, 18 phần II Nếu sinh viên chưa làm quen với đánh giá thời gian chạy thuật tốn, nội dung chương 15 cần dạy trước Lời cảm ơn Chúng xin chân thành cảm ơn đồng nghiệp môn Khoa học máy tính, Khoa cơng nghệ thơng tin, Trường Đại học Cơng nghệ, Đại học Quốc gia Hà Nội, trao đổi bổ ích vấn đề đề cập sách, đặc biệt TS Phạm Hồng Thái, ThS Trần Quốc Long ThS Ma Thị Châu chúng tơi giảng dạy giáo trình Cấu trúc liệu thuật tốn Chúng tơi xin chân thành cảm ơn Trường Đại học công nghệ, Đại học Quốc gia Hà Nội tạo điều kiện tốt cho viết sách Tháng Giêng, 2007 Đinh Mạnh Tường MỤC LỤC Phần Các cấu trúc liệu 12 Chương 1.1 1.2 1.3 13 13 17 21 21 23 26 30 34 34 36 36 38 41 45 55 55 65 67 74 77 77 84 88 98 1.4 1.5 Chương 2.1 2.2 2.3 2.4 2.5 Chương 3.1 3.2 3.3 Chương Sự trừu tượng hoá liệu Biểu diễn liệu ngơn ngữ lập trình Sự trừu tượng hoá liệu Kiểu liệu trừu tượng 1.3.1 Đặc tả kiểu liệu trừu tượng 1.3.2 Cài đặt kiểu liệu trừu tượng Cài đặt kiểu liệu trừu tượng C Triết lý cài đặt Kiểu liệu trừu tượng lớp C ++ Lớp thành phần lớp Các hàm thành phần 2.2.1 Hàm kiến tạo hàm huỷ 2.2.2 Các tham biến hàm 2.2.3 Định nghĩa lại phép toán Phát triển lớp cài đặt kiểu liệu trừu tượng Lớp khuôn 2.4.1 Lớp côngtơnơ 2.4.2 Hàm khuôn 2.4.3 Lớp khuôn Các kiểu liệu trừu tượng quan trọng Sự thừa kế Các lớp dẫn xuất Hàm ảo tính đa hình Lớp sở trừu tượng Danh sách 4.1 4.2 4.3 4.4 Kiểu liệu trừu tượng danh sách 98 Cài đặt danh sách mảng 101 Cài đặt danh sách mảng động 109 Cài đặt tập động danh sách Tìm kiếm tìm kiếm nhị phân 117 4.4.1 Cài đặt danh sách không Tìm kiếm 117 4.4.2 Cài đặt danh sách Tìm kiếm nhị phân 120 4.5 Ứng dụng 126 Chương Danh sách liên kết 137 5.1 Con trỏ cấp phát động nhớ 137 5.2 Cấu trúc liệu danh sách liên kết 141 5.3 Các dạng danh sách liên kết khác 148 5.3.1 Danh sách liên kết vòng tròn 148 5.3.2 Danh sách liên kết có đầu giả 150 5.3.3 Danh sách liên kết kép 151 5.4 Cài đặt danh sách danh sách liên kết 154 5.5 So sánh hai phương pháp cài đặt danh sách 162 5.6 Cài đặt tập động danh sách liên kết 164 Chương Ngăn xếp 168 6.1 Kiểu liệu trừu tượng ngăn xếp 168 6.2 Cài đặt ngăn xếp mảng 169 6.3 Cài đặt ngăn xếp danh sách liên kết 172 6.4 Biểu thức dấu ngoặc cân xứng 176 6.5 Đánh giá biểu thức số học 178 6.5.1 Đánh giá biểu thức postfix 178 6.5.2 Chuyển biểu thức infix thành postfix 180 6.6 Ngăn xếp đệ quy 183 Chương Hàng đợi 187 7.1 Kiểu liệu trừu tượng hàng đợi 187 7.2 Cài đặt hàng đợi mảng 188 7.3 7.4 Chương 8.1 8.2 8.3 8.4 8.5 8.6 Chương 9.1 9.2 9.3 9.4 9.5 9.6 Chương 10 10.1 10.2 10.3 Cài đặt hàng đợi danh sách liên kết 194 Mô hệ hàng 298 Cây 203 Các khái niệm 204 Duyệt 209 Cây nhị phân 213 Cây tìm kiếm nhị phân 220 8.4.1 Cây tìm kiếm nhị phân 220 8.4.2 Các phép tốn tập động tìm kiếm nhị phân 223 Cài đặt tập động tìm kiếm nhị phân 231 Thời gian thực phép toán tập động tìm kiếm nhị phân 237 Bảng băm 242 Phương pháp băm 242 Các hàm băm 245 9.2.1 Phương pháp chia 245 9.2.2 Phương pháp nhân 246 9.2.3 Hàm băm cho giá trị khoá xâu ký tự 246 Các phương pháp giải va chạm 248 9.3.1 Phương pháp định địa mở 248 9.3.2 Phương pháp tạo dây chuyền 253 Cài đặt bảng băm địa mở 254 Cài đặt bảng băm dây chuyền 260 Hiệu phương pháp băm 265 Hàng ưu tiên 269 Kiểu liệu trừu tượng hàng ưu tiên 269 Các phương pháp đơn giản cài đặt hàng ưu tiên 270 10.2.1 Cài đặt hàng ưu tiên danh sách 270 10.2.2 Cài đặt hàng ưu tiên tìm kiếm nhị phân 271 Cây thứ tự phận 272 10.3.1.Các phép toán hàng ưu tiên thứ tự phận 273 10.3.2 Xây dựng thứ tự phận 10.4 Cài đặt hàng ưu tiên thứ tự phận 10.5 Nén liệu mã Huffman 278 282 287 Phần Các cấu trúc liệu cao cấp 296 Chương 11 Các tìm kiếm cân 11.1 Các phép quay 11.2 Cây AVL 11.2.1.Các phép toán tập động AVL 11.2.2.Cài đặt tập động AVL 11.3 Cây đỏ - đen 11.4 Cấu trúc liệu tự điều chỉnh 11.5 Phân tích trả góp 11.6 Cây tán loe 11.6.1.Các phép tốn tập động tán loe 11.6.2.Phân tích trả góp Chương 12 Hàng ưu tiên với phép toán hợp 12.1 Hàng ưu tiên với phép toán hợp 12.2 Các phép toán hợp giảm khoá thứ tự phận 12.3 Cây nghiêng 12.3.1.Các phép toán hàng ưu tiên nghiêng 12.3.2.Phân tích trả góp Chương 13 Họ tập không cắt 13.1 Kiểu liệu trừu tượng họ tập không cắt 13.2 Cài đặt đơn giản 13.3 Cài đặt 13.3.1.Phép hợp theo trọng số 13.3.2.Phép tìm với nén đường 13.4 Ứng dụng 297 297 298 301 309 315 327 328 330 336 338 341 341 342 342 343 348 352 352 353 354 357 360 362 Chương 14 14.1 14.2 14.3 14.4 13.4.1.Vấn đề tương đương 13.4.2.Tạo mê lộ Các cấu trúc liệu đa chiều Các phép toán liệu đa chiều Cây k - chiều 14.2.1.Cây - chiều 14.2.2.Cây k - chiều Cây tứ phân Cây tứ phân MX Phần Thuật toán Chương 15 15.1 15.2 15.3 15.4 15.5 Chương 16 16.1 16.2 16.3 363 364 367 367 368 369 377 378 382 388 Phân tích thuật tốn 389 Thuật tốn vấn đề liên quan 389 Tính hiệu thuật tốn 391 Ký hiệu lớn biểu diễn thời gian chạy ký hiệu ô lớn 394 15.3.1.Định nghĩa ký hiệu ô lớn 394 15.3.2.Biểu diễn thời gian chạy thuật toán 395 Đánh giá thời gian chạy thuật toán 398 15.4.1.Luật tổng 398 15.4.2.Thời gian chạy lệnh 399 Phân tích hàm đệ quy 402 Các chiến lược thiết kế thuật toán 409 Chia - để - trị 409 16.1.1.Phương pháp chung 409 16.1.1.Tìm max 411 Thuật toán đệ quy 413 Quy hoạch động 418 16.3.1.Phương pháp chung 418 16.3.2.Bài toán xếp đồ vật vào balơ 419 16.3.3.Tìm dãy chung hai dãy số 421 16.4 Quay lui 16.4.1.Tìm kiếm vét can 16.4.2.Quay lui 16.4.3.Kỹ thuật quay lui để giải toán tối ưu 16.5 Chiến lược tham ăn 16.5.1.Phương pháp chung 16.5.2.Thuật toán tham ăn cho toán người bán hàng 16.5.3.Thuật toán tham ăn cho toán balơ 16.6 Thuật tốn ngẫu nhiên Chương 17 Sắp xếp 17.1 Các thuật toán xếp đơn giản 17.1.1.Sắp xếp lựa chọn 17.1.2.Sắp xếp xen vào 17.1.3.Sắp xếp bọt 17.2 Sắp xếp hoà nhập 17.3 Sắp xếp nhanh 17.4 Sắp xếp sử dụng thứ tự phận Chương 18 Các thuật toán đồ thị 18.1 Một số khái niệm 18.2 Biểu diễn đồ thị 18.2.1.Biểu diễn đồ thị ma trận kề 18.2.2.Biểu diễn đồ thị danh sách kề 18.3 Đi qua đồ thị 18.3.1.Đi qua đồ thị theo bề rộng 18.3.2 Đi qu đồ thị theo độ sâu 18.4 Đồ thị định hướng chu trình xếp topo 18.5 Đường ngắn 18.5.1.Đường ngắn từ đỉnh nguồn 18.5.2 Đường ngắn cặp đỉnh 18.6 Cây bao trùm ngắn 18.6.1.Thuật toán Prim 422 422 424 430 432 432 433 434 435 443 444 444 446 447 448 452 459 464 464 466 466 468 469 469 472 477 480 480 485 488 489 10 mơ hình liệu đồ thị này, đưa thuật toán lập lịch sau: Bước 1: Chọn đỉnh bất kì, đưa mơn thi ứng với đỉnh vào danh sách môn thi ngày thi (danh sách ban đầu rỗng) Đánh dấu đỉnh chọn tất đỉnh kề Trong đỉnh chưa đánh dấu, lại chọn đỉnh đưa mơn thi ứng với đỉnh vào danh sách môn thi ngày thi Lại đánh dấu đỉnh vừa chọn đỉnh kề Tiếp tục q trình tất đỉnh đồ thị đánh dấu, nhận danh sách môn thi ngày thi Bước 2: Loại khỏi đồ thị tất đỉnh xếp vào danh sách môn thi ngày thi bước loại tất cạnh kề đỉnh Các đỉnh cạnh lại tạo thành đồ thị Bước 3: Lặp lại bước bước đồ thị trở thành rỗng Chẳng hạn, giả sử môn tổ chức thi A, B, C, D, E, F đồ thị xây dựng nên từ liệu vào cho hình sau: A D B E C F Khi lịch thi sau: Ngày thi 1: A, F Ngày thi 2: D, E, B Ngày thi 3: C Sau đặc tả vấn đề, chuyển sang giai đoạn thiết kế thuật toán để giải vấn đề Ở mức độ cao trừu tượng hoá, thuật toán thiết kế dãy hành động đối tượng liệu thực theo trình tự logic Thuật tốn lập lịch thi ví dụ Các đối tượng liệu số nguyên, số thực, ký tự; 19 điểm mặt phẳng; hình hình học; người, danh sách đối tượng (chẳng hạn, danh sách mơn thi ví dụ lập lịch thi); đồ thị, cây, … Các hành động đối tượng liệu đa dạng tuỳ thuộc vào loại đối tượng liệu Chẳng hạn, đối tượng liệu điểm mặt phẳng, hành động là: quay điểm góc đó, tịnh tiến điểm theo hướng, tính khoảng cách hai điểm, … Khi đối tượng liệu danh sách, hành động là: loại đối tượng khỏi danh sách, xen đối tượng vào danh sách, tìm xem đối tượng cho có danh sách hay không, … Khi thiết kế thuật toán dãy hành động đối tượng liệu, cần sử dụng trừu tượng hoá liệu (data abstraction) Sự trừu tượng hố liệu có nghĩa quan tâm tới tập đối tượng liệu (ở mức độ trừu tượng) hành động (các phép tốn) thực đối tượng liệu (với điều kiện hành động thực sau thực hành động cho kết gì), khơng quan tâm tới đối tượng liệu lưu trữ nhớ máy tính, không quan tâm tới hành động thực Sử dụng trừu tượng hoá liệu thiết kế thuật toán phương pháp luận thiết kế quan trọng Nó có ưu điểm sau: • Đơn giản hố q trình thiết kế, giúp ta tránh phức tạp liên quan tới biểu diễn cụ thể liệu • Chưong trình có tính mođun (modularity) Chẳng hạn, hành động đối tượng liệu phức tạp cài đặt thành mođun (một hàm) Chương trình có tính mođun dễ đọc, dễ phát lỗi, dễ sửa, … Sự trừu tượng hoá liệu thực cách xác định kiểu liệu trừu tượng ( Abstract Data Type) Kiểu liệu trừu tượng (KDLTT) tập đối tượng liệu với phép tốn 20 thực đối tượng liệu Ví dụ, tập điểm mặt phẳng với phép toán điểm mà xác định tạo thành KDLTT điểm Chúng ta sử dụng phép tốn KDLTT thiết kế thuật toán biết rõ điều kiện để phép tốn thực hiệu mà phép toán mang lại Trong nhiều trường hợp, KDLTT mà biết gợi cho ta ý tưởng thiết kế thuật tốn Đồng thời q trình thiết kế, thuật toán cần đến hành động loại đối tượng liệu thiết kế KDLTT để sử dụng không chương trình mà ta thiết kế mà cịn chương trình khác Phần lớn nội dung sách nói KDLTT Chúng ta nghiên cứu thiết kế cài đặt số KDLTT quan trọng sử dụng thường xuyên thiết kế thuật toán 1.3 KIỂU DỮ LIỆU TRỪU TƯỢNG Mục trình bày phương pháp đặc tả cài đặt KDLTT 1.3.1 Đặc tả kiểu liệu trừu tượng Nhớ lại rằng, KDLTT định nghĩa tập đối tượng liệu tập phép tốn đối tượng liệu Do đó, đặc tả KDLTT gồm hai phần: đặc tả đối tượng liệu đặc tả phép tốn • Đặc tả đối tượng liệu Mơ tả tốn học đối tượng liệu Thơng thường đối tượng liệu đối tượng giới thực, chúng thực thể phức hợp, có cấu trúc Để mơ tả chúng, cần sử dụng trừu tượng hoá (chỉ quan tâm tới đặc tính quan trọng, bỏ qua chi tiết thứ yếu) Nói cụ thể hơn, để mơ tả xác đối tượng liệu , cần sử 21 dụng khái niệm toán học, mơ hình tốn học tập hợp, dãy, đồ thị, cây, … Chẳng hạn, đối tượng liệu sinh viên, biểu diễn tập thuộc tính quan trọng tên, ngày sinh, giới tính, … • Đặc tả phép tốn Việc mơ tả phép tốn phải đủ chặt chẽ, xác nhằm xác định đầy đủ kết mà phép tốn mang lại, khơng cần phải mơ tả phép toán thực kết Cách tiếp cận xác để đạt mục tiêu mô tả phép toán, xác định tập tiên đề mơ tả đầy đủ tính chất phép toán Chẳng hạn, phép toán cộng nhân số nguyên phải thoả mãn tiên đề: giao hoán, kết hợp, phân phối, … Tuy nhiên, việc xác định tập đầy đủ tiên đề mơ tả đầy đủ chất phép tốn khó khăn, mơ tả phép tốn cách khơng hình thức Chúng ta mơ tả phép tốn hàm (hoặc thủ tục), tên hàm tên phép toán, theo sau danh sách biến Sau rõ nhiệm vụ mà hàm cần phải thực Ví dụ Sau đặc tả KDLTT số phức Trong sách này, đặc tả KDLTT khác theo khn mẫu ví dụ Mỗi số phức cặp số thực (x, y), x gọi phần thực (real), y gọi phần ảo (image) số phức Trên số phức, thực phép tốn sau: Create (a, b) Trả số phức có phần thực a, phần ảo b GetReal (c) Trả phần thực số phức c GetImage (c) Trả phần ảo số phức c Abs (c) Trả giá trị tuyệt đối (mođun) số phức c Add (c1,c2) Trả tổng số phức c1 số phức c2 Multiply (c1 , c2 ) Trả tích số phức c1 số phức c2 Print (c) Viết số phức c dạng a + i b a phần thực, b phần ảo số phức c 22 Trên số phép tốn số phức Cịn nhiều phép tốn khác số phức, chẳng hạn phép toán so sánh, phép toán lượng giác, …, ngắn không liệt kê hết 1.3.2 Cài đặt kiểu liệu trừu tượng Trong giai đoạn đặc tả, mơ tả phép tốn đối tượng liệu, chưa xác định phép tốn thực nhiệm vụ Trong chương trình, để sử dụng phép toán KDLTT đặc tả, cần phải cài đặt KDLTT ngơn ngữ lập trình Cơng việc phải làm cài đặt KDLTT chọn CTDL để biểu diễn đối tượng liệu Cần lưu ý rằng, CTDL liệu phức hợp tạo nên từ nhiều liệu thành phần liên kết Chúng ta mơ tả CTDL ngơn ngữ lập trình (chẳng hạn, C/ C + +) cách sử dụng phương tiện có sẵn ngơn ngữ lập trình đó, chẳng hạn sử dụng qui tắc cú pháp mô tả mảng, cấu trúc, … Một CTDL xác định cho ta cách lưu trữ liệu nhớ máy tính Ví dụ Chúng ta biểu diễn số phức cấu trúc C + + struct complex { float real; float imag; } Cần ý rằng, đối tượng liệu cài đặt CTDL khác Chẳng hạn, danh sách (a 1, a2, …, an) cài đặt mảng A, thành phần danh sách lưu thành phần liên tiếp mảng A[0], A[1],…, A[n-1] Nhưng cài đặt danh sách CTDL danh sách liên kết sau: 23 a1 a2 an Sau chọn CTDL biểu diễn đối tượng liệu, bước phải thiết kế cài đặt hàm thực phép toán KDLTT Trong giai đoạn thiết kế hàm thực nhiệm vụ phép toán, cần sử dụng trừu tượng hoá hàm (functional abstraction) Sự trừu tượng hoá hàm có nghĩa cần mơ tả hàm cho người sử dụng biết hàm thực công việc gì, cho họ sử dụng hàm chương trình mà khơng cần biết đến chi tiết cài đặt, tức không cần biết hàm thực cơng việc Sự trừu tượng hoá hàm thực cách viết mẫu hàm (function prototype) kèm theo thích Mẫu hàm gồm tên hàm theo sau danh sách tham biến Tên hàm cần ngắn ngọn, nói lên nhiệm vụ hàm Các tham biến cần phải đầy đủ: liệu vào cần thiết để hàm thực cơng việc liệu sau hàm hồn thành cơng việc Chú thích đưa sau đầu hàm cần thiết (đặc biệt đề án lập trình theo đội) Trong thích này, cần mơ tả đầy đủ, xác nhiệm vụ hàm Sau hai phần: Preconditions (các điều kiện trước) Postconditions (các điều kiện sau) • Preconditions gồm phát biểu điều kiện cần phải thoả mãn trước hàm thực • Postconditions gồm phát biểu điều kiện cần phải thoả mãn sau hàm hoàn thành thực Hai phần Preconditions Postconditions tạo thành hợp đồng bên người sử dụng hàm bên hàm Preconditions trách nhiệm người sử dụng, Postconditions trách nhiệm hàm Một sử dụng hàm (gọi hàm), người sử dụng phải có trách nhiệm cung cấp 24 cho hàm liệu vào thoả mãn điều kiện Preconditions Sau hoàn thành thực hiện, hàm phải cho kết thoả mãn điều kiện Postconditions Sau ví dụ mẫu hàm: void Sort (int A[ ], int n) // Sắp xếp mảng A theo thứ tự không giảm // Preconditions: A mảng số nguyên có cỡ Max ≥ n // Postconditions: A[0] ≤ A[1] ≤ … ≤ A[n-1], // n không thay đổi Bước tiếp theo, phải thiết kế thuật tốn thực cơng việc hàm mà đối tượng liệu biểu diễn CTDL chọn Việc cài đặt hàm chuyển dịch thuật toán thực nhiệm vụ hàm sang dãy khai báo biến địa phương cần thiết câu lệnh Tất chi tiết mà hàm cần thực công việc riêng tư hàm, người sử dụng hàm không cần biết đến, không can thiệp vào Làm có nghĩa thực hành nguyên lý che dấu thông tin (the principle of information hiding) - nguyên lý quan trọng phương pháp luận lập trình mơđun Trên trình bày kỹ thuật liên quan đến thiết kế CTDL cho đối tượng liệu, thiết kế cài đặt hàm cho phép toán KDLTT Câu hỏi đặt là: Chúng ta phải tổ chức CTDL hàm nào? Có hai cách: cách cài đặt cổ điển cách cài đặt định hướng đối tượng Mục sau trình bày phương pháp cài đặt KDLTT ngôn ngữ C Cài đặt KDLTT lớp C + + trình bày chương 1.4 CÀI ĐẶT KIỂỦ DỮ LIỆU TRỪU TƯỢNG TRONG C 25 Trong mục trình bày phương pháp cài đặt KDLTT theo cách truyền thống (cài đặt không định hướng đối tượng) C Trong cách cài đặt này, xây dựng nên thư viện hàm thực phép tốn KDLTT cho bạn sử dụng hàm chương trình giống bạn sử dụng hàm thư viện chuẩn Sự xây dựng thư viện điển hình tổ chức thành hai file: file đầu (header file) file cài đặt (implementation file) • File đầu chứa mệnh đề # include, định nghĩa hằng, … cần thiết khai báo CTDL Theo sau mẫu hàm cho phép tốn KDLTT • File cài đặt chứa mệnh đề # include cần thiết chứa định nghĩa hàm đặc tả file đầu Tên file đầu có h, file cài đặt có c (hoặc cpp, cxx) File cài đặt dịch kết nối vào file thực cần thiết Với cách tổ chức này, bạn sử dụng hàm KDLTT giống hệt bạn sử dụng hàm thư viện chuẩn Chỉ có việc bạn cần nhớ bạn phải include file đầu vào chương trình bạn mệnh đề: # include “tên file đầu” Người sử dụng hàm KDLTT cần biết thông tin file đầu, không cần biết hàm cài đặt (các thông tin file cài đặt) Ví dụ Cài đặt KDLTT số phức đặc tả mục 2.3 File đầu complex.h cho hình 2.1 Nội dung file nằm mệnh đề # ifndef … # define … # endif Đây định tiền xử lý cần thiết phải có nhằm đảm bảo file đầu có mặt lần file nguồn chương trình bạn // File : complex.h # ifndef COMPLEX_H # define COMPLEX_H 26 struct Complex { double real; double image; }; Complex CreateComplex (double a, double b) ; // Postcondition: Trả số phức có phần thực a, phần ảo b double GetReal (Complex c); // Postcondition: Trả phần thực số phức c double GetImag (Complex c); // Postcondition: Trả phần ảo số phức c double GetAbs (Complex c); // Postcondition: Trả giá trị tuyệt đối (mođun) số phức c Complex Add (Complex c1, Complex c2); // Postcondition: Trả số phức tổng số phức c1 số phức c2 Complex Multiply (Complex c1, Complex c2); // Postcondition: Trả số phức tích số phức c1 số phức c2 void Print (Complex c); // Postcondition: số phức c viết dạng a + ib, a // phần thực, b phần ảo số phức c // Mẫu hàm phép toán khác # endif 27 Hình 1.1 File đầu cài đặt khơng định hướng đối tượng KDLTT số phức C/C + + File cài đặt KDLTT số phức cho hình 1.2 Trong file cài đặt, ngồi mệnh đề # include cần thiết cho cài đặt hàm, thiết phải có mệnh đề # include “tên file đầu” // File: Complex.cxx # include “complex.h” # include < math.h > # include < iostream.h > // cung cấp hàm sqrt // cung cấp đối tượng cout Complex CreateComplex (double a, double b) { Complex c ; c.real = a ; c.imag = b ; return c ; } double GetReal (Complex c) { return c.real ; } double GetImag (Complex c) { return c.imag ; } 28 double GetAbs (Complex c) { double result ; result = sqrt ( c.real * c.real + c.imag * c.imag); return result ; } Complex Add (Complex c1, Complex c2) { Complex c ; c.real = c1.real + c2.real ; c.imag = c1.imag + c2.imag ; return c ; } Complex Multiply (Complex c1, Complex c2) { Complex c ; c.real = (c1.real * c2.real) – (c1.imag * c2.imag) ; c.imag = (c1.real *c2.imag) + (c1.imag * c2.real) ; return c ; } void Print (Complex c) { cout