1.2.Giới thiệu môn học Cấu trúc dữ liệu CTDL và giải thuật Theo quan điểm của phân tích thiết kế hướng đối tượng, mỗi lớp sẽ được xây dựng với một số chức năng nào đó và các đối tượng củ
TRƯỜNG ĐẠI HỌC QUY NHƠN KHOA KỸ THUẬT VÀ CÔNG NGHỆ - - BÀI GIẢNG Cấu Trúc Dữ Liệu Giải Thuật Biên soạn: GVC ThS Nguyễn Đình Luyện Bộ mơn: Điện tử - Viễn thơng Tài liệu lưu hành nội Chương 1: Giới thiệu Phần – PHẦN MỞ ĐẦU Chương – GIỚI THIỆU 1.1 Về phương pháp phân tích thiết kế hướng đối tượng Thông thường phần quan trọng trình phân tích thiết kế chia vấn đề thành nhiều vấn đề nhỏ dễ hiểu chi tiết Nếu chúng khó hiểu, chúng lại chia nhỏ Trong tổ chức nào, người quản lý cao quan tâm đến chi tiết hoạt động Họ cần tập trung vào mục tiêu nhiệm vụ chính, họ chia bớt trách nhiệm cho người cộng quyền họ Việc lập trình máy tính tương tự Ngay dự án đủ nhỏ cho người thực từ đầu tới cuối, việc chia nhỏ công việc quan trọng Phương pháp phân tích thiết kế hướng đối tượng dựa quan điểm Cái khó định lớp cho lớp sau cung cấp đối tượng có hành vi mong đợi Việc lập trình giải toán lớn tập trung vào giải thuật lớn Chương trình xem kịch bản, đối tượng gọi để thực hành vi vào lúc cần thiết Chúng ta lo bị phương hướng chi tiết vụn vặt cần phải phác thảo kịch đắn, tin tưởng hoàn toàn vào khả hoàn thành nhiệm vụ lớp mà giao phó Các lớp người lập trình định nghóa đóng vai trò trung tâm việc thực giải thuật 1.2 Giới thiệu môn học Cấu trúc liệu (CTDL) giải thuật Theo quan điểm phân tích thiết kế hướng đối tượng, lớp xây dựng với số chức đối tượng tham gia vào hoạt động chương trình Điểm mạnh hướng đối tượng tính đóng kín tính sử dụng lại lớp Mỗi phần mềm biên dịch cho ngôn ngữ lập trình chứa nhiều thư viện lớp Chúng ta thử điểm qua số lớp mà người lập trình thường hay sử dụng: lớp có nhiệm vụ đọc/ ghi để trao đổi liệu với thiết bị ngoại vi đóa, máy in, bàn phím,…; lớp đồ họa cung cấp chức vẽ, tô màu bản; lớp điều khiển cho phép xử lý việc giao tiếp với người sử dụng thông qua bàn phím, chuột, hình; lớp phục vụ giao dịch truyền nhận thông tin qua mạng;…Các lớp CTDL mà bàn đến không trường hợp ngoại lệ Có thể chia tất lớp thành hai nhóm chính: • Các lớp dịch vụ • Các lớp có khả lưu trữ xử lý lượng liệu lớn Giáo trình Cấu trúc liệu Giải thuật 1/16 Chương 1: Giới thiệu Nhóm thứ hai muốn nói đến lớp CTDL (CTDL) Vậy có giống khác lớp CTDL lớp khác? • Điểm giống lớp CTDL lớp khác: lớp phải thực số chức thông qua hành vi đối tượng Một xây dựng xong lớp CTDL đó, hoàn toàn tin tưởng hoàn thành xuất sắc nhiệm vụ mà thiết kế giao phó cho Điều khác biệt so với tài liệu viết CTDL theo quan điểm hướng thủ tục trước đây: việc xử lý liệu tính đóng kín tính sử dụng lại Tuy mặt thực thi chương trình có khả chạy nhanh hơn, chúng bộc lộ nhiều nhược điểm: thời gian phát triển giải thuật chậm gây khó khăn nhiều cho người lập trình, chương trình thiếu tính sáng, khó sửa lỗi phát triển • Đặc trưng riêng lớp CTDL: Nhiệm vụ lớp CTDL nắm giữ liệu cho đáp ứng chương trình yêu cầu trả liệu cụ thể mà chương trình cần đến Những thao tác CTDL thường là: thêm liệu mới, xóa bỏ liệu có, tìm kiếm, truy xuất Ngoài thao tác liệu bản, CTDL khác khác thao tác bổ sung khác Chính điều mà thiết kế giải thuật để giải toán lớn, người ta lựa chọn CTDL thích hợp Chúng ta thử xem xét ví dụ thật đơn giản sau Giả sử cần viết chương trình nhận vào dãy số, in chúng theo thứ tự ngược với thứ tự nhập vào ban đầu Để giải toán này, nghó đến việc phải khai báo biến để lưu giá trị nhập vào nào, sau thứ tự in để đáp ứng yêu cầu toán, dường quên áp dụng nguyên tắc lập trình hướng đối tượng: phải bận tâm đến việc chi tiết Đây ví dụ vô đơn giản, minh họa cho vai trò CTDL Nếu nhớ rằng, việc tổ chức lưu liệu việc chi tiết tỉ mỉ không nên thực vào lúc này, lúc bước đầu hiểu vai trò lớp CTDL Môn CTDL giải thuật giúp hiểu rõ lớp CTDL có sẵn phần mềm Hơn nữa, học cách xây dựng lớp CTDL từ đơn giản đến phức tạp, nắm phương pháp kỹ thông qua số nguyên tắc chung Từ đó, khả hiểu rõ để lựa chọn cách đắn CTDL có sẵn, có khả xây dựng lớp CTDL phức tạp hơn, tinh tế thích hợp toán mà cần giải Khả thừa kế CTDL có sẵn để phát triển thêm tính mong muốn điều đáng lưu ý Giáo trình Cấu trúc liệu Giải thuật 2/16 Chương 1: Giới thiệu Với ví dụ trên, tiếp xúc nhiều với việc lập trình không xa lạ với khái niệm “ngăn xếp” Đây CTDL đơn giản lại thông dụng, dó nhiên có dịp học kỹ Ở muốn mượn để minh họa, nhằm giúp cho người đọc làm quen với phương pháp tiếp cận hoàn toàn quán suốt giáo trình Giả sử CTDL ngăn xếp giao cho nhiệm vụ cất giữ liệu trả có yêu cầu, theo quy định bất di bất dịch liệu đưa vào sau phải lấy trước Bằng cách sử dụng CTDL ngăn xếp, chương trình trở nên đơn giản trình bày ngôn ngữ sau: Lặp nhập đủ số mong muốn { Nhập số Cất vào ngăn xếp số vừa nhập } Lặp mà ngăn xếp liệu { Lấy từ ngăn xếp số In số vừa lấy } Chúng ta có dịp gặp nhiều toán phức tạp mà cần sử dụng đến đặc tính ngăn xếp Tính đóng kín lớp giúp cho chương trình vô sáng Đoạn chương trình không cho thấy ngăn xếp làm việc với liệu đưa vào nào, nhiệm vụ mà giao phó cho hoàn toàn yên tâm điều Bằng cách này, có CTDL thích hợp, người lập trình dễ dàng giải toán lớn Họ yên tâm tập trung vào điểm mấu chốt để xây dựng, tinh chế giải thuật kiểm lỗi Trên vừa giới thiệu phần CTDL nằm nội dung môn học “CTDL giải thuật” Vậy giải thuật gì? Đứng quan điểm thiết kế lập trình hướng đối tượng, hiểu vai trò lớp Vậy có lớp người ta cần xây dựng kịch cho đối tượng hoạt động nhằm giải toán Chúng ta cần cấu trúc chương trình để tạo kịch đó: việc làm trước, việc làm sau; việc làm tình đặc biệt đó; việc cần làm lặp lại nhiều lần Chúng ta nhắc đến giải thuật quay với khái niệm “lập trình thủ tục” trước Ngoài ra, cần đến giải thuật cần thực cho lớp: xong phần đặc tả phương thức - phương tiện giao tiếp lớp với bên - cần đến khái niệm “lập trình thủ tục” để giải phần thực bên Giáo trình Cấu trúc liệu Giải thuật 3/16 Chương 1: Giới thiệu phương thức Đó việc phải xử lý liệu bên chúng hoàn thành chức mà phương thức phải đảm nhiệm Như vậy, phần giải thuật môn học này, chủ yếu tìm hiểu giải thuật mà phương thức lớp CTDL dùng đến, số giải thuật xếp tìm kiếm, giải thuật ứng dụng minh họa việc sử dụng lớp CTDL để giải số toán Trong giáo trình này, ý tưởng giải thuật trình bày cặn kẽ, phần chương trình dùng ngôn ngữ C++ ngôn ngữ giả theo quy ước cuối chương Phần đánh giá giải thuật nêu kết chứng minh kiểm nghiệm, sinh viên tìm hiểu kỹ sách tham khảo 1.3 Cách tiếp cận trình tìm hiểu lớp CTDL 1.3.1 Các bước trình phân tích thiết kế hướng đối tượng Quá trình phân tích thiết kế hướng đối tượng giải toán gồm bước sau: Định lớp với chức mà mong đợi Công việc giống công việc phân công công việc cho nhân viên tham gia dự án Giải toán cách lựa chọn giải thuật Đó việc tạo môi trường để đối tượng lớp nêu tương tác lẫn Giải thuật xem kịch dẫn dắt đối tượng thực hành vi chúng vào thời điểm cần thiết Hiện thực cho lớp Ý tưởng nằm bước thứ hai, cho lớp chưa thực, hoàn toàn sử dụng chúng sau biết rõ chức mà lớp phải hoàn thành Trung thành với quan điểm hướng đối tượng, nêu phương pháp tiếp cận mà sử dụng cách hoàn toàn quán việc nghiên cứu xây dựng lớp CTDL Ứng dụng chương 18 chương trình Game Of Life dẫn chứng bước phân tích thiết kế trình xây dựng nên chương trình Sinh viên tham khảo phần Riêng phần 18.4.2 phiên thứ hai chương trình sinh viên tham khảo sau đọc qua chương danh sách chương 12 bảng băm Giáo trình Cấu trúc liệu Giải thuật 4/16 Chương 1: Giới thiệu 1.3.2 Quá trình xây dựng lớp CTDL Chúng ta xây dựng từ lớp CTDL đơn giản lớp CTDL phức tạp Tuy nhiên, trình thiết kế thực cho lớp CTDL tuân theo bước sau đây: Xuất phát từ mô hình toán học hay dựa vào nhu cầu thực tế đó, định chức lớp CTDL cần có Bước giống bước thứ trên, lớp CTDL, lớp khác, cung cấp cho đối tượng để hoạt động chương trình Và vậy, nhiệm vụ mà giao cho cách rõ ràng xác bước sau Đặc tả đầy đủ cách thức giao tiếp lớp CTDL thiết kế với môi trường (các chương trình sử dụng nó) Phần giao tiếp mô tả thông qua định nghóa phương thức lớp Mỗi phương thức hành vi đối tượng CTDL sau này, phần đặc tả gồm yếu tố sau: • Kiểu kết mà phương thức trả • Các thông số vào / • Các điều kiện ban đầu trước phương thức gọi (precondition) • Các kết mà phương thức làm (postcondition) • Các lớp, hàm có sử dụng phương thức (uses) Thông qua phần đặc tả này, CTDL hoàn toàn sử dụng việc xây dựng nên giải thuật lớn toán lớn Phần đặc tả xem cam kết mà không quyền thay đổi Có chương trình có sử dụng CTDL không bị thay đổi sử dụng chúng Tìm hiểu phương án thực cho lớp CTDL Chúng ta nên nhớ rằng, có nhiều cách thực khác cho đặc tả lớp CTDL Về mặt hiệu quả, có phương án gần giống nhau, có phương án khác xa Điều phụ thuộc nhiều vào cách tổ chức liệu bên thân lớp CTDL, vào giải thuật liên quan đến việc xử lý liệu phương thức Chọn phương án thực lớp Trong bước bao gồm việc kiểm tra để hoàn tất lớp CTDL lớp để bổ sung vào thư viện, người lập trình sử dụng chúng nhiều chương trình sau Công việc bước kể vất vả, phải kiểm tra thật kỹ lưỡng, trước đưa sản phẩm đóng gói, mà người khác hoàn toàn yên tâm sử dụng chúng Giáo trình Cấu trúc liệu Giải thuật 5/16 Chương 1: Giới thiệu Để có sản phẩm hoàn hảo thực điều cam kết, bước thứ hai xem bước quan trọng Và để có định nghóa đặc tả đầy đủ xác cho CTDL đó, bùc thứ hai phải thực hoàn toàn độc lập với hai bước sau Đây nguyên tắc vô quan trọng mà phải tuân thủ cách triệt để Vì trường hợp ngược lại, việc xem xét sớm chi tiết cụ thể làm cho dễ có nhìn phiến diện, điều dễ dẫn đến đặc tả mang nhiều sơ suất 1.4 Một số định nghóa Chúng ta bắt đầu định nghóa kiểu liệu (type): 1.4.1 Định nghóa kiểu liệu Định nghóa: Một kiểu liệu tập hợp, phần tử tập hợp gọi trị kiểu liệu Chúng ta gọi kiểu số nguyên tập số nguyên, kiểu số thực tập số thực, kiểu ký tự tập ký hiệu mà mong muốn sử dụng giải thuật Lưu ý phân biệt kiểu liệu trừu tượng cách thực Chẳng hạn, kiểu int C++ tập tất số nguyên, chứa số nguyên biểu diễn thực máy tính xác định, số nguyên lớn tập phụ thuộc vào số bit người ta dành để biểu diễn (thường từ gồm bytes tức 16 bits) Tương tự, kiểu float double C++ biểu diễn tập số thực có dấu chấm động đó, tập tập tất số thực 1.4.2 Kiểu nguyên tố kiểu có cấu trúc Các kiểu int, float, char gọi kiểu nguyên tố (atomic) xem trị chúng thực thể đơn, mong muốn chia nhỏ chúng Tuy nhiên, ngôn ngữ máy tính thường cung cấp công cụ cho phép xây dựng kiểu liệu gọi kiểu có cấu trúc (structured types) Chẳng hạn struct C++ chứa nhiều kiểu nguyên tố khác nhau, không loại trừ kiểu có cấu trúc khác làm thành phần Trị kiểu có cấu trúc cho biết tạo phần tử 1.4.3 Chuỗi nối tiếp danh sách Định nghóa: Một chuỗi nối tiếp (sequence) kích thước chuỗi rỗng Một chuỗi nối tiếp kích thước n ≥ phần tử tập T cặp có thứ tự (Sn-1, t), Sn-1 chuỗi nối tiếp kích thước n – phần tử tập T, t phần tử tập T Giáo trình Cấu trúc liệu Giải thuật 6/16 Chương 1: Giới thiệu Từ định nghóa tạo nên chuỗi nối tiếp dài tùy ý, chuỗi nối tiếp rỗng thêm lần phần tử tập T Chúng ta phân biệt hai từ: nối tiếp (sequential) ngụ ý phần tử thuộc chuỗi nối tiếp mặt luận lý, từ liên tục (contiguous) ngụ ý phần tử nằm kề nhớ Trong định nghóa dùng từ nối tiếp mà thôi, chưa quan tâm mặt vật lý Từ định nghóa chuỗi nối tiếp hữu hạn cho phép định nghóa danh sách (list): Định nghóa: Một danh sách phần tử thuộc kiểu T chuỗi nối tiếp hữu hạn phần tử kiểu T 1.4.4 Các kiểu liệu trừu tượng Định nghóa: CTDL (Data Structure) kết hợp kiểu liệu nguyên tố, và/ kiểu liệu có cấu trúc, và/ CTDL khác vào tập, quy tắc mối quan hệ chúng Trong định nghóa này, cấu trúc có nghóa tập quy tắc kết nối liệu với Mặt khác, đứng quan điểm hướng đối tượng, xây dựng CTDL lớp mà khả chứa liệu, có hành vi đặc trưng riêng, thao tác cho phép cập nhập, truy xuất giá trị liệu cho đối tượng Nhờ đó, có khái niệm mới: kiểu liệu trừu tượng (abstract data type), thường viết tắt ADT Nguyên tắc quan trọng định nghóa kiểu liệu trừu tượng gồm hai phần: phần thứ mô tả cách mà phần tử kiểu liên quan đến nhau, phần thứ hai liệt kê thao tác thực phần tử kiểu liệu trừu tượng Lưu ý định nghóa cho kiểu liệu trừu tượng hoàn toàn không quan tâm đến cách thực Một định nghóa cho kiểu liệu trừu tượng phụ thuộc vào nhiệm vụ mà trông đợi phải thực Dưới số vấn đề thường hay xem xét: • Có quan tâm đến thứ tự thêm vào phần tử hay không? • Việc truy xuất phần tử phụ thuộc thứ tự thêm vào phần tử, hay truy xuất phần tử dựa vào khóa cho trước? • Việc tìm kiếm phần tử theo khóa, phép, hoàn toàn khóa nào, hay phụ thuộc vào thứ tự thêm vào, hay phụ thuộc vào tần suất mà khóa truy xuất? • … Giáo trình Cấu trúc liệu Giải thuật 7/16 Chương 1: Giới thiệu Một đặc tả cho kiểu liệu trừu tượng hoàn toàn có nhiều cách thực khác Mỗi cách thực mang lại tính khả thi tính hiệu khác Điều phụ thuộc vào yêu cầu thời gian không gian toán Nhưng cần nhấn mạnh rằng, cách thực kiểu liệu trừu tượng trung thành với đặc tả ban đầu chức Nhiệm vụ việc thực CTDL C++ khái niệm, thường định nghóa ADT, sau tinh chế dần để có thực lớp C++ Các phương thức lớp C++ tương ứng cách tự nhiên với thao tác liệu ADT, thành phần liệu lớp C++ tương ứng với CTDL vật lý mà chọn để biểu diễn ADT 1.5 Một số nguyên tắc phương pháp để học tốt môn CTDL giải thuật 1.5.1 Cách tiếp cận phương hướng suy nghó tích cực Mỗi CTDL trình bày theo bước sau đây: • Định nghóa lớp • Đặc tả lớp • Phân tích phương án thực • Hiện thực lớp • Lưu ý rằng, trừu tượng đặc tả liệu phải trước lựa chọn cách thức tổ chức lưu trữ liệu cách thực chúng Trong phần định nghóa đặc tả lớp, để hiểu sâu vấn đề cảm thấy hứng thú hơn, sinh viên nên tự xem người tham gia vào công việc thiết kế Vì chức lớp hoàn toàn phụ thuộc vào quan điểm người thiết kế Nếu giới hạn cho lớp CTDL số chức thao tác liệu nhất, có thư viện gọn nhẹ Ngược lại, thư viện lớn, người lập trình gọi thực công việc mà họ muốn từ phương thức có sẵn lớp Thư viện lớp CTDL VC++ minh họa cho thấy lớp CTDL có sẵn nhiều phương thức đáp ứng nhu cầu nhiều người dùng khác Các phương thức đặc tả kỹ cho lớp giáo trình để minh họa Sinh viên tự ý chọn lựa để đặc tả số phương thức bổ sung khác theo ý muốn Trước tìm hiểu phương án thực trình bày giáo trình dành cho lớp CTDL, sinh viên nên tự phác họa theo suy nghó riêng Giáo trình Cấu trúc liệu Giải thuật 8/16 Chương 1: Giới thiệu thân Với cách chủ động vậy, sinh viên dễ dàng nhìn ưu nhược điểm phương án Và có ý tưởng hoàn toàn mẻ so với trình bày giáo trình, sinh viên tự tin cần giải toán Những CTDL nhằm phục vụ cho toán lớn hình thành từ ghép nối số CTDL đơn giản Chính ghép nối làm nảy sinh phương án khác mà phải chọn lựa thật thận trọng, để bảo đảm tính khả thi hiệu chương trình Một gặp toán cần giải quyết, sinh viên biết chọn cho phương án ghép nối CTDL đơn giản, biết cách sử dụng lại có thư viện, biết cách làm để thực bổ sung thuộc ý tưởng mẻ vừa nảy sinh, xem sinh viên học tốt môn CTDL giải thuật So với nhiều giáo trình khác, giáo trình tách riêng phần ứng dụng CTDL nhằm làm gọn nhẹ cho phần II phần trình bày CTDL Như thuận tiện cho sinh viên việc tìm hiểu phần tra cứu mở rộng kiến thức Hơn nữa, có nhiều ứng dụng liên quan đến nhiều CTDL khác 1.5.2 Các nguyên tắc Trước thực lớp CTDL nào, cần chắn định nghóa CTDL đặc tả tác vụ cho cách thật đầy đủ Có bảo đảm rằng: • Chúng ta hiểu cách xác • Trong thực quay lại sửa đổi đặc tả nó, việc sửa đổi làm cho phương hướng, CTDL không ý tưởng ban đầu mà dự định cho • Các chương trình ứng dụng không cần phải chỉnh sửa sử dụng CTDL • Nếu cung cấp nhiều thực khác cho CTDL, đổi sang sử dụng thực khác, chương trình ứng dụng không đòi hỏi phải chỉnh sửa lại Các thực khác CTDL có giao diện thống Mỗi phương thức lớp có năm phần mô tả (kiểu trả về, thông số vào/ ra, precondition, postcondition, uses) Đây yêu cầu chung việc sử dụng ta cần xây dựng cho người lập khuyên là: phần precondition Giáo trình Cấu trúc liệu Giải thuật lập tài liệu cho hàm Các CTDL nhiều ứng dụng khác Do chúng trình bớt công sức Lời nhằm giải thích ý nghóa thông số 9/16