Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 120 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
120
Dung lượng
1,48 MB
Nội dung
BÀI GIẢNG CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT LỜI NÓI ĐẦU Để đáp ứng nhu cầu học tập bạn sinh viên, sinh viên chuyên ngành công nghệ thông tin, chuyên ngành tin học kinh tế, tác giả Bộ môn Công nghệ phần mềm - Khoa Công Nghệ Thông Tin - Trường Đ i h ọ c T h i n g u y ê n tiến hành biên soạn giáo trình, giảng chương trình học đào tạo theo tín Bài giảng mơn Cấu Trúc Dữ Liệu thuật toán biên soạn dựa quyển: “Cấu trúc liệu & thuật toán” tác giả Đinh Mạnh Tường, Nhà xuất Khoa học Kỹ thuật, 2003 “Cấu trúc liệu giải thuật”, tác giả: Đỗ Xuân Lôi, “ Cấu trúc liệu + giải thuật= Chương trình” N Wirth, 1983 Giáo trình biên soạn dựa kinh nghiệm giảng dạy nhiều năm môn Cấu Trúc Dữ Liệu Giải Thuật Tài liệu soạn theo đề cương chi tiết môn Cấu Trúc Dữ Liệu v t h u ậ t t o n sinh viên chuyên ngành Công nghệ thông tin Khoa Công Nghệ Thông Tin Trường Đại Học Thái nguyên Mục tiêu nhằm giúp bạn sinh viên chuyên ngành có tài liệu cô đọng dùng làm tài liệu học tập, chúng tơi khơng loại trừ tồn đối tượng khác tham khảo Chúng nghĩ bạn sinh viên không chuyên tin người quan tâm tới cấu trúc liệu giải thuật tìm điều hữu ích Mặc dù cố gắng nhiều trình biên soạn giáo trình chắn giáo trình cịn nhiều thiếu sót hạn chế Rất mong nhận đóng góp ý kiến quý báu sinh viên bạn đọc để giảng ngày hoàn thiện trở thành giáo trình thực hữu ích Thái nguyên, 11 / 2008 Các tác giả MỤC LỤC 6.1.1 Sự cần thiết phải phân tích giải thuật 112 6.1.2 Thời gian thực giải thuật .112 Chương Tổng quan cấu trúc liệu giải thuật Tổng quan: 1- Mục tiêu yêu cầu Trong chương này, cần phải nắm vững vấn đề sau: Các bước phân tích, thiết kế lập trình để giải tốn thực tế Hiểu rõ khái niệm mơn học Vai trị cấu trúc liệu giải thuật lập trình giải tốn - Nơị dung - Quy trình giải toán - Các khái niệm - Đệ quy - Ngôn ngữ diễn đạt giải thuật 1 Từ tốn đến chương trình Để giải vấn đề MTĐT thông thường cần phải qua số giai đoạn sau: Phân tích để hình thành tốn Phân tích thiết kế chương trình: Mơ hình hóa tốn thực tế thành mơ hình tốn học xây dựng thao tác đối tượng mơ hình 2.1 Thiết kế xây dựng mơ hình liệu biểu diễn đối tượng toán 2.2 Thiết kế giải thuật xử lý yêu cầu toán Cài đặt chương trình Thử nghiệm Trong đó: 1) Phân tích để hình thành tốn: Giai đoạn ta phải trả lời rõ ràng câu hỏi: toán cho “ gì?” "phải làm gì?" Một tốn hình thành ta rõ thông tin đầu vào ( input) yêu cầu xử lý thơng tin (thơng tin đầu (output)) 2) Phân tích thiết kế chương trình Trong giai đoạn ta cần trả lời câu hỏi: “ làm nào” để biểu diễn đối tượng liệu toán thực u cầu tốn máy tính Cơng việc cịn gọi xây dựng mơ hình tốn học cho tốn Thật vậy, thơng thường, khởi đầu, hầu hết tốn khơng đơn giản, không rõ ràng Để giảm bớt phức tạp tốn thực tế, ta phải hình thức hóa nó, nghĩa phát biểu lại tốn thực tế thành tốn hình thức (hay cịn gọi mơ hình tốn học) Có thể có nhiều tốn thực tế có mơ hình tốn học Ví dụ 1: Tơ màu đồ giới Ta cần phải tô màu cho nước đồ giới Trong nước tơ màu hai nước láng giềng (cùng biên giới) phải tơ hai màu khác Hãy tìm phương án tô màu cho số màu sử dụng Ta xem nước đồ giới đỉnh đồ thị, hai nước láng giềng hai đỉnh ứng với nối với cạnh Bài tốn lúc trở thành tốn tơ màu cho đồ thị sau: Mỗi đỉnh phải tơ màu, hai đỉnh có cạnh nối phải tơ hai màu khác ta cần tìm phương án tô màu cho số màu sử dụng Mơ hình tốn học sử dụng tốn mơ hình đồ thị Ví dụ 2: Đèn giao thơng Cho ngã năm hình 1.1, C E đường chiều theo chiều mũi tên, đường khác hai chiều Hãy thiết kế bảng đèn hiệu điều khiển giao thông ngã năm cách hợp lý, nghĩa là: phân chia lối ngã năm thành nhóm, nhóm gồm lối đi đồng thời khơng xảy tai nạn giao thông (các lối có hướng khơng cắt nhau), số lượng nhóm chia B A C D E Hình 1.1 Ta xem đầu vào toán tất lối ngã năm này, đầu toán nhóm lối đi đồng thời mà khơng xảy tai nạn giao thơng, nhóm tương ứng với pha điều khiển đèn hiệu, ta phải tìm kiếm lời giải với số nhóm để giao thơng khơng bị tắc nghẽn phải chờ đợi lâu Trước hết ta nhận thấy ngã năm có 13 lối đi: AB, AC, AD, BA, BC, BD, DA, DB, DC, EA, EB, EC, ED Tất nhiên, để giải tốn ta phải tìm cách để thể mối liên quan lối Lối với lối đồng thời, lối lối đồng thời Ví dụ cặp AB EC đồng thời, AD EB khơng, hướng giao thông cắt Ở ta dùng sơ đồ trực quan sau: tên 13 lối viết lên mặt phẳng, hai lối đồng thời xảy đụng (tức hai hướng cắt qua nhau) ta nối lại đoạn thẳng, cong, ngoằn ngo tuỳ thích Ta có sơ đồ hình 1.2 Như vậy, sơ đồ này, hai lối có cạnh nối lại với hai lối cho đồng thời AB AC AD BA BC BD DA DB DC EA EB EC ED Hình 1.2 Với cách biểu diễn ta có mơ hình tốn học đồ thị (Graph), lối trở thành đỉnh đồ thị, hai lối đồng thời nối đoạn ta gọi cạnh đồ thị Bây ta phải xác định nhóm, với số nhóm nhất, nhóm gồm lối đi đồng thời, ứng với pha đèn hiệu điều khiển giao thông Giả sử rằng, ta dùng màu để tô lên đỉnh đồ thị cho: - Các lối cho phép đồng thời có màu: Dễ dàng nhận thấy hai đỉnh có cạnh nối không tô màu - Số nhóm nhất: ta phải tính tốn cho số màu dùng Tóm lại, ta phải giải tốn sau: "Tơ màu cho đồ thị hình 1.2 cho: - Hai đỉnh có cạnh nối với (hai cịn gọi hai đỉnh kề nhau) không màu - Số màu dùng nhất." Như vậy: Cả hai tốn trên, ban đầu khác nhau, sau phân tích để hình thức hóa chúng đưa mơ hình tốn học đồ thị, áp dụng thuật tốn tơ mầu đồ thị để giải tốn Chú ý: Có nhiều cấu trúc tốn học làm mơ hình liệu tin học, ví dụ dãy, tập hợp, ánh xạ, cây, đồ thị, - Một toán thực tế thường bao gồm đối tượng liệu yêu cầu xử lý đối tượng đó, giai đoạn phân tích thiết kế, xây dựng mơ hình tốn học cho toán cần trọng đến hai vấn đề : + Tổ chức biểu diễn đối tượng liệu tốn mơ hình tốn học nào? mơ hình ta cịn gọi mơ hình liệu + Xây dựng thao tác xử lý đối tượng Khi cài đặt chương trình giải tốn tương ứng ta quan tâm đến hai vấn đề: + Biểu diễn mơ hình tốn học tốn máy tính để máy tính hiểu thực hiên thao tác chúng Giai đoạn gọi xây dựng cấu trúc liệu cho toán Ta cài đặt mơ hình liệu nhiều cấu trúc liệu khác Trong cách cài đặt, số phép tốn mơ hình thực thuận lơi, phép tốn khác lại khơng thuận lợi + Mã hóa giải thuật xử lý cấu trúc liệu tương ứng để giải yêu cầu tốn 3- Cài đặt chương trình Ta sử dụng ngơn ngữ lập trình cụ thể (Pascal,C, ) để cài đặt kết giai đoạn phân tích thiết kế chương trình, bước ta dùng cấu trúc liệu cung cấp ngơn ngữ, ví dụ Array, Record, để biểu diễn m h ì n h d ữ l i ệ u c ủ a b i t o n , mã hóa giải thuật câu lệnh ngơn ngữ lập trình lựa chọn Như vậy, ta tóm tắt bước từ tốn đến chương trình sau: 1) Về mặt liệu: Mơ hình liệu-> Kiểu liệu trừu tượng -> Cấu trúc liệu Thật vậy: Trong trình phát triển chương trình, phát triển hệ thống phần mềm lớn, ta cần đến hai dạng biểu diễn liệu: Biếu diễn trừu tượng biểu diễn cụ thể a) Trong giai đoạn phân tích thiết kế chương trình, ta cần sử dụng dạng biểu diễn trừu tượng: xác định mơ hình liệu – mơ hình tốn học đối tượng liệu với phép tốn thực đối tượng đó, ví dụ như: Mơ hình cây, danh sách, tập hợp, đồ thị, mơ hình ERA, …… > Khi ta dùng mơ hình liệu với số xác định phép tốn đó, ta có kiểu liệu trừu tượng , ví dụ: Ngăn xếp, hàng đợi, bảng băm, … => Dạng biểu diễn liệu không phụ thuộc vào ngơn ngữ lập trình cụ thể b) Trong giai đoạn cài đặt chương trình, ta cần sử dụng dạng biểu diễn cụ thể liệu: Là biểu diễn xác định cách lưu trữ vật lý liệu nhớ máy tính Biểu diễn cụ thể liệu xác định cấu trúc liệu Các cấu trúc liệu mô tả ngơn ngữ lập trình cụ thể mà ta sử dụng => Dạng biểu diễn phụ thuộc vào ngơn ngữ lập trình cụ thể Từ biểu diễn trừu tượng, ta chuyển dịch thành biều diễn cụ thể khác nhau, hay nói cách khác, từ mơ hình liệu từ kiểu liệu trừu tượng, ta chuyển dịch thành cấu trúc liệu khác Ví dụ, ta cài đặt danh sách cấu trúc liệu mảng cấu trúc liệu danh sách liên kết Khi cài đặt mơ hình liệu cấu trúc liệu đó, phép tóa mơ hình thực thao tác cần thiết cấu trúc liệu 2) Về mặt xử lý liệu: Giải thuật khơng hình thức ->giải thuật ngơn ngữ giả ->Giải thuật mã hóa hồn tồn ngơn ngữ lập trình cụ thể, ví dụ: Pascal, C, Thật vây: Từ yêu cầu xử lý thực tế, ta tìm c c giải thuật mơ hình d ữ l i ệ u đ ã x â y d ự n g Giải thuật mơ tả cách khơng hình thức ( tức nêu phương hướng giải bước giải cách tổng quát) Tiếp theo ta hình thức hố giải thuật ngơn ngữ giả, chi tiết hoá dần ("mịn hoá") bước giải tổng quát ( làm mịn dấn) Ở bước ta cần dùng kiểu liệu trừu tượng (không phải khai báo cài đặt ngôn ngữ lập trình cụ thể) cấu trúc lệnh điều khiển ngơn ngữ lập trình (khơng trọng đến cú pháp ngôn ngữ) , kêt hợp ngôn ngữ tự nhiên để mô tả giải thuật Cuối pha cài đặt, ta tiến hành mã hóa hồn tồn giải thuật mô tả ngôn ngữ giả, sử dụng ngơn ngữ lập trình cụ thể, thao tác cấu trúc liệu cụ thể 1.2 Các khái niệm 1.2.1 Mơ hình liệu ( Data model ) Mơ hình liệu gì?: Mơ hình liệu sử dụng để mô tả cấu trúc logic liệu xử lý hệ thống Là mơ hình tốn học với phép tốn thực đối tượng mơ hình Các thành phần liệu thực tế đa dạng, phong phú thường chứa đựng quan hệ với nhau, cần phải tổ chức, lựa chọn xây dựng mơ hình liệu thích hợp cho vừa phản ánh xác liệu thực tế này, vừa dễ dàng dùng máy tính để xử lý Để tìm cấu trúc tốn học thích hợp với tốn cho, cần phải phân tích kỹ tốn để tìm câu trả lời cho câu hỏi sau: + Các thông tin quan trọng tốn biểu diễn đối tượng tốn học ? + Có mối quan hệ đối tượng ? + Các kết phải tìm tốn biểu diễn khái niệm tốn học ? Sau có mơ hình tốn học mơ tả tốn, câu hỏi đặt là, ta phải làm việc với mô để tìm lời giải toán? Chúng ta thiết kế thuật toán thơng qua hành động, phép tốn thực đối tượng mơ hình Ví dụ: + Trong mơ hình liệu đồ thị, số nhiều phép tốn, ta kể số phép tốn sau: Tìm đỉnh kề đỉnh, xác định đường ngắn nối đỉnh bất kỳ, tìm thành phần liên thơng, tìm đỉnh treo, tô mầu đồ thị, … + Trong mô hình liệu danh sách ta có phép tốn sau: - Xác định độ dài danh sách - Xen phần tử vào danh sách - Loại bỏ, xếp … Ta phân loại mơ hình liệu dựa mối quan hệ phần tử: 1- Mơ hình liệu tuyến tính (danh sách): có quan hệ 1:1 phần tử; tức là, mơ hình liệu tuyến tính chứa phần tử phải có phần tử phần tử cuối cùng, phần tử (trừ phần tử phần tử cuối cùng) có phần tử tiền bối (đứng trước) phần tử hậu bối (đứng sau) Hình 1.3 biểu diễn ví dụ mơ hình liệu tuyến tính Phần tử cuối Hình 1.3 – Mơ hình liệu tuyến tính 2- Mơ hình liệu phân cấp (cây): có quan hệ 1:n phần tử; tức là, phần tử mơ hình có nhiều hậu bối, có tiền bối Hình 1.4 biểu diễn ví dụ cụ thể mơ hình Nếu ta di chuyển từ xuống Hình 1.4 nút trỏ đến nhiều nút khác, ta di chuyển từ lên nút (trừ nút gốc) có quan hệ với nút Mơ hình liệu phân cấp thường gọi cây, loại mơ hình liệu quan trọng khoa học máy tính: 10 y := ABS(Y); IF n = THEN mult := X*Y*s ELSE BEGIN A := left(X, n DIV 2); B := right(X, n DIV 2); C := left(Y, n DIV 2); D := right(Y, n DIV 2); m1 := mult(A,C, n DIV 2); m2 := mult(A-B,D-C, n DIV 2); m3 := mult(B,D, n DIV 2); mult := (s * (m1 * 10n + (m1+m2+m3)* 10n div +m3 END END; Trong đó: - Hàm Mult nhận vào ba tham số, X Y hai số nguyên lớn (kiểu Big_integer), n số chữ số X Y trả số nguyên lớn tích XY - A, B, C, D biến thuộc kiểu Big_integer, lưu trữ số nguyên lớn việc chia đôi số nguyên lớn X Y m1, m2 m3 biến thuộc kiểu Big_integer lưu trữ số nguyên lớn trung gian công thức (III.3), cụ thể m1 = AC, m2 = (A-B)(D-C) m3 = BD - Hàm sign nhận vào số nguyên lớn X cho giá trị X dương -1 X âm - Hàm ABS nhận vào số nguyên lớn X cho kết giá trị tuyệt đối X - Hàm Left nhận vào số nguyên lớn X số nguyên k, cho kết số nguyên lớn có k chữ số bên trái X Tương tự cho hàm Right 6.1.2 Kỹ thuật “Tham ăn” Nội dung kĩ thuật tham ăn Tham ăn hiểu cách dân gian là: mâm có nhiều ăn, ngon ta ăn trước ăn cho hết chuyển sang ngon thứ hai, lại ăn hết ngon thứ hai chuyển sang ngon thứ ba… Kĩ thuật tham ăn thường vận dụng để giải toán tối ưu tổ hợp cách xây dựng phương án X Phương án X xây dựng cách lựa chọn thành phần Xi X hoàn chỉnh (đủ n thành phần) Với Xi, ta chọn Xi tối ưu Với cách bước cuối ta khơng 106 cịn để chọn mà phải chấp nhận giá trị cuối lại Áp dụng kĩ thuật tham ăn cho giải thuật thời gian đa thức, nhiên nói chung đạt phương án tốt chưa tối ưu Có nhiều tốn mà ta giải kĩ thuật này, sau số ví dụ Ví dụ: Xét tốn trả tiền máy rút tiền tự động ATM Trong máy rút tiền tự động ATM, ngân hàng chuẩn bị sẵn loại tiền có mệnh giá 100.000 đồng, 50.000 đồng, 20.000 đồng 10.000 đồng Giả sử loại tiền có số lượng khơng hạn chế Khi có khách hàng cần rút số tiền n đồng (tính chẵn đến 10.000 đồng, tức n chia hết cho 10000) Hãy tìm phương án trả tiền cho trả đủ n đồng số tờ giấy bạc phải trả Gọi X = (X1, X2, X3, X4) phương án trả tiền, X1 số tờ giấy bạc mệnh giá 100.000 đồng, X2 số tờ giấy bạc mệnh giá 50.000 đồng, X3 số tờ giấy bạc mệnh giá 20.000 đồng X4 số tờ giấy bạc mệnh giá 10.000 đồng Theo yêu cầu ta phải có X1 + X2 + X3 + X4 nhỏ X1 * 100.000 + X2 * 50.000 + X3 * 20.000 + X4 * 10.000 = n Áp dụng kĩ thuật tham ăn để giải tốn là: để có số tờ giấy bạc phải trả (X1 + X2 + X3 + X4) nhỏ tờ giấy bạc mệnh giá lớn phải chọn nhiều Cách làm: - Trước hết ta chọn tối đa tờ giấy bạc mệnh giá 100.000 đồng, nghĩa X1 số nguyên lớn cho X1 * 100.000 ≤ n Tức X1 = n DIV 100.000 - Xác định số tiền cần rút lại hiệu n – X1 * 100000 chuyển sang chọn loại giấy bạc 50.000 đồng… Ví dụ khách hàng cần rút 1.290.000 đồng (n = 1290000), phương án trả tiền sau: X1 = 1290000 DIV 100000 = 12 Số tiền cần rút lại là: 1290000 – 12 * 100000 = 90000 X2 = 90000 DIV 50000 = Số tiền cần rút lại : 90000 – * 50000 = 40000 X3 = 40000 DIV 20000 = Số tiền cần rút lại : 40000 – * 0000 = X4 = DIV 10000 = Ta có X = (12, 1, 2, 0), tức máy ATM trả cho khách hàng 12 tờ 100.000 đồng, tờ 50.000 đồng tờ 20.000 đồng 107 6.1.3 Quy hoạch động Nội dung kĩ thuật Như 6.1.1 nói, kĩ thuật chia để trị thường dẫn tới giải thuật đệ quy Trong giải thuật đó, có số giải thuật có độ phức tạp thời gian mũ Tuy nhiên, cách giải ta phải giải số tốn nhiều lần Ðể tránh việc giải dư thừa số toán con, tạo bảng để lưu trữ kết toán cần sử dụng kết lưu bảng mà khơng cần phải giải lại tốn Lấp đầy bảng kết toán theo quy luật để nhận kết toán ban đầu (cũng lưu số ô bảng) gọi quy hoạch động (dynamic programming) Trong số trường hợp, để tiết kiệm nhớ, thay dùng bảng, ta dùng véctơ Có thể tóm tắt giải thuật quy hoạch động sau: Tạo bảng cách: a Gán giá trị cho số b Gán trị cho ô khác nhờ vào giá trị trước Tra bảng xác định kết toán ban đầu Ưu điểm phương pháp quy hoạch động chương trình thực nhanh tốn thời gian giải lại toán giải Kĩ thuật quy hoạch động vận dụng để giải tốn tối ưu, tốn có cơng thức truy hồi Phương pháp quy hoạch động không đem lại hiệu trường hợp sau: - Khơng tìm công thức truy hồi - Số lượng toán cần giải lưu giữ kết lớn - Sự kết hợp lời giải toán chưa cho ta lời giải toán ban đầu 6.1.4 Kỹ thuật quay lui Nội dung kỹ thuật: Kĩ thuật quay lui (backtracking) tên gọi nó, q trình phân tích xuống quay lui trở lại theo đường qua Tại bước phân tích chưa giải vấn đề thiếu liệu nên phải phân tích điểm dừng, nơi xác định lời giải chúng xác định (hoặc không nên) tiếp tục theo hướng Từ điểm dừng quay ngược trở lại theo đường mà qua để giải 108 vấn đề tồn đọng cuối ta giải vấn đề ban đầu Ở xét kĩ thuật quay lui: “vét cạn” kĩ thuật phải tới tất điểm dừng quay lui “Cắt tỉa Alpha-Beta” “Nhánh-Cận” hai kĩ thuật cho phép không cần thiết phải tới tất điểm dừng, mà cần đến số điểm dựa vào số suy luận để quay lui sớm Các kĩ thuật trình bày thơng qua số tốn cụ thể sau Ví dụ 1: Xét tốn định trị biểu thức số học Trong ngơn ngữ lập trình có biểu thức số học, việc dịch biểu thức đòi hỏi phải đánh giá (định trị) chúng Ðể làm điều cần phải có biểu diễn trung gian cho biểu thức Một biểu diễn trung gian cho biểu thức biểu thức Cây biểu thức số học nhị phân, nút biểu diễn cho toán hạng, nút biểu diễn cho toán tử Ví dụ : Biểu thức + * - biểu diễn Hình 6.1, giá trị nút trị tốn hạng mà nút biểu diễn Trị nút có cách lấy tốn tử mà nút biểu diễn áp dụng vào Trị nút gốc trị biểu thức - 11 + * Hình 6.1 – Biểu diễn biểu thức số học Như vậy, để định trị cho nút gốc, phải định trị cho hai nó, ta xem có phải nút hay không, ta lại phải xét hai nút Q trình tiếp tục gặp nút mà giá trị chúng biết, quay lui để định trị cho nút cha nút mà định trị cho tổ tiên chúng Ðó kĩ thuật quay lui vét cạn, phải lần đến tất nút định trị cho nút 109 định trị cho nút gốc 110 Với biểu thức Ðể định trị cho nút - phải định trị cho nút + nút Nút nút nên giá trị Ðể định trị cho nút + ta phải định trị cho nút nút * Nút nút nên giá trị Ðể định trị cho nút *, ta phải định trị cho nút nút Cả hai nút nên giá trị chúng tương ứng Quay lui lại nút *, lấy toán tử * áp dụng cho hai ta trị nút * Quay lui nút +, lại áp dụng toán tử + vào hai trị nút + 11 Cuối quay nút -, áp dụng toán tử - vào hai 11 ta trị nút - (nút gốc) Ðó trị biểu thức Trong Hình 6.1, mũi tên nét đứt minh họa trình tìm nút mũi tên nét liền minh họa trình quay lui để định trị cho nút, số bên phải nút trị nút Phác thảo giải thuật định trị nút sau: Function Eval(n : node): real; Begin if (n ) then return (trị toán hạng n) else return (Toán tử n (Eval (Con trái n), Eval (Con phải n)) ); End; Như vậy: Muốn định trị cho biểu thức T, ta gọi Eval(ROOT(T)) 6.1.5 Kỹ thuật tìm kiếm địa phương Nội dung kĩ thuật Kĩ thuật tìm kiếm địa phương (local search) thường áp dụng để giải tốn tìm lời giải tối ưu Phương pháp sau: • Xuất phát từ phương án • Áp dụng phép biến đổi lên phương án hành để phương án tốt phương án có • Lặp lại việc áp dụng phép biến đổi lên phương án hành khơng cịn cải thiện phương án Thông thường phép biến đổi thay đổi phận phương án hành để phương án nên phép biến đổi gọi phép biến đổi địa phương ta có tên kĩ thuật tìm kiếm địa phương 111 Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN 6.2 Phân tích giải thuật 6.1.1 Sự cần thiết phải phân tích giải thuật Trong giải toán có số giải thuật khác nhau, vấn đề cần phải đánh giá giải thuật để lựa chọn giải thuật tốt (nhất) Thông thường ta vào tiêu chuẩn sau: (1) - Giải thuật đắn (2) - Giải thuật đơn giản (3) - Giải thuật hiệu Với yêu cầu (1), để kiểm tra tính đắn giải thuật cài đặt giải thuật cho thực máy với số liệu mẫu lấy kết thu so sánh với kết biết Thực cách làm khơng chắn giải thuật với tất liệu thử lại sai với liệu Vả lại cách làm phát giải thuật sai chưa chứng minh Tính đắn giải thuật cần phải chứng minh toán học Tất nhiên điều không đơn giản không đề cập đến Khi viết chương trình để sử dụng vài lần yêu cầu (2) quan trọng Chúng ta cần giải thuật dễ viết chương trình để nhanh chóng có kết quả, thời gian thực chương trình khơng đề cao dù chương trình sử dụng vài lần mà thơi Khi chương trình sử dụng nhiều lần thì yêu cầu tiết kiệm thời gian thực chương trình, tiết kiệm khơng gian lưu trữ lại quan trọng, đặc biệt chương trình mà thực cần liệu nhập lớn yêu cầu (3) xem xét cách kĩ Ta gọi hiệu giải thuật Tính hiệu thể qua hai mặt: • Thời gian (Chương trình chạy nhanh) • Khơng gian (Chương trình bé chiếm nhớ) 6.1.2 Thời gian thực giải thuật Thời gian thực giải thuật phụ thuộc vào nhiều yếu tố • Trước hết phụ thuộc vào độ lớn liệu đầu vào • Ngồi T phụ thuộc vào o Máy 112 Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN o Ngôn ngữ o Kỹ sảo người lập trình, o … Tuy nhiên yếu tố không đồng dựa vào chúng xác lập thời gian thực giải thuật T(n), với n kích thước tốn a) Thời gian thực giải thuật gì? đơn vị T(n) tính ? cách tính? - Thời gian thực chương trình hàm kích thước liệu vào, ký hiệu T(n) n kích thước (độ lớn) liệu vào Ví dụ 1: Chương trình tính tổng n số có thời gian thực T(n) = c*n c số - T(n) khơng thể tính đơn vị cụ thể mà tính số lần thực lệnh giải thuật Một câu hỏi đặt là: Cách tính tính nhanh hay chậm giải thuật hay khơng ? Câu trả lời: rõ ràng có, thí dụ : o GT1 có thời gian thực tỉ lệ với n GT2 có thời gian thực tỉ lệ với n2 Với n lớn giải thuật nhanh giải thuật Thời gian mà ta đánh gọi độ phức tạp tính tốn giải thuật: Ở giải thuật ta nói GT có độ phức tạp tính tốn cấp n kí hiệu T(n) = O(n) Ở giải thuật thời gian T() = O(n2) hay O(g(n)), g(n) cịn gọi cấp độ phức tạp tính tốn Hàm g(n) thường chọn là: logn; n; n2; n3: ta gọi chung hàm đa thức; g(n) = 2n ta gọi hàm mũ; giải thuật có độ phức tạp tính tốn cấp hàm đa thức chấp nhận Ví dụ : T(n) = 60n2 + 9n + = O(n) * Một số ví dụ đánh giá độ phức tạp tính tốn GT Ví dụ : Tính trung bình cộng dãy gồm n số đọc vào từ bàn phím Nhập vào số n Cho T = 0; d = Lặp While d = => T(n) = O(n) * Một số qui tắc xác định cấp độ phức tạp tính toán a Qui tắc loại bỏ số Nếu ta có T(n) = O(C1.g(n)) ta có T(n) = O(g(n)) b Qui tắc lấy max Nếu ta có T(n) = O(f(n) + g(n)) ta có T(n) = O(max(f(n),g(n))) c Qui tắc cộng T1(n) T2(n) thời gian thực đoạn chương trình P1 P2 T1(n) = O(f(n)); T2(n)= O(g(n)) thời gian thực đoạn chương trình nối tiếp T(n) = T1(n) + T2(n) Hay T(n) = O(max(f(n),g(n))) d Qui tắc nhân Thời gian thực hai đoạn chương trình P1, P2 lồng : T(n) = O(f(n).g(n)) 114 Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN Nhận xét: Từ qui tắc trên, ta thấy, việc đánh giá độ phức tạp thuật tốn ta cần ý đến lệnh tích cực cịn lệnh khác bỏ qua Lệnh tích cực lệnh có số lần thực >= số lần thực lệnh khác Tóm lại: Qui tắc tổng qt để phân tích chương trình: - Thời gian thực lệnh gán, READ, WRITE O(1) - Thời gian thực chuỗi lệnh xác định qui tắc cộng Như thời gian thời gian thi hành lệnh lâu chuỗi lệnh - Thời gian thực cấu trúc IF thời gian lớn thực lệnh sau THEN sau ELSE thời gian kiểm tra điều kiện Thường thời gian kiểm tra điều kiện O(1) - Thời gian thực vòng lặp tổng thời gian thực thân vòng lặp (trên tất lần lặp) Nếu thời gian thực thân vịng lặp khơng th a y đổi thời gian thực vịng lặp tích số lần lặp với thời gian thực lần thân vịng lặp Ví dụ 1: Tính thời gian thực thủ tục xếp “nổi bọt” PROCEDURE Noi_bot(VAR a: ARRAY[1 n] OF integer); VAR i, j, temp: Integer; BEGIN {1} {2} FOR i:=1 TO n-1 DO FOR j:=n DOWNTO i+1 DO {3} IF a[j-1]>a[j]THEN BEGIN{hoán vị a[i], a[j]} {4} temp := a[j-1]; {5} a[j-1] := a[j]; {6} a[j] := temp; END; END; * Xác định độ phức tạp giải thuật Ta thấy toàn chương trình gồm lệnh lặp {1}, lồng lệnh {1} lệnh {2}, lồng lệnh {2} lệnh {3} lồng lệnh {3} lệnh nối tiếp {4}, {5} {6} Chúng ta tiến hành tính độ phức tạp theo thứ tự từ ra: - Trước hết, ba lệnh gán {4}, {5} {6} tốn O(1) thời gian, việc so sánh a[j1] > a[j] tốn O(1) thời gian, lệnh {3} tốn O(1) thời gian 115 Cấu trúc liệu - Bộ môn CNPM – Khoa CNTT – ĐHTN - Vòng lặp {2} thực (n-i) lần, lần O(1) vịng lặp {2} tốn O((n-i).1) = O(n-i) - Vịng lặp {1} lặp có i chạy từ đến n-1nên thời gian thực vòng lặp {1} độ phức tạp giải thuật T(n) = ∑ (n − i) = n(n − 1) = O(n ) i =1 Chú ý: Trong trường hợp vịng lặp khơng xác định số lần lặp phải lấy số lần lặp trường hợp xấu Ví dụ 2: Tìm kiếm Hàm tìm kiếm Search nhận vào mảng a có n số nguyên số nguyên x, hàm trả giá trị logic TRUE tồn phần tử a[i] = x, ngược lại hàm trả FALSE Giải thuật tìm kiếm so sánh x với phần tử mảng a, a[1], tồn a[i] = x dừng trả TRUE, ngược lại tất phần tử a khác X trả FALSE FUNCTION Search(a:ARRAY[1 n] OF Integer;x:Integer):Boolean; VAR i:Integer; Found:Boolean; BEGIN {1} i:=1; {2} Found:=FALSE; {3} {4} WHILE(i