Giáo án môn cấu trúc dữ liệu và giải thuật

65 479 0
Giáo án môn cấu trúc dữ liệu và giải thuật

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Ngày soạn Ngày giảng: Chương THIẾT KẾ PHÂN TÍCH GIẢI THUẬT §1 Mở đầu A MỤC TIÊU Kiến thức Giúp SV nắm vấn đề như: liệu, cấu trúc liệu, bước cần thực để giải toán tin học Kỹ - Rèn kỹ khai thác tri thức từ giáo trình, tài liệu tham khảo - Rèn kỹ xác định cấu trúc liệu, giải thuật số toán cụ thể Thái độ SV tự tin, ham học hỏi trình tiếp thu tri thức B CHUẨN BỊ Giảng viên: Sinh viên: Giáo án, đồ dùng giảng dạy Giáo trình, đồ dùng học tập C PHƯƠNG PHÁP - Phương pháp đặt - giải 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 Cấu trúc liệu, Nguyễn Thị Tĩnh (chủ biên), Nxb ĐHSP Hà Nội Cấu trúc liệu 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 Ổn định tổ chức Tổng số SV: Có mặt: Vắng: (… có phép) Nội dung giảng Tiêu mục Hoạt động thầy - trò Cấu trúc ? Dữ liệu liệu + Dữ liệu hiểu vật thô mang thông tin, đối tượng để xử lý máy tính ? Nếu liệu có quan hệ với kết nối chúng + Các liệu kết nối với phép toán ? Có thể đồng liệu không + Không thể đồng liệu chúng thuộc nhiều dạng khác Tiêu mục Hoạt động thầy - trò ? Kiểu liệu - Kiểu liệu quy định cấu trúc, miền trị liệu tập phép toán tác động lên miền trị ?Hãy nêu kiểu liệu chuẩn (đơn giản) sử dụng TP Bài toán tình huống: Nhập liệu cho dãy n số Vậy với kiểu liệu đơn giản vừa nêu, toán có giải không, giải nào, không vấn đề cần phải xử lý để giải toán + Khi giải toán phức tạp, sử dụng kiểu liệu đơn giản giải Do vậy, ta cần phải tìm đến cấu trúc liệu khác xây dựng từ kiểu liệu đơn giản có ⇒ Ta hiểu cấu trúc liệu mô hình toán học nhằm mô tả đối tượng (dữ liệu) phép toán thực mô hình - Trong tin học, giải toán điều quan trọng phải chọn xác cấu trúc liệu từ xác định thuật toán giải toán Ngôn ngữ ? Em hiểu ngôn ngữ lập trình lậptrình - Ngôn ngữ lập trình hệ thống ký hiệu hóa để miêu tả tính toán (qua máy tính) dạng mà người máy đọc hiểu ? Máy tính xử lý thông tin - Ngôn ngữ lập trình phải kèm theo dịch để dịch sang ngôn ngữ máy - Ngôn ngữ lập trình chia làm loại: biên dịch thông dịch Các bước ? Theo em giải toán tin học thao tác cần thực quan trọng mà bỏ qua để giải  Xác định toán ? Thực thao tác ta thu điều toán tin - Việc xác định toán cho ta biết phải giải vấn đề gì, với giả thiết (input) cho kết (input) cần đạt thỏa mãn học yêu cầu Khác với toán túy toán học cần xác định rõ giả thiết kết luận không cần xác định yêu cầu lời giải, toán tin học ứng dụng thực tế cần tìm lời giải tốt tới mức đó, chí tới mức chấp nhận lời giải tốt đòi hỏi nhiều thời gian chi phí  Lựa chọn cấu trúc liệu thích hợp để biểu diễn toán ? Cấu trúc liệu lựa chọn phụ thuộc vào yếu tố Tiêu mục Hoạt động thầy - trò - Việc lựa chọn cấu trúc liệu cho toán phụ thuộc vào vấn đề cần giải thao tác tiến hành liệu vào Có thuật toán thích ứng với cách tổ chức liệu định, cách tổ chức liệu khác hiệu thực Chính thao tác tách rời thao tác xây dựng thuật toán giải toán ? Theo em lựa chọn cấu trúc liệu, tiêu chuẩn dùng làm tiêu chí để chọn - Các tiêu chuẩn lựa chọn cấu trúc liệu: + Phải biểu diễn đầy đủ thông tin toán + Phải phù hợp với thao tác theo bước thuật toán mà ta xây dựng để giải toán + Phải cài đặt máy tính với ngôn ngữ lập trình sử dụng  Thiết kế thuật toán ? Thuật toán - Thuật toán dãy hữu hạn thao tác thực hiện, xếp theo trình tự xác định nhằm mô tả trình giải toán, để từ kiện đầu vào sau số thao tác ta có kết mong muốn ? Trình bày đặc trưng thuật toán - Tính dừng: Giải thuật phải kết thúc đưa kết sau số hữu hạn thao tác - Tính xác định: thao tác dùng để mô tả giải thuật phải hòan toàn xác định, nhập nhằng, tùy tiện - Tính phổ dụng: giải thuật phải áp dụng với lớp toán với input thay đổi không áp dụng cho trường hợp cụ thể Cần lưu ý tính dừng tính xác định điều kiện cần trình tìm giải thuật, tính phổ dụng tính chất thường thấy có nhiều toán có input hoàn toàn xác định không tồn lớp toán tương tự - Dữ liệu đầu vào: giải thuật bắt buộc phải có nhiều đại lượng vào - Dữ liệu đầu ra: sau giải thuật thực xong phải đưa kết mong muốn  Sử dụng ngôn ngữ lập trình lựa chọn để mô tả thuật toán Sau xây dựng 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 cao, cần phải có kỹ thuật lập trình tốt Kỹ thuật lập Tiêu mục Hoạt động thầy - trò trình tốt thể kỹ viết chương trình, khả gỡ rối thao tác nhanh Nếu lập trình tốt cần nắm vững ngôn ngữ lập trình đủ mà phải biết cách viết chương trình uyển chuyển, khôn khéo phát triển để chuyển ý tưởng thành chương trình hoàn chỉnh Kinh nghiệm cho thấy thuật toán hay cài đặt vụng nên chạy lại cho kết sai tốc độ chậm  Kiểm thử Một chương trình viết xong chưa chạy máy tính kết mong muốn Kỹ tìm lỗi, sửa lỗi, điều chỉnh lại chương trình kỹ quan trọng người lập trình Kỹ có kinh nghiệm tìm sửa lỗi - Chạy thử tìm lỗi: lỗi thường gặp lập trình gồm + Lỗi cú pháp: lỗi hay gặp lại dễ sửa nhất, cần nắm vững ngôn ngữ lập trình đủ + Lỗi cài đặt: việc cài đặt thể không thuật toán định, với lỗi phải xem tổng thể chương trình, kết hợp với chức gỡ rối để sửa lại cho + Lỗi thuật toán: lỗi gặp nguy hiểm nhất, nhẹ phải điều chỉnh lại thuật toán, nặng có phải loại bỏ hoàn toàn thuật toán sai làm lại từ đầu - Xây dựng test: Có nhiều chương trình khó kiểm tra tính đắn, ta kết Vì chương trình chạy kết việc tìm lỗi khó khăn Khi ta nên làm test để thử chương trình  Tối ưu chương trình Một chương trình chạy nghĩa việc lập trình xong, ta phải sửa đổi lại vài chi tiết để chạy chương trình chạy nhanh hơn, hiệu Thông thường, trước kiểm thử ta nên đặt mục tiêu viết chương trình cho đơn giản, chạy kết được, sau tối ưu chương trình, ta xem lại chỗ viết chưa tốt tối ưu lại mã lệnh để chương trình ngắn gọn hơn, chạy nhanh Không nên viết tới đâu tối ưu đến chương trình có mã lệnh tối ưu thường phức tạp khó kiểm soát ? Các tiêu chí dùng để đánh giá tối ưu chương trình - Các tiêu chí để đánh giá tối ưu chương trình + Tính tin cậy: chương trình phải chạy dự định, mô tả giải thuật + Tính uyển chuyển: chương trình phải dễ sửa đổi + Tính sáng: chương trình viết phải dễ đọc, dễ hiểu để sau Tiêu mục Hoạt động thầy - trò thời gian dài đọc lại hiểu làm gì, để có điều kiện sửa sai (nếu phát lỗi mới), cải tiến hay biến đổi để chương trình giải toán khác + Tính hữu hiệu: chương trình phải chạy nhanh tiêu tốn nhớ Để có chương trình hữu hiệu, cần phải có giải thuật tốt tiểu xảo lập trình, nhiên việc áp dụng nhiều tiểu xảo khiến chương trình trở nên rối, khó hiểu sửa đổi Tiêu chí nên dừng mức chấp nhận được, không quan trọng ba tiêu chí Từ phân tích ta thấy việc làm chương trình đòi hỏi nhiều công đoạn tiêu tốn nhiều công sức Chỉ công đoạn không hợp lý làm tăng chi phí viết chương trình Nghĩ cách giải vấn đề khó, biến ý tưởng thành thực không dễ chút F CỦNG CỐ, HỌC TẬP TẠI NHÀ * Củng cố Qua học em nắm vấn đề như: liệu, cấu trúc liệu, bước cần thực để giải toán tin học * Nhiệm vụ học tập nhà - Nghiên cứu lại nội dung cũ - Tìm hiểu cách phân tích thời gian thực giải thuật Ngày soạn Ngày giảng: §2 Phân tích thời gian thực giải thuật A MỤC TIÊU Kiến thức Giúp SV nắm vấn đề như: khái niệm giải thuật, cách biểu diễn giải thuật, độ phức tạp giải thuật; bước đầu biết xác định độ phức tạp giải thuật số toán cụ thể Kỹ - Rèn kỹ khai thác tri thức từ giáo trình, tài liệu tham khảo - Rèn kỹ đánh giá độ phức tạp thông qua việc đánh giá số giải thuật cụ thể Thái độ SV tự tin, ham học hỏi trình tiếp thu tri thức B CHUẨN BỊ Giảng viên: Sinh viên: Giáo án, đồ dùng giảng dạy Giáo trình, đồ dùng học tập C PHƯƠNG PHÁP - Phương pháp đặt - giải 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 Cấu trúc liệu, Nguyễn Thị Tĩnh (chủ biên), Nxb ĐHSP Hà Nội Cấu trúc liệu 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 Ổn định tổ chức Tổng số SV: Nội dung giảng Tiêu mục Có mặt: Vắng: (… có phép) Hoạt động thầy - trò Giải - Giải thuật dãy hữu hạn thao tác thực hiện, thuật xếp theo trình tự xác định nhằm mô tả trình giải toán, để từ kiện đầu vào sau số thao tác ta có kết mong muốn Các ? Khi GV yêu cầu em đưa hướng giải toán em phương phải thực thao tác (sử dụng ngôn ngữ để trình bày bước giải pháp mô tả toán đó) giải thuật Đây cách người ta thường dùng để diễn tả (mô tả) thuật giải toán Tiêu mục Hoạt động thầy - trò a Phương pháp liệt kê bước - Là phương pháp sử dụng ngôn ngữ tự nhiên để liệt kê thao tác, thị cần thực để giải toán - Ví dụ: ? Cho cô biết cách tìm nghiệm phương trình bậc hai ax2+bx+c = ? Cho cô biết cách tìm ước chung lớn hai số nguyên dương a, b Các nhóm SV trao đổi trả lời b Phương pháp sử dụng lưu đồ - phương pháp sử dụng hình vẽ quy định để mô tả giải thuật cách trực quan - Các khối sử dụng: Bắt đầu kết thúc giải thuật Thao tác tính toán xuất liệu Nhập liệu Kiểm tra điều kiện Hướng giải thuậtdụ có khối dùng để kiểm tra điều kiện có đường vào đường tất khối khác có đường vào đường ? Hãy vẽ lưu đồ mô tả giải thuật giải phương trình bậc hai ax 2+bx+c = ? Vẽ lưu đồ mô tả giải thuật tìm ước chung lớn hai số nguyên dương a, b ? Hãy vẽ lưu đồ mô tả giải thuật biện luận nghiệm phương trình bậc ax+b=0 Begin Begin a, b, c a, b delta := b*b - 4*a*c PT có no kép x := -b/(2*a) a=0 delta < b=0 0 delta = PT có no PT vô no PT vô số no PT vô no x:=(-b±SQRT(delta))/(2*a) End End no x=-b/a Tiêu mục Hoạt động thầy - trò Begin Begin a, b a, b a=b b 0 a := a - b a>b b := b - a UC = a End r := a mod b; a := b; b := r; UC = a End c Sử dụng ngôn ngữ trình - Theo phương pháp ta dùng ký hiệu quy tắc để mô tả giải thuật cách quán - Ví dụ 1: mô tả giải thuật tìm UCLN(a.b) C1: Khi a khác b thực thao tác sau Nếu a > b a có giá trị a - b (bớt a lượng b) Ngược lại b nhận giá trị b - a (bớt b lượng a) Cho đến a = b thông báo UCLN a b a (hoặc b) C2: Khi b khác thực thao tác sau Chia a cho b phần r; a nhận giá trị b; b nhận giá trị r b = thông báo UCLN a b a Độ phức tạp tính toán thuật toán Với toán giải thuật Chọn giải thuật đưa tới kết qủa nhanh đòi hỏi thực tế Như cần có để giải thuật nhanh giải thuật kia? Thời gian thực giải thuật chương trình máy tính phụ thuộc vào nhiều yếu tố Một yếu tố cần ý kích thước liệu vào Dữ liệu vào lớn thời gian xử lý chậm, chẳng hạn thời gian xếp dãy số phụ thuộc vào số lượng số thuộc dãy số Nếu gọi n kích thước liệu đưa vào thời gian thực giải thuật biểu diễn cách tương đối hàm n: T(n) Ta biết phần cứng máy tính, ngôn ngữ viết chương trình chương trình dịch ngôn ngữ ảnh hưởng tới thời gian thực Những yếu tố không giống loại máy, dựa vào chúng để xác định T(n), tức T(n) biểu diễn đơn vị thời gian giờ, phút, giây Tuy nhiên, mà so sánh giải thuật mặt tốc độ Nếu thời gian thực giải thuật T1(n) = n2 thời gian thực giải thuật khác T2(n) = 100n n đủ lớn, thời gian thực giải thuật T rõ ràng nhanh giải thuật T1 Khi đó, nói thời gian thực giải thuật tỷ lệ thuận với n hay tỷ lệ thuận với n2 cho ta cách đánh giá tương đối tốc độ thực giải thuật n lớn Cách đánh giá thời gian thực giải thuật độc lập với máy tính yếu tố liên quan tới máy tính dẫn tới khái niệm “độ phức tạp tính toán giải thuật” Tại phải thiết kế thuật toán có hiệu ? Tiêu mục Hoạt động thầy - trò - VD: Bài toán tháp Hà Nội: Có cọc A, B, C Trên cọc A có n đĩa đặt theo thứ tự từ bé đến lớn Ta cần chuyển n đĩa từ cọc A sang cọc C, phép sử dụng cọc B làm trung gian không phép để đĩa lớn đĩa bé ? Trình bày cách làm thực tế - Phân tích: + Chuyển n - đĩa từ cọc A sang cọc B + Chuyển đĩa từ cọc A sang cọc C + Chuyển n - đĩa từ cọc B sang cọc C ? Phải có lần chuyển ký hiệu số lần chuyển F(n) ⇒ Phải có F(1) = lần; F(n) = 2F(n-1) + với n > lần chuyển Cụ thể: F(1) = = 21 - 1; F(2) = 2.1 + = = 22 - 1; F(n) = 2n - (*) ? Sử dụng phương pháp quy nạp toán học chứng minh công thức * + n = ⇒ F(1) = (đúng) + Giả sử với n = k, tức F(k) = 2k - + Cần chứng minh với n = k + Ta có: F(k+1) = 2F(k) + = 2(2k - 1) + = 2k+1 - (đúng) ⇒ đpcm Vậy n = 64 tức ta phải chuyển 264 - lần đĩa, giả sử lần chuyển đĩa từ cọc sang cọc khác cần giây ⇒ để chuyển 64 đĩa ta cần 5.10 11 năm ⇒ tuổi vũ trụ 10 tỷ năm cần 50 lần tuổi vũ trụ để chuyển 64 đĩa ⇒ Phải tìm thuật toán có hiệu Tuy nhiên có toán không tồn thuật toán có hiệu  Đá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 giải thuật + Có thể xác định thời gian thực T(n) số phép toán sơ cấp phải tiến hành thực 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 hàm T(n) - Định nghĩa: Giả sử n số nguyên không âm, T(n) F(n) hàm thực không âm Khi T(n) xác định: T(n) = O(F(n)) tồn số c, n0 cho T(n) ≤ cF(n) ∀ n ≥ n0 Nghĩa xét giá trị n ≥ n0 hàm T(n) bị chặn số nhân với F(n) Khi đó, T(n) thời gian thực giải thuật ta nói giải thuật có cấp F(n) (hay độ phức tạp tính toán O(F(n)) - Ví dụ: T (n) = 3n + 5n + ≤ 3n + 5n + 4n = 12n ∀n ≥ ⇒ Ta có T(n) = O(n2) (Trường hợp ta nói giải thuật có thời gian Ngày soạn Ngày giảng: §2 Cây nhị phân A MỤC TIÊU Kiến thức Giúp SV nắm định nghĩa, cách biểu diễn số thao tác thực nhị phân, tìm kiếm nhị phân Kỹ - Rèn kỹ khai thác tri thức từ giáo trình, tài liệu tham khảo - Rèn kỹ thao tác nhị phân, tìm kiếm nhị phân thông qua trình nghiên cứu thao tác Thái độ SV tự tin, ham học hỏi trình tiếp thu tri thức B CHUẨN BỊ Giảng viên: Sinh viên: Giáo án, đồ dùng giảng dạy Giáo trình, đồ dùng học tập C PHƯƠNG PHÁP - Phương pháp đặt - giải 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 Cấu trúc liệu, Nguyễn Thị Tĩnh (chủ biên), Nxb ĐHSP Hà Nội Cấu trúc liệu 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 Ổn định tổ chức Tổng số SV: Nội dung giảng Tiêu mục Có mặt: Vắng: (… có phép) Hoạt động thầy - trò Định Cây nhị phân dạng quan trọng cấu trúc Nó có đặc điểm nút có tối đa hai nhánh con, với nút người ta phân biệt trái nghĩa phải Cây nhị phân có tính đến thứ tự nhanh ? Trình bày khái niệm nhị phân theo ý hiểu theo kiểu đệ quy - Cây nhị phân tập hữu hạn nút xác định đệ quy sau: + Một tập trống (rỗng) nhị phân + Giả sử T1 T2 hai nhị phân không cắt r đỉnh không thuộc T1 T2 Khi ta thành lập nhị phân T với gốc r có T1 bên trái, T2 bên phải gốc 50 Tiêu mục Hoạt động thầy - trò * Chú ý: + Cây nhị phân nhị phân rỗng không rỗng + Cây nhị phân phân biệt trái phải - Ví dụ A A B B Biểu  Biểu diễn mảng diễn Nếu có nhị phân đầy đủ, ta dễ dàng đánh số cho nút nhị phân theo thứ tự từ trở từ trái sang phải nút đỉnh ? Các nút nút thứ i có thứ tự bao nhiêu(2i 2i + 1) ? Cha nút thứ j có thứ tự (j div 2) - Sử dụng mảng T để lưu trữ nút nhị phân, nút thứ i lưu trữ phần tử T[i] A ? Mô tả mảng lưu trữ nhị phân sau B A B E C D F G C D - Trong trường hợp nhị phân không đầy đủ ta thêm vào số nút giả để nhị phân đầy đủ gán giá trị đặc biệt cho phần tử mảng T tương ứng với nút A B C D 10 11 12 13 14 15 E F G A B C D Ngoài cách cài đặt nhị phân mảng, sử dụng trỏ để cài đặt nhị phân  Biểu diễn trỏ - Mô tả: ghi biểu diễn đỉnh chứa hai trỏ: trỏ left trỏ tới đỉnh trái, trỏ right trỏ tới đỉnh phải ? Trình bày cú pháp khai báo Type Pt = ^ Node ; Node = Record infor : Item ; left, right : Pt ; Root End; Var Root : Pt; Từ sau sử dụng cách biểu diễn trỏ củaAcây nhị phân Các phép toán nhị phân sau thể cách biểu diễn trỏ Các Cũng cây, nhiều áp dụng ta B E 51 C D F G Tiêu mục Hoạt động thầy - trò thao tác cần phải qua nhị phân, thăm tất đỉnh cách hệ thống, với đỉnh ta cần thực nhóm hành động nhị phân mô tả thủ tục Visit Chúng ta thường qua nhị phân theo ba phương pháp Preorder, Inorder Portorder ? Nhắc lại cách duyệt theo phương pháp Preorder ? Viết thủ tục duyệt nhị phân theo phương pháp vừa trình bày Procedure Preorder(Root : PT); Begin If Root nil Then Begin Visit (Root); Preorder(Root^.left); Preorder(Root^.right); End; End; ? Nhắc lại cách duyệt theo phương pháp Inorder ? Viết thủ tục duyệt nhị phân theo phương pháp vừa trình bày Procedure Inorder(Root : PT); Begin Inorder(Root^.left); Visit (Root); Preorder(Root^.right); End; Bài tập nhà: Viết thủ tục duyệt theo phương pháp Posorder Ví dụ Một ví dụ hay nhị phân biểu thức Cây biểu thức nhị phân gắn nhãn, biểu diễn cấu trúc biểu thức (số học logic) Mỗi phép toán hai toán hạng (+, -, *, /) biểu diễn nhị phân, gốc chứa ký hiệu phép toán, trái biểu diễn toán hạng bên trái, phải biểu diễn toán hạng bên phải Với phép toán toán hạng 'phủ định' 'lấy giá trị đối', hàm chuẩn exp ( ) cos( ) bên trái rỗng Còn với phép toán toán hạng phép lấy đạo hàm' hàm giai thừa bên phải rỗng + a b a+b ! exp 52 x exp(x) n n! Tiêu mục Hoạt động thầy - trò ? Tương tự sử dụng nhị phân để biểu diễn biểu thức sau (a < b) or (c = b c a d (a < b) or (c nil then If x < P^.key Then Search (x, P^.left, P) Else If x > P^.key Then Search(x,P^.right, P) End; - Thủ tục khử đệ quy Procedure Search (x : Item, Root : Pt ) ; 54 Tiêu mục Hoạt động thầy - trò Var Ok : boolean ; Begin P : = Root ; ok := false; while (P < > nil) and (not found) If P^.key = x then found : = true Else If x < P^.key then P : = P^.left Else P : = P^.right ; End ;  Chèn vào nhị phân đỉnh có khóa x ? Trình bày cách chèn - Thủ tục sử dụng đệ quy Procedure Insert (var Root : Pt; x :Item) ; Var Q : Pt; Begin If Root = nil Then Begin New (Q) ; Q^.key : = x ; Q^.left : = nil ; Q^.right : = nil ; Root : = Q ; End Else If x < Root^.key Then Insert (Root^.left, x) Else If x > Root^.key Then Insert (Root^.right, x) End ; - Thủ tục khử đệ quy Procedure Insert (Var Root : Pt; x : Item) ; Var P, Q : Pt; Begin New (Q) ; Q^.key : = x ; Q^.left : = nil ; Q^.right : = nil ; If Root = nil Then Root : = Q Else Begin P: = Root ; While P < > nil Do If x < P^.key Then 55 Tiêu mục Hoạt động thầy - trò If P^.left < > nil Then P : = P^.left Else Begin P^.left : = Q ; P : = nil End Else If x > P^.key Then If P^.right < > nil then P : = P^.right Else Begin P^.right : = Q ;P : = nil End Else P : = nil; End; End ;  Loại bỏ đỉnh khỏi tìm kiếm Việc loại bỏ đỉnh khỏi tìm kiếm không đơn giản việc xen đỉnh vào Nếu đỉnh cần loại bỏ đơn giản: ta cần "cắt" Nếu đỉnh cần loại bỏ có hai trống, ta cần "treo" khác trồng vào vị trí đỉnh bị loại Tuy nhiên vấn đề phức tạp hai đỉnh cần loại khác trống Vấn đề đặt là, ta phải xử lý hai đỉnh bị loại Ta có nhận xét rằng, tìm kiếm nhị phân khác trống bất kỳ, đỉnh có khoá nhỏ đỉnh bên trái, đỉnh có khoá lớn đỉnh bên phải Do đó, đỉnh cần loại bỏ có hai khác trống, ta cần phải thay khoá đỉnh cần loại bỏ khoá đỉnh bên phải trái (hoặc đỉnh bên trái phải), loại bỏ đỉnh bên phải trái (hoặc đỉnh bên trái phải) 20 20 10 10 25 18 20 10T 18 T2 T1 T2 Cây tìm kiếm nhị phân sau xóa nút 25 56 T2 18 Cây10tìm kiếm nhị 25 phân sau xóa nút03 Cây3 tìm kiếm nhị18phân ban đầu T1 25 T1 Cây tìm kiếm nhị phân sau xóa nút 20 T2 Tiêu mục Hoạt động thầy - trò ? Viết thủ tục mô tả thuật toán loại bỏ khỏi tìm kiếm nhị phân đỉnh trỏ P trỏ vào Procedure Del (Var P: Pt) ; Var Q , Q1 : pointer ; Begin If P^.right = nil Then Begin Q : = P ; P : = P^.left ; End Else If P^.left = nil Then Begin Q: = P ; P : = P^.right End Else Begin Q : = P^.left ; If Q^.right = nil Then Begin P^.key : = Q^.key ; P^.left : = Q^.left End Else Begin Repeat Q1 : = Q ; Q : = Q^.right Until Q^.right = nil ; P^.key : = Q^.key ; Q1^.right : = Q^.left End ; End ; Dispose (Q); End ; Procedure Delete (Var Root : PT : x : Item) ; 57 Tiêu mục Hoạt động thầy - trò Begin If Root < > nil Then If x < Root^.key Then Delete (Root^.left, x) Else If x > Root^.key Then Delete (Root^.right, x) Else Del (Root) ; End ; P P Q 15 10 10 T2 T1 10 T2 P P 30 20 Q1 15 T1 T1 T4 Q 10 T4 15 T1 20 T2 Q1 T2 T3 T3 F CỦNG CỐ, HỌC TẬP TẠI NHÀ * Củng cố Qua học em nắm định nghĩa, cách biểu diễn số thao tác thực nhị phân, tìm kiếm nhị phân * Nhiệm vụ học tập nhà - Nghiên cứu lại nội dung cũ - Tìm hiểu ký pháp tiền tố, trung tố hậu tố 58 Ngày soạn Ngày giảng: §3 Ký pháp tiền tố, trung tố hậu tố A MỤC TIÊU Kiến thức Giúp SV nắm cách biểu diễn biểu thức dạng tiền tố, hậu tố trung tố; hiểu cách tính, cách xây dựng nhị phân để biểu diễn biểu thức đó; biết cách chuyển biểu thức từ dạng trung tố sang dạng hậu tố Kỹ - Rèn kỹ khai thác tri thức từ giáo trình, tài liệu tham khảo - Rèn kỹ thao tác với biểu thức dạng tiền tố, trung tố hậu tố thông qua số ví dụ cụ thể Thái độ SV tự tin, ham học hỏi trình tiếp thu tri thức B CHUẨN BỊ Giảng viên: Sinh viên: Giáo án, đồ dùng giảng dạy Giáo trình, đồ dùng học tập C PHƯƠNG PHÁP - Phương pháp đặt - giải 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 Cấu trúc liệu, Nguyễn Thị Tĩnh (chủ biên), Nxb ĐHSP Hà Nội Cấu trúc liệu 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 Ổn định tổ chức Tổng số SV: Nội dung giảng Có mặt: Vắng: (… có phép) Tiêu mục Hoạt động thầy - trò Biểu thức dạng nhị phân Có thể biểu diễn biểu thức số học gồm phép toán cộng, trừ, nhân, chia nhị phân - Cách biểu diễn: nút biểu thị hay biến (các toán hạng), nút biểu thị toán tử (phép toán) Mỗi phép toán nút tác động lên hai biểu thức nằm bên trái bên phải nút * - Ví dụ: biểu diễn biểu thức + (6 / + 3) * (7 - 4) / 59 Tiêu mục Các ký pháp cho biểu thức Hoạt động thầy - trò - Với nhị phân biểu diễn biểu thức ? Cho biết kết duyệt biểu thức theo thứ tự Preorder (* + / - 4) + Nếu duyệt biểu thức theo thứ tự Preorder ta biểu thức dạng tiền tố (prefix) → Trong ký pháp này, toán tử viết trước hai toán hạng tương ứng, người ta gọi ký pháp ký pháp Balan ? Cho biết kết duyệt biểu thức theo thứ tự Posorder (6 / + - *) + Nếu duyệt biểu thức theo thứ tự Postorder, ta có biểu thức dạng hậu tố(postfix) → Trong ký pháp này, toán tử viết sau hai toán hạng tương ứng, người ta gọi ký pháp ký pháp nghịch đảo Balan (Reverse Polish Notation - PRN) ? Cho biết kết duyệt biểu thức theo thứ tự Inorder (6 / + * - 4) + Nếu duyệt theo thứ tự Inorder ta nhận cách viết thông thường biểu thức → Ký pháp dạng mập mờ thiếu dấu ngoặc, ta thêm vào thủ tục duyệt theo thứ tự Inorder việc bổ sung cặp dấu ngoặc vào biểu thức ta thu biểu thức (((6 / 2) + 3) * (7 - 4)) Ký pháp gọi dạng trung tố (infix) biểu thức * Lưu ý: có dạng trung tố cần có dấu ngoặc đơn, dạng tiền tố hậu tố không cần phải có Cách tính giá trị biểu thức Có vấn đề cần lưu ý máy tính tính giá trị biểu thức số học gồm toán tử hai (toán tử gồm hai toán hạng + - * /) máy tính thực phép toán với hai toán hạng, biểu thức phức tạp máy phải chia nhỏ tính riêng biểu thức trung gian, sau lấy giá trị tìm để tính tiếp Ví dụ + + máy phải tính + trước kết 3, sau đem + thực phép cộng ba số lúc Khi lưu trữ biểu thức dạng nhị phân coi nhánh mô tả biểu thức trung gian mà máy tính cần tính xử lý biểu thức lớn Như ví dụ máy tính tính hai biểu thức / + - trước thực phép * cuối Để tính biểu thức / + máy lại phải tính biểu thức / trước đem cộng với 60 Tiêu mục Hoạt động thầy - trò ? Viết hàm mô trình máy tính tính giá trị biểu thức lưu trữ nhánh nhị phân gốc nút n Function Calculate(n) : Value; Begin If (n toán tử) Then Calculate := Giá trị chứa nút n Else Begin x := Calculate (nút trái n); y := Calculate (nút phải n); Calculate := x R y; End; End; Ta thấy rằng, tính toán biểu thức, máy phải quan tâm tới việc tính biểu thức hai nhánh trước, xét đến toán tử nút gốc, điều làm ta nghĩ tới phép duyệt hậu thứ tự ký pháp hậu tố Trong năm đầu 1950, nhà lôgic học người Ba Lan Jan Lukasiewicz chứng minh biểu thức hậu tố không cần phải có dấu ngoặc tính cách đắn cách đọc biểu thức từ trái qua phải dùng Stack để lưu kết trung gian - Thuật toán tính giá trị biểu thức BaLan Jan Lukasiewicz Bước 1: Khởi động Stack rỗng Bước 2: Đọc phần tử biểu thức PRN từ trái qua phải (có thể hằng, biến hay toán tử) với phần tử ta kiểm tra: → Nếu toán hạng đẩy giá trị vào Stack → Nếu toán tử ta lấy từ Stack hai giá trị (giả sử y x) sau áp dụng toán tử (giả sử R) với hai giá trị vừa lấy ra, sau đẩy kết tính vào Stack Bước 3: Thông báo kết biểu thức - Ví dụ: Tính giá trị biểu thức (10 / + 3) * (7 - 4) ? Viết biểu thức dạng hậu tố (10 / + - *) Đọ c 10 / + * Xử lý Stack Đẩy vào Stack 10 Đẩy vào Stack 2,10 Lấy 10 khỏi Stack, tính 10/2 = 5, đẩy vào Stack Đẩy vào Stack 3, Lấy khỏi Stack, tính + = 8, đẩy vào Stack Đẩy vào Stack 7, Đẩy vào Stack 4, 7, Lấy khỏi Stack, tính - = 3, đẩy vào Stack 3, Lấy khỏi Stack, tính * = 24, đẩy 24 vào Stack 24 61 Tiêu mục Hoạt động thầy - trò ⇒ Kết quả: (10 / + 3) * (7 - 4) = 24 Bài tập nhà: Lập trình tính giá trị biểu thức PRN Chuyển từ dạng trung tố sang dạng hậu tố Có thể thấy việc tính toán biểu thức viết ký pháp nghịch đảo Balan khoa học hơn, đơn giản việc tính toán biểu thức viết ký pháp trung tố Chính thế, chương trình dịch cho phép lập trình viên viết biểu thức ký pháp trung tố theo thói quen, song trước dịch lệnh máy tất biểu thức chuyển dạng PRN Vấn đề đặt phải có thuật toán chuyển biểu thức dạng trung tố dạng PRN cách có hiệu Ta nghiên cứu, tìm hiểu thuật toán - Thuật toán Creat(Stack S); For Do {T hằng, biến, toán tử dấu ngoặc đọc từ biểu thức infix theo thứ tự từ trái qua phải} Case T Of ‘(‘: Push(T,S); ‘)’: Repeat x := Pop(S); If x ‘(‘ Then Output(x); Until x = ‘(‘; ‘+’, ‘-‘, ‘*’, ‘/’: Begin While not Empty(S) and (Priority (T) 3) or not (A > 0) ((A>0) or (A < 0)) and (B * B - * A * C < 0) F CỦNG CỐ, HỌC TẬP TẠI NHÀ * Củng cố Qua học em nắm đcách biểu diễn biểu thức dạng tiền tố, hậu tố trung tố; hiểu cách tính, cách xây dựng nhị phân để biểu diễn biểu thức đó; biết cách chuyển biểu thức từ dạng trung tố sang dạng hậu tố * Nhiệm vụ học tập nhà - Nghiên cứu lại nội dung cũ - Làm tập nhà 64 ... mô hình danh sách móc nối vòng tròn Basic móc nối a1 an an-1 a2 ? Thế danh sách móc nối vòng tròn - Danh sách móc nối vòng tròn danh sách mà trỏ next phần tử cuối lại trỏ phần tử danh sách ?... List);  Tìm kiếm phần tử 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... ok; End;  Kiểm tra xem danh sách có rỗng không ? Danh sách rỗng Function Empty (L : List) : Boolean; Begin Empty := L.count = 0; End;  Kiểm tra xem danh sách đầy chưa ? Danh sách đầy Function

Ngày đăng: 31/03/2017, 22:09

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan