Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 218 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
218
Dung lượng
5,16 MB
Nội dung
Đỗ xuân lôi Cấu trúc liệu & giải thuật (In lần thứ 5) Nhà xuất thống kê Cấu trúc liệu giải thuật Đỗ Xuân Lôi Chịu trách nhiệm xuất bản: Chịu trách nhiệm thảo: Biên tập: Trờng Sinh Sửa in: Tuấn Nghĩa Trình bày bìa: Thu Thuỷ Cát Văn Thành Trịnh Đình Chữ In 1000 cuốn, khổ (14,5 x 20,5) cm, xởng in Ban T tởng Văn hoá Thành uỷ TP.HCM Theo giấy phép xuất số: 157-19/XB/QLXB, Cục Xuất cấp ngày 06/09/1999 In xong nộp lu chiểu tháng 09/1999 Lời giới thiệu Tác giả sách Cấu trúc liệu giải thuật PGS Đỗ Xuân Lôi, nguyên Chủ nhiệm Khoa Tin học trờng Đại học Bách khoa Hà Nội Ngay từ năm đầu thập kỷ 70, tác giả sớm tập trung công sức vào việc xây dựng chơng trình soạn thảo giáo trình Cấu trúc liệu Tác giả ngời đầu tiên, đầy nhiệt huyết đa việc giảng dạy môn học vào chơng trình đào tạo kỹ s Tin học nớc ta Sau 20 năm trực tiếp giảng dạy cấu trúc liệu giải thuật trờng ĐHBK Hà Nội, chắn thuật ngữ kinh nghiệm thu thập đợc tác giả đợc đúc kết đầy đủ vào nội dung phong cách trình bày sách Chúng hy vọng sách với tính khoa học s phạm giúp cho bạn đọc tiếp thu dễ dàng kiến thức cần thiết, góp phần nâng cao trình độ tin học Gs Ts Nguyễn Đình Trí 6T7 - 6T7.3 157 - 19 - 99 TK 99 Lời nói đầu (Cho lần tái lần thứ nhất) Cuốn sách phản ảnh nội dung môn học sở chơng trình đào tạo kỹ s tin học sinh viên đợc làm quen với số kiến thức cấu trúc liệu giải thuật có liên quan, từ tạo điều kiện cho việc nâng cao thêm kỹ thuật lập trình, ph ơng pháp giải toán, giúp sinh viên có khả sâu thêm vào môn học chuyên ngành nh sở liệu, trí tuệ nhân tạo, hệ chuyên gia, ngôn ngữ hình thức , chơng trình dịch v.v Nội dung sách đợc chia làm phần Phần I: Bổ sung thêm nhận thức mối quan hệ cấu trúc liệu giải thuật, vấn đề thiết kế, phân tích giải thuật giải thuật đệ qui Phần II: Giới thiệu số cấu trúc liệu, giải thuật xử lý chung vài ứng dụng điển hình sinh viên tiếp cận với cấu trúc nh mảng, danh sách, cây, đồ thị vài cấu trúc phi tuyến khác sinh viên có điều kiện hiểu biết thêm số toán thuộc loại phi số, nh thu lợm thêm kinh nghiệm thiết kế, cài đặt xử lý chúng Phần III: Tập trung vào xếp tìm kiếm, yêu cầu xử lý phổ biến ứng dụng tin học Có thể coi nh phần minh học thêm cho việc ứng dụng cấu trúc liệu khác loại toán Cuốn sách bao gồm 11 chơng, chủ yếu giới thiệu kiến thức cần thiết cho 90 tiết học, lý thuyết tập (sau sinh viên học tin học đại cơng) Tuy nhiên, với mục đích vừa làm tài liệu học tập, vừa làm tài liệu tham khảo, nên nội dung có bao hàm thêm số phần nâng cao Bài tập sau chơng đợc chọn lọc mức trung bình, để sinh viên qua hiểu thêm giảng thu hoạch thêm số nội dung không đ ợc trực tiếp giới thiệu Cuốn sách đợc dùng làm tài liệu học tập cho sinh viên hệ kỹ s tin học, cử nhân tin học, cử nhân cao đẳng kỹ thuật tin học; làm tài liệu tham khảo cho sinh viên cao học, nghiên cứu sinh, giảng viên tin học cán tin học muốn nâng cao thêm trình độ Trong trình chuẩn bị, tác giả nhận đợc ý kiến đóng góp nội dung, chỉnh lý lại để sách đợc tái hoàn chỉnh Tác giả xin chân thành cảm ơn: Giáo s Nguyễn Đình Trí chủ nhiệm đề tài cấp nhà nớc KC01-13 Tin học - Điện tử - Viễn thông; PGS Nguyễn Xuân Huy, Viện tin học VN; PGS Nguyễn Văn Ba, PTS Nguyễn Thanh Thuỷ đồng nghiệp Khoa Tin học trờng ĐH Bách khoa HN Mặc dầu sách thể phần cân nhắc lựa chọn tác giả việc kết hợp yêu cầu khoa học với tính thực tiễn, tính s phạm giảng, nhng chắn không tránh khỏi thiếu sót Tác giả mong muốn nhận đợc ý kiến đóng góp thêm để hoàn thiện nội dung sách, lần tái sau Đỗ Xuân Lôi 12/96 Phần I Giải thuật 32 Chơng I - Mở đầu Chơng I - Mở đầu 33 Chơng I Mở đầu 1.1 Giải thuật cấu trúc liệu Có thể, có lúc, nói tới việc giải toán máy tính điện tử, ngời ta ý tới giải thuật (algorrithms) Đó dãy câu lệnh (statements) chặt chẽ rõ ràng xác định trình tự thao tác số đối tợng cho sau số hữu hạn bớc thực ta đạt đợc kết mong muốn Nhng, xét cho cùng, giải thuật phản ánh phép xử lý, đối tợng để xử lý máy tính điện tử, liệu (data) chúng biểu diễn thông tin cần thiết cho toán: kiện đa vào kết trung gian Không thể nói tới giải thuật mà không nghĩ tới: giải thuật đ ợc tác động liệu nào, xét tới liệu phải hiểu: liệu cần đợc tác động giải thuật để đa tới kết mong muốn Bản thân phần tử liệu thờng có mối quan hệ với nhau, lại biết tổ chức theo cấu trúc thích hợp việc thực phép xử lý liệu thuận lợi hơn, đạt hiệu cao Với cấu trúc liệu chọn ta có giải thuật xử lý t ơng ứng Cấu trúc liệu thay đổi, giải thuật thay đổi theo Ta thấy rõ điều qua ví dụ sau: Giả sử ta có danh sách gồm cặp Tên đơn vị, số điện thoại: (a 1, b1), (a2, b2) (an, bn) Ta muốn viết chơng trình cho máy tính điện tử để cho biết tên đơn vị máy in cho ta: số điện thoại Đó loại toán mà phép xử lý tìm kiếm - Một cách đơn giản điểm lần lợt tên danh sách a 1, a2, a3 vv túc tìm thấy tên đơn vị đó, định, đối chiếu số điện thoại tơng ứng bi Nhng việc làm đợc danh mục điện thoại ngắn, nghĩa với n nhỏ, n lớn thời gian - Nếu trớc danh mục điện thoại đợc xếp theo thứ tự tự điển (dictionary order) tên đơn vị, tất nhiên áp dụng giải thuật tìm kiếm khác tốt hơn, nh ta thờng làm tra tự điển - Nếu lại tổ chức thêm bảng mục lục dẫn theo chữ tên đơn vị, tìm số điện thoại Đại học Bách khoa ta bỏ qua đợc tên đơn vị mà chữ đầu Đ Nh vậy: cấu trúc liệu giải thuật có mối quan hệ mật thiết Có thể coi chúng nh hình với bóng Không thể nói tới mà không nhắc tới Chính điều dẫn tới việc, cần nghiên cứu cấu trúc liệu (data structures) đôi với việc xác định giải thuật xử lý cấu trúc 1.2 Cấu trúc liệu vấn đề liên quan 1.2.1 Trong toán, liệu bao gồm môt tập phần tử sở, mà ta gọi liệu nguyên tử (atoms) Nó chữ số, ký tự vv , nh ng số, hay từ vv điều tuỳ thuộc vào toán Trên sở liệu nguyên tử, cung cách (manners) theo liên kết chúng lại với nhau, dẫn tới cấu trúc liệu khác Lựa chọn cấu trúc liệu thích hợp để tổ chức liệu vào sở xây dựng đ ợc giải thuật xử lý hữu hiệu đa tới kết mong muốn cho toán, khâu quan trọng Chơng I - Mở đầu 32 Chơng I - Mở đầu 33 Cần ý rằng, năm gần đây, lớp khái niệm cấu trúc liệu tăng lên đáng kể Thoạt đầu, ứng dụng máy tính điện tử có phạm vi toán khoa học kỹ thuật ta gặp cấu trúc liệu đơn giản nh biến, vectơ, ma trận vv nhng ứng dụng mở rộng sang lĩnh vực khác mà ta th ờng gọi toán phi số (non-numerical problems), với đặc điểm thể chỗ: khối l ợng liệu lớn, đa dạng, biến động, phép xử lý th ờng phép số học v.v cấu trúc không đủ đặc trng cho mối quan hệ liệu Việc sâu thêm vào cấu trúc liệu phức tạp hơn, quan tâm ta giáo trình 1.2.2 Đối với toán phi số đôi với cấu trúc liệu xuất phép toán tác động cấu trúc Phép tạo định hay huỷ bỏ cấu trúc, phép truy cập vào phần tử cấu trúc, phép bổ sung (insertion) loại bỏ (deletion) phần tử cấu trúc v.v Các phép có tác dụng khác cấu trúc Có phép hữu hiệu cấu trúc nh ng lại tỏ không hữu hiệu cấu trúc khác Vì chọn cấu trúc liệu phải nghĩ tới phép toán tác động cấu trúc Và ng ợc lại, nói tới phép toán lại phải ý tới phép đợc tác động lên cấu trúc Cho nên lạ ngời ta quan niệm: nói tới cấu trúc liệu bao hàm phép toán tác động cấu trúc giáo trình ta tách riêng hai khái niệm nhng cấu trúc liệu phép toán tơng ứng đợc trình bày với 1.2.3 Cách biểu diễn cấu trúc liệu nhớ đợc gọi cấu trúc lu trữ (storage structures) Đó cách cài 490 Chơng - Quản lý nhớ Chơng - Quản lý nhớ 491 SELECT - SORT INSERT - SORT BUBBLE - SORT việc đổi chỗ thực tiến hành với ghi 9.4 Hãy tính số lợng phép chuyển chỗ ghi hai trờng hợp: thuận lợi xấu ba giải thuật xếp đơn giản (kích th ớc bảng cần xếp n) 9.5 Một giải thuật xếp đợc gọi ổn định (stable) thứ tự tơng đối ghi khoá không thay đổi sau thực xếp Hãy xem giải thuật SELECT - SORT Và BUBBLE - SORT sửa đổi để áp dụng cho dẫy khoá có chứa khoá không? Lúc chúng có ổn định không? 9.6 Hãy sửa lại ba giải thuật xếp đơn giản để thực xếp theo thứ tự giảm dần 9.7 Với dãy khoá cho 9.2 minh hoạ hai phơng pháp xếp theo thứ tự giảm dần 9.8 Nhận xét so sánh hai phơng pháp xếp phân đoạn kiểu vun đống 9.9 Nếu áp dụng cách chọn chốt theo kiểu Singleton dãy khoá làm ví dụ, nêu chốtsẽ khoá nào? Hãy thực xếp với cách chọn khoá chốt với dãy 9.10 Nếu thực xếp theo thứ tự giảm dần đống đợc định nghĩa cho thích hợp? 9.11 Hãy giải thích tại hoà nhập hai đờng với S mạch ban đầu số lợt [log2 S] 9.12 Có thể phát triển phép hoà nhập hai đờng để thực hoà nhập k đờng đợc không (k>2) 9.13 Hãy thực xếp kiểu hoà nhập hai đờng tự nhiên với dãy khoá cho tập 9.2 Chơng 10 Tìm kiếm (searching) 10.1 Bài toán tìm kiếm Tìm kiếm đòi hỏi thờng xuyên đời sống hàng ngày nh xử lý tin học Ngay chơng trớc ta thấy xuất yêu cầu vèe tìm kiếm Tuy nhiên, lúc vấn đề đợc xét giải mối quan hệ mật thiết với phép xử lý chính, phép xếp Còn bây giờ, chơng này, toán tìm kiếm đợc đặt cách độc lập tổng quát, liên quan đến mục đích xử lý cụ thể khác Ta phát biểu nh sau: Cho bảng gồm n ghi R1, R2, , Rn Mỗi ghi Ri (1 i n) tơng ứng với khoá ki Hãy tìm ghi có giá trị khoá tơng ứng X cho trớc X đợc gọi khoá tìm kiếm hay đối trị tìm kiếm (argument) Công việc tìm kiếm hoàn thành có hai tình sau xảy ra: 1) Tìm đợc ghi có giá trị khoá tơng ứng X, lúc ta nói: phép tìm kiếm đợc thoả (successful) 2) Không tìm đợc ghi có giá trị khoá X cả: phép tìm kiếm không thoả (unsuccessful) Sau phép tìm kiếm không thoả có xuất yêu cầu bổ sung thêm ghi có khoá X vào bảng Giải thuật thể yêu cầu đợc gọi giải thuật tìm kiếm có bổ sung Tơng tự nh xếp, khoá ghi đặc điểm nhận biết ghi tìm kiếm, ta coi nh đại diện cho ghi giải thuật, ví dụ ta nói tới khoá Để cho tiện, ta coi khóa k i (1 i n) số khác ta xét tới phơng pháp tìm kiếm phổ dụng, liệu nhớ nghĩa tìm kiếm trong, tìm kiếm đợc xét chơng sau 10.2 tìm kiếm (sequential searching) Chơng - Quản lý nhớ 490 Chơng - Quản lý nhớ 491 10.2.1 Tìm kiếm kỹ thuật tìm kiếm đơn giản cổ điển Nội dung tóm tắt nh sau: Bấ đầu từ ghi thứ nhất, lần lợt so sánh khoá tìm kiếm với khoá tơng ứng bảng ghi bảng, tìm đợc ghi mong muốn hết bảng mà cha thấy Sau giải thuật: Function: SEQUEN - SEARCH (k, n,X) { Cho dãy khóa k gồm n phần tử Thủ tục thực tìm kiếm dãy xem có khoá X không Nếu có đ a số khoá ấy, không đa giá trị Trong thủ tục có sử dụng khoá phụ kn+1 mà giá trị X} 1) {khởi đầu} i := 1, k[n+1] := X; 2) { Tìm khoá dãy} while k[i] X i := i + 1; 3{ Tìm thấy hay không? } if i = n + then return (o) else return (i) 10.2.2 đây, để đánh giá hiệu lực phép tìm kiếm ta dựa vào số lợng phép so sánh Ta thấy với giải thuật thuận lợi cần phép so sánh: Cmin = 1; xấu Cmax = n + Nếu giả sử tợng khoá tìm kím trung với khoá bảng đồng khả C tb = Tóm lại trờng ộp xấu nh trung bình, cấp độ lớn thời gian thực giải thuật O(n) Nhng xác suất để xuất ki = X pi mà pi với n +1 sao? Lúc ta có Ctb = * p1 + * p2 + + n* pn n n pi = i =1 Rõ ràng p1 p2 pn thời gian trung bình nhỏ Nhng muốn nh phải xếp trớc 10.3 Tìm kiếm nhị phân (Binary searching) 10.3.1 Tìm kiếm nhị phân phơng pháp tìm kiếm thông dụng Nó tơng tự nh cách thức ta làm trea tìm số điện thoại quan, bảng danh mục điện thoại hay tìm từ từ điển Chỉ có điều khác công việc để so sánh với khoá tìm kiếm ta chọn hú hoạ phần tử, với phép tìm kiếm nhị phân luôn chọn khoá dãy khoá xét để thực so sánh với khoá + r tìm kiếm Giả sử dãy khóa xét k 1, , kr khoá dãy ki với i = Tìm kiếm kết thúc X = k i Nếu X< ki tìm kiếm đợc thực tiếp với k1, , ki-1, X > ki tìm kiếm lại đợc làm với ki+1, , kr Voí dãy khoá sau kỹ thuật tơng tự lại đợc sử dụng Quá trình tìm kiếm đợc tiếp tục tìm thấy khoá mong muốn dãy khoá xét trở nên rỗng (không thấy) Giải thuật sau thể phép tìm kiếm Function BINATRY SEARCH (k, n, X) 490 Chơng - Quản lý nhớ Chơng - Quản lý nhớ 491 { cho dãy k gồm n khoá đợc xếp theo thứ tự tăng dần Giải thuật tìm xem dãy có khoá giá trịi X hay không dùng biến l, r, m để ghi nhận số phần tử đầu, phần tử cuối phần tử dãy khoá k Nếu phép tìm kiếm đ ợc thoả, giá trị cho số khoá tìm thấy, không cho giá trị 0} { khởi đầu} l := 1; r := n; { Tìm } while l r begin { Tính số giữa} m := [(1+r)/2]; { so sánh} if X < k[m] then r := m -1 else if X> k[m] then l := m +1 else return (m) end {Tìm kiếm không thoả } return (o) * ví dụ: với dãy khoá 11 23 36 42 58 65 74 87 94 99 a) Nếu X = 23: phép tìm kiếm đợc thoả bớc nh sau: [11 23 36 42 58 65 74 87 94 99] [11 23 36 42] b) Nếu X = 71: phép tìm kiếm không thoả [11 23 36 42 58 65 74 87 94 99] [65 74 87 94 99] [65 74] [74] ][ (ở [ứng với l, ] ứng với r, - ứng với m) Giải thuật tìm kiếm nhị phân viết dới dạng đệ quy nh sau:Function RBINARY - SEARCH (l, r, k, X) {l, r, số dới số dãy k, m số dùng thêm biến nguyê LOC để đ a số ứng với khoá cần tìm, tìm kiếm không thoả LOC có giá trị 0} 1- if > r then LOC := else m := [(1+r)/2]; 490 Chơng - Quản lý nhớ Chơng - Quản lý nhớ 491 if X 34 ta chuyển sang phải; - So sánh X với 66: X > 66, ta chuyển sang phải; - So sánh X với 71: X < 71 ta chuyển sang trái; - So sánh X với 68: X = 68 tìm kiếm đợc thoả; Nhng X = 30 phải: - So sánh X với 34: X < 34, ta chuyển sang trái; - So sánh X với 17: X > 17, ta chuyển sang phải; - So sánh X với 25: X > 25, ta chuyển sang phải; nhng phải rỗng phép tìm kiếm không thoả Nếu sau phép tìm kiếm không thoả ta bổ sung X vào nhị phân tìm kiếm (nh ví dụ vừa xét ta bổ sung khoá 30 vào thành phải nút 25) ta thấy phép bổ sung thực đơn giản không làm ảnh hởng tới vị trí khoá có cả, tính chất nhị phân tìm kiếm đợc đảm bảo Nếu giả sử quy cách nút nhị phân tìm kiếm có dạng: LPTR KEY RPTR INFO trờng LPTR RPTR chứa trỏ trỏ tới gốc trái phải nút Trờng KEY ghi nhận giá trị khoá tơng ứng nút, trờng INFO ghi nhận thông tin khác, vai trò tìm kiếm Function BST (T, X) { Thủ tục thực tìm kiếm nhị phân tìm kiếm có gốc đ ợc trỏ T, nút có khoá X Nếu tìm kiếm đợc thoả đa trỏ q trỏ tới nút đó, tìm kiếm không thoả bổ sung nút có khoá X vào T đa trỏ q trỏ tới nút kèm theo thông báo} {Khởi tạo trỏ} p := null, q := T; {Tìm kiếm} while q null case X < KEY (q): p := q, q := LPTR(q); X = KEY (q): return (q); 490 Chơng - Quản lý nhớ Chơng - Quản lý nhớ 491 X > KEY (q): p := q, q := RPTR (q); end case; { Boỏ sung} q AVALL: KEY (q) := X; LPTR(q) := RPTR(q) := null; case T = null: T := q; {cây rỗng, bổ sung} X < KEY(p): LOTR (p) := q; else: RPTR(p) := q end case; write ( không thấy, bổ sung); return(q) Voín giải thuật suy ra: ta đựng đợc nhị phân tìm kiếm ứmg với dãy khoá đa vào cách liên tục bổ sung nút ứng với khoá, rỗng Tấtn nhiên đầu phải dựng lên nút gốc ứng với khóa (tr ờng hợp tìm kiếm rỗng) sau khoá tiếp theo, tìm không thấy bổ sung vào Ví dụ, với dãy khoá nh nêu chơng trớc nhị phân tìm kiếm dựng đợc có dạng ỏ hình 10.2 10.4.3 Phân tích đánh giá Rõ ràng, với giải thuật BST nêu trên, ta thấy dạng nhị phân tìm kiếm dựng đợc hoàn toàn phụ thuộc vào dãy khoá đa vào Nh có nghĩa là, trình xử lý động ta biết trớc đợc phát triển sao, hình dạng Rất nhị phân hoàn chỉnh (mà ta gọi la cân đối, cha đầy đủ) chiều cao [log (n +1)], phí tìm kiếm có tốc độ lớn O (log 2n): trờng hợp thuận lợi mà ta mong đợi Nhng nhị phân suy biến (chẳng hạn dãy khoá đa vào vốn có thứ tự xếp rồi!)không khác danh sách tuyến tính mà tìm kiếm tìm kiếm với chi phí có cấp O(n) ĐIều dễ đ a ta tới khuynh hớng lo ngại khiến ta thiếu tin tởng phơng pháp tìm kiếm Thực ra, ngời ta chứng minh đợc số lợng trung bình phép so sánh tìm kiếm câynhị phân tìm kiếm Ctb 1,386 log2n Nh cấp độ lớn thời gian thực trung bình giải thuật BST O (log 2n) xét chi tiết chi phí tìm kiếm trung bình lớn khoảng 39%so với chi phí tìm kiếm cân đối Tới xuất thêm câu hỏi là: Tại lại không tìm cách dựng lêm nhị phântìm kiếm cân đối để đật đợc chi phí tối thiểu ? Ta tìm thấy câu trả lời qua việc xét ví dụ đơn giản sau: Giả sử ta có nhị phân tìm kiếm cân đối hình 10.3 Nếu xuất khoá X = sao? Ta thấy phép tìm kiếm với X nh không đớc thoả ta phải bổ sung nút có khoá vào (Hình 10.4).Ta thấy không cân đối Lẽ tất nhiên ta phải tái cân đối lại để có cân nút nh hình 10.5 Nhìn vào hình, ta thấy hầu nh không chút mà mối nối đợc giữ nguyên nh cũ Nh việc tái cân đối đòi nỏi phải lại nhiều mối nối, nghĩa tốn nhiều thời gian ! Do phép bổ sung thờng xuyên đợc thực cachs làm trở nêm không thực tế Chính điều dẫn ta tới câu trả lời cho câu hỏi đặt 10.4.4, Loại bỏ nhị phân tìm kiếm 490 Chơng - Quản lý nhớ Chơng - Quản lý nhớ 491 Khi nút ứng với khoá (đợc định) bị loại khỏi nhị phân tìm kiếm vấn đề xảy ra? Việc xử lý không đơn giản nh bổ sung để đảm bảo đợc phần lại moọt nhị phân tìm kiếm ta phải sửa lại nghĩa tìm nút thay để nhận trỏ mà trớc trỏ tới chứa trỏ cần thiết khác Nếu nút bị loại bỏ nút ta không cần phải tìm nút thay Mối nối cũ trỏ tới (từ nút cha nó)sẽ đợc thay mối nối không Nếu nút bị loại bỏ nút nửa lá, nghĩa có trái phải Mối nút cũ trỏ tới trỏ tới nút thay Trờng hợp tổng uát: nút bị loại bỏ có trái lẫn phải, nút thay nút ứng với khoá nhỏ sát tr ớc nó(nút cực phải trái đó) nút ứng với khoá lớn sát sau (nút cực trái phải nó).Nh phải thay đổi số mối nối, nút: - Nút cha nút bị loại bỏ; - Nút đợc chọn làm nút thay - Nút cha nút đợc chọnlàm nút thay Hình 10.6 minh hoạ trờng hợp Trong trờng hợp nút thay đợc chọn nút cực phải trái *** Trang 281 Sau giải thuật thực loại bỏ nút trỏ Q Thoạth đầu Q nối trái nối phải nút R nhị phân tìm kiếm,mà ta giả sử biết Procedure BSTDEL(Q) { Trong thủ tục ta phải hiểu Q đại diện cho LPTR(R) RPTR(R) Giả sử LPTR(R) câu lệnh Q := RPTR(P)t ơng đơng với LPTR(R) := RPTR(p) {Xử lý trờng hợp nút nửa lá} p := Q; if LPTR(p) = null then begin Q := RPTR(p); P AVALL end; if RPTR(p) = null then begin Q := LPTR(p); P AVALL end; { Xử lý trơng hợp tổng quát] T := LPTR(p); if RPTR (T) = null then begin RPTR(T) := RPTR(p); p AVALL end; 490 Chơng - Quản lý nhớ Chơng - Quản lý nhớ 491 S := RPTR(T) ; {tìm nút thay nút cực phải trái} while RPTR(S) null begin T := S; S := RPTR(T) end; RPTR(S) := RPTR(P); RPTR(T) := LPTR(S); LPTR(S) := LPTR(P); Q := S; P AVALL; ruturn Qua giải thuật ta thấy loại bỏ nút khỏi nhị phân tìm kiếm, việc sửa lại đòi hỏi tối đa phải sửa bốn mối nối ba nút Nh chi phí sửa đổi nhiều Nếu cho biết giá trị khoá nút cần loại bỏ nhị phân tìm kiếm, t ơng tự nh tìm kiếm bổ sung, phép tìm kiếm loại bỏ có chi phí trung bình thời gian cấp O(log 2n) 10.5 Cây nhị phân cân đối AVL (AVL balanced binary tree) Cây nhị phân tìm kiếm với u điểm thực dễ dàng phép bổ sung loại bỏ tỏ thuận tiện cho việc xử lý bảng biến động Tuy nhiên để phát triển tự nhiên khuynh hớng suy biến xuất điều làm cho ngời sử dụng phải lo ngại Còn muốn luôn đạt đợc chi phí tối thiểu đòi hỏi phải đợc cân đối Nhng nh ta biết, việc sửa lại cho cân đối tiến hành thờng xuyên gây tổn phí nhiều thời gian công sức Vì cần phải tới giải pháp dung hoà: giảm bớt chặt chẽ tính cân đối để chánh đ ợc khả suy biến Năm 1962 P.M.ADELSON - VELSKI E.M LANDIS mở đầu phơng hớng giải cách đa dạng cân đối mà sau đọc mang tên họ, cay nhị phân cân đối AVL (ta gọi AVL cho gọn) 10.5 Định nghĩa tính chất Cây nhị phân gọi lạ cân đối AVL nh nút chiều cao hai tơng ứng chênh đơn vị Ví dụ: cân đối AVL với nút chữ số ghi bên cạnh nút hình 10.7 phản ánh tính cân đối nút, ta gọi hệ số cân đối (balance facter) 00 ứng với: trái phải có chiều cao (cân bằng) 01: ứng với: phải có chiều cao lớn (lệch phải) 10 ứng với: cay trái có chiều cao lớn (lệch trái) Ta thấy nhị phân hoàn chỉnh cân đối AVL nhng AVL cha nhị phân hoàn chỉnh (nh hình 10.7).Điều nói lên: tính cân đối AVL có giảm nhẹ so với tính cân đối nhị phân hoàn chỉnh Trong công trình mình, Adelson - Velski Landis khẳng định đ ợc chiều cao cân đối AVL vợt khoảng 45% so với chiều cao nhịn phân hoàn chỉnh Cụ thể gọi chiều cao cân đốiAVL có n nút h AVL (n) thì: log 2(n+1) hAVL (n) 1,4404 (log2n+2) - 0,328 (1) Rõ ràng cận dới chiều cao nhị phân hoàn chỉnh có n nút, cận chiều cao loại AVL nào? 490 Chơng - Quản lý nhớ Chơng - Quản lý nhớ 491 Chú ý so cay AVL có chiều cao nh nhau, loại có số nút loại có chiều cao lớn số có nút nh Vì mhốn tìm loại nh nêu ta thử dựng câyAVL có chiều cao cố định h, số nút tối thiểu gọi cực tiểu (mintrees) Giả sử gọi Th Ta thấy T0 rỗng,T1 có nút Để có Th với h >1 ta phải có nút gốc với hai cực tiểu Do hai phải có chiều cao h - có chiều cao h -2 Hình 10.8 cho ta cực tiểu với h = 2, 3, *** Trang 285 Nếu gắn vào nút số coi chúng nh đóng vai trò khoá nhị phân tìm kiếm thấy: dãy số kể từ nút cực trái lên tới gốc, dãy số Fibopnacci Nh với T4 hình 10.8 dãy 1, 2, 3, Vì cực tiểu có tên Fibonacci Có thể định nghĩa nh sau: a) rỗng Fobonacci với chiều cao b) nút Fibonacci với chiều cao c) Nếu Th-1 Th-2 Fibonacci với chiều cao(h-1) (h-2)thì T h = < Th-1, X, Th-2 > Finonacci với chiều cao h Số nút Fibonacci Th đợc tính theo công thức truy hồi sau đây: N0 = 0, N1= Nh = Nh-1 + + Nh-2 * Theo (1) thấy nhị phân tìm kiếm mà luôn có dạng cân đối AV:, chi phí cho tìm kiếm tr ờng hợp xấu O (log 2n) Nhng tới đây, đặt câu hỏi: Để đảm bảo đợc tính cân đối AVL nhị phân tìm kiếm phép bổ sung loại bỏ có gây tổn phí thời gian không phần sau cho ta thấy câu trả lời: 10.5.2 Bổ sung AVL Ta xét tới ván đề giải bổ sung nút vào nhị phân tìm kiếm cân đôí AVL Trớc hết, cần ý quy cách nút có khác chút so với quy cách nêu 10.4.2 có thêm tr ờng BIT để ghi nhận hệ số cân đối nút (chỉ cần hai bit) Việc theo đờng tìm kiếm để thấy đợc khoá cha có sẵn biết đợc chỗ để bổ sung vào, tất nhiên đợc thực tơng tự nh nêu (thủ tục BST 10.4.2) Tuy nhiên có mmột điều khác đờng phải đợc ghi nhận lại để phục vụ cho việc xem chỉnh lý hệ số cân đối nút đờng đó, bị tác động việc bổ sung Sau nút đợc bổ sung có ba tình xảy với nút tiền bối nó.Để tiện trình bày, ta giả sử phép bổ sung đợc thực vào phía trái (còn vào phía phải tơng tự, ngời đọc tự suy thêm) Nh ba tình nêu cụ thể nh sau: a) Tình 1: phải cao 1(lệnh phải) sau phép bổ sung chiều cao hai b) Tình 2: Chiều cao hai vốn nhau, sau phép bổ sung trái cao 1(lệch trái) c)Tình 3: cay trái cao (lệch trái) sau phép bổ sung cao 2: tính cân đối AVL bị phá vỡ! Đối với tình càn chnhr lý hệ số cân đối nút xét Đối với tình 2, chiều cao có gốc nút xét bị thay đổi, phải chỉnh lý hệ số cân đối nút xét mà phải chỉnh lý hệ số cân đối nút tiền bối Dọc đờng ghi nhận tìm kiếm, phải xem xét để biết có xảy tình ba tình nêu nút không có biện pháp xử lý thích hợp Nh có phải lần ngợc lại tới tận gốc Còn tình đòi hỏi phải sửa lại mà nút xét nút gốc (ta gọi nút bất th ờng (criticalnode)) để cân đối lại có hai trờng hợp phải xử lý khác nhau.Hình 10.9 mô tả trờng hợp a) Trờng hợp1 (LL) Nút bổ sung làm tăng chiều cao tráicủa nút trái nút bất thờng Nh hình 10.9a) nút bổ sung làm tăng chiều cao , trái nút Chơng - Quản lý nhớ 490 Chơng - Quản lý nhớ 491 b) Trờng hợp (LR) Nút bổ sung làm tăng chiều cao phải nút trái nút bất th ờng Nh hình 10.9b) nút bổ sung làm tăng chiều cao +, phải nút *** trang 288 Đối với trờng hợp để tái cân đối ta phải thực phép quay từ trái sang phải để đ a nút (1) lên vị trí gốc con, nút (2) trở thành phải nó, đợc gắn vào thành trái (2) Ta thấy cách làm tơng tự nh cách áp dụng luật kết hợp đại số: thay (, , y) (, y) Ngời ta gọi phép phép quay đơn (single rotation) Xem hình 10.10 ***Trang 288 Còn trờng hợp phải thực hiẹn phép quay kép (double rotation), việc phối hợp hai phép quay đơn: quay trái trái((1), (2)) quay phải ((3), (2)) nh hình 10.11 *** Trang 289 Ví dụ sau minh hoạ cụ thể tình phép xử lý tơng ứng (hình 10.12) Nếu để ý, ta thấy: sau thực phép quay để tái cân đối mà nút gốc nút bất th ờng chiều cao gĩ nguyên nh trớc lúc bổ sung, nghĩa phép quay không lám ảnh hởng đến chiều cao có liên quan tới Ngoài tính chất nhị phân tìm kiếm đợc đảm bảo *** Trang 290 Chú ý: trờng hợp f lại rơi vào tình cân đối theo trờng hợp nút (6) bổ sung vào làm tăng chiều cao trái nút phải nút bất thờng (5): RL (suy tơng tự điều nêu trên, nhng ứng với phía phải) Song để thực phép quay ta phải sửa chút mối nối (quay đơn cần 2, quay kép cần 4) Điều nói lên tính đơn giản phép biến đổi cho ta thấy việc dựng nhị phân tìm kiếm AVL không phức tạp Tuy nhiên hai câu hỏi sau đặc biệt có liên quan tới phépa bổ sung Nếu n ! hoán vị n khoá xảy đồng khả chiều cao trung bình AVL dựng đợc bao nhiêu? Xác suất để thao tác bổ sung kéo theo việc tái cân đối bao nhiêu? Sự phân tích toán học giải thuật bổ sung AVL toán mở Nhng kiểm định thực nghiệm cho thấy rằng: chiều cao trung bình AVL đợc tạo lập xấp xỉ log 2n Điều có nghĩa dáng điệu nhị phân AVL tốt nh nhị phân hoàn chỉnh dễ bảo trì nhiều Thực nghiệm cho thấy trung bình hai lần bổ sung có lần phải tái cân đối phép quay đơn quay kép đồng khả * Phép loại bỏ đợc thực tơng tự với chi phí không khác so với phép bổ sung 10.6 Cây nhị phân tìm kiếm tối u (Optimal binary search tree) Trớc ta xét tới việc tổ chức nhị phân tìm kiếm dựa giả thiết t ợng đối trị tìm kiếm (khoá tìm kiếm) trùng với khoá đồng khả năng, nghĩa sác xuất để X = k i (i = 1,n) n Tuy nhiên thực tế, có nhiều trờng hợp đối trị tìm kiếm xuất với khả khác nhau, nói chung P i pj i j n (i, j 1,n) pi = i =1 Chẳng hạn, qua thống kê từ khoá đợc dùng hàng nghín chơng trình đa dịch, ngời ta thấy xác suất xuất từ khác nh Do đó, định tổ chức nhị phân tìm kiếm tơng ứng với từ khoá này, ví dụ để phục vụ cho việc xác định xem từ ch ơng trình có phải từ khoá không khâu việc tổ chức chơng trình dịch thực nh trớc đợc Rõ ràng khoá có sác xuất xuất Chơng - Quản lý nhớ 490 Chơng - Quản lý nhớ 491 lớn biết, để xét chi phí tìm kiếm đặc trng số lợng phép so sánh cần thiết tìm kiếm cây, ta phải ý tới độ dài đ ờng Do ta dựa vào khái niệm này, nhng có thay đổi chút để phản ánh đợc nhị phân tìm kiếm bây giờ, khoá mà sác xuất tìm kiếm lớn phải cần phải đợc tìm thấy nhanh hơn, quan niệm chi phí tìm kiểmtên phải thay đổi cho thích hợp Nh ta tơng ứng với đờng ngắn Muốn ngời ta gắn với khoá (nút) trọng số, xác suất xuất hiệncủa khoá tìm kiếm Điều có nghĩa khoá mà xác suất xuất lớn đợc coi nặng hơn, ngợc lại nhẹ Từ dẫn tới khái niệm độ dài đờng có trọng số ứng với nút cây, đợc định nghĩa cụ thể nh sau: n p = pi hi i =1 (10.1) Với pi xác suất để khoá ki xuất hi số mức nút tơng ứng với ki (hi = (độ dài đờng từ gốc tới nút đi) + 1, cũn số lợng phép so sánh cần thiết để tìm thấy ki) Và mục đích xác định đợc nhị phân tìm kiếm cho p có giá trị nhỏ VD: Cho khoá k1 < k2 < k3 với sắc suất tơng ứng p1 = p2 = p3 = 7' 7' 7' Cây nhị phân tìm kiếm với khoá dựng nh sau: *** trang 293 Độ dài đờng có trọng số chúng lần lợt là: P(a) = 1 17 + + = 7 7 P(b) = 1 15 + + = 7 7 P(c) = 12 + + = 7 7 P(d) = 4 12 +2 +3 = 7 7 11 + + = 7 7 Nh ta thấy (e) suy biến nhng lại đạt đợc yêu cầu (chứ nhị phân đầy đủ (c)!) Tuy nhiên cách đặt vấn đề nh xét tới trờng hợp tìm kiếm thoả mãn, xét toàn diện phải đề cập tới tr ờng hợp tìm kiếm không thỏa Vì ta đặt lại vấn đề nh sau: Có 2n + xác suất: P(e)= Chơng - Quản lý nhớ 490 Chơng - Quản lý nhớ 491 p1, p2, pn qo, q1, qn Trong đó: pi( (1 i ) n ) xác suất để nối trị tìm kiếm ki qJ (0 j n ) xác suất để đối trị tìm kiếm lớn kj nhng nhỏ kj + (Qui ớc:qo xác suất để đối trị thị trờng tìm kiếm nhỏ kj, qn xác suất để đối trị tìm kiếm lớn kn) Nh p1 + p2 + pn + qo + q1 + q2 + + qn = Để dẽ hình dung ta đa vào khái niệm nút nhị phân tìm kiếm Ví dụ: bình thờng nút có hai rống, nhng ta nói: nút có con, nút ngoài; hình vẽ ta thể nút hình vuông Chẳng hạn (a) hình (10.13) đợc thể nh sau: Bây giờ, với nút cũ ta gọi nút nh (hình 10.14) có ba nút bốn nút Đối với nút bốn nút Đối với nút số nút dựa theo thứ tự khoá nh quy ớc Còn với nút dựa theo nút (nh nêu với qj) Nh phép tìm kiếm thoả mãn dẫn đến nút trong, phép tìm kiếm không thoả dẫn tới nút Bây yêu cầu đặt là: xác định nhị phân tìm kiếm ứng với khoá, k 2, kn mà k1 < k2 kn n n i =1 j= Sao cho p = pi hi + (Với q jh'j hi số mức nút th i h 'j số mức nút thứ j trừ 1) Có giá trị tối thiểu Cây đáp ứng yêu cầu đợc gọi nhị phân tìm kiếm tối u: Thực xác định nhị phân tìm kiếm tối u không thiết phải đòi hỏi tổng p i, qj phải Trong thực tế ngời t thờng thay xác suất số lần xuất đối tri tìm kiếm mà ngời t dễ dàng xác định đợc qua thực nghiệm Ngoài tiện ngời ta thay h 'j hj số mức nút thứ thứ j Vậy ngời ta thờng tính P dới dạng: n n i =1 j= p = aihi + bjhj Với tần số xuất đối trị tìm kiếm X k j bj số lần xuất hiẹn đối trị tìm kiếm X lớn k j nhỏ kj + 1, riêng bo số lần X < k1 bn số lần X >kn 4n n lớn Do Cnn mà xấp xỉ coi nh n +1 n / việc chọn nhị phân tìm kiếm tối u cách từ độ dài đờng có trọng số nhỏ nhất, công việc khó thực n lớn Vậy giải cách nào? Nguyên tắc sau giúp ta vợt qua trở ngại này, là: Đối với nhị phân tìm kiếm tối u phải nhị phân tìm kiếm tối u Nh nghĩa Tl, n nhị phân tìm kiếm tối u ứng với k1, k2, kn có ki gốc, trái T l, i - ứng với khoá k1, k2, , ki-1 phải Ti + 1, n ứng với ki + 1, ,kn phải nhị phân tìm kiếm tối u rỗi Đối với có tính chất nh NhNgời ta chứng minh đợc số lợng nhị phân n nút, có dạng khác nhau, 490 Chơng - Quản lý nhớ Chơng - Quản lý nhớ 491 ng khó lại thể chỗ ta xác định đợc gốc nhị phân tìm kiếm tối u, không thử khả có thể; ứng với khả phải dựng đợc trái phải tối u Tuy nhiên tất điều đợc giải nh ta biết đợc tối u kể từ có nút, nút, đến (n - 1) nút ứng với khoá (theo thứ tự khoá nh qui ớc) Từ dẫn tới giải thuật cho phép dựng đợc nhị phân tìm kiếm tối u lớn dần lên nút (từ gồm nút) mà ta gọi kỹ thuật dựng nhị phân tìm kiếm tối u theo kiểu từ đáy lên (bottom up) Sau ta minh họa cách làm ví dụ cụ thể: Giả sử ta muốn dựng nhị phân tìm kiếm tối u ứng với khoá k1, k2, k3, k4 (k1 < k2 < k3 < k4) mà a1 = a2 = a3 = a4 = b0 = b1 = b2 = b3 = b4 = Trớc hết ta xét nhị phân tìm kiếm tối u gồm nút, ta có (hình 10.15) Bây xét nhị phân hai nút ứng với hai khoá kế tiếp, chẳng hạn ứng với k 1, k2 Ta thấy nh hình 10.16 Vì chúng tối u nên chúng có khả tối u, nhng muốn biết cụ thể phải so sánh độ dài đờng có trọng số chúng Theo (10.3) ta có: Pa = 1.1 + 2.6 + 2.3 + 3.8 + 3.4 = 55 Pb = 1.6 + 2.1 + 3.3 + 3.8 + 2.4 = 49 Vậy b) hình 10.16 nhị phân tìm kiếm tối u ứng với hai khoá k1, k2 Tơng tự, với khoá k2, k3 k3, k4 tối u là: Với ba nút ứng với ba khoá k 1, k2, k3 đáng nhẽ ta phải xét tới năm trờng hợp nh hình 10.13, nhng theo nguyên tắc ta cần ý đến có (ứng với nút đó) nhị phân tìm kiếm tối u (cây tối u nút, hai nút nh nêu) Do phải xét ba sau Ta có: P(a) = 1.1 + 2.6 + 3.4 + 2.3 + 3.8 + 4.4 + 4.2 = 79 P(c) = 1.6 + 2.1 + 2.4 + 3.3 + 3.8 + 3.4 + 3.2 = 67 P(e) = 1.4 + 2.6 + 3.1 + 4.3 + 4.8 + 3.4 + 2.2 = 79 Vậy nhị phân tìm kiếm tối u c) Tơng tự, ứng với khoá k2, k3, k4 ta có tối u là: 490 Chơng - Quản lý nhớ Chơng - Quản lý nhớ 491 Cuối khoá k 1, k2, k3, k4 đáng nhẽ ta phải xét 8! C8 = = 14 trờng hợp, nhng ta xét trờng hợp sau n +1 5! từ ta xác định đợc tối u Ngời ta chứng minh đợc với phơng pháp dựng nhị phân tìm kiếm tối u nh chi phí không gian nhớ tỉ lệ với n 2: O(n2) thời gian O(n3) D Knut [8 ] chứng minh đợc rằng: gọi Tij nhị phân tìm kiếm ứng với khoá k i < ki+1 < < kj gốc không vợt phạm vi khoá giới hạn bới khoá gốc T ij - Ti + 1j nghĩa gọi rij số khoá gốc nhị phân tìm kiếm tối u Tij rij - rij ri + 1j Từ cho phép ta xác định khoá ứng với gốc nhị phân tìm kiếm tối u thử số (j - i) khoá nữa, mà cần thử số (r i + 1j - rij - +1) Với cách chi phí thời gian giảm xuống O(n ) Nh ví dụ trên, xét nhị phân tìm kiếm tối u với ba khoá ta thấy số lần thử giảm rõ rệt Chẳng hạn với k1, k2, k3 ta thấy khoá gốc tối u cần xét khoá giới hạn khoá gốc tối u ứng với k1, k2 k2, k3 Nhng, hai trờng hợp này, khoá gốc k2, khoá gốc tối u ứng với k1, k2, k3 phải k2 tối u có dạng c) hình 10.18 Đối với trờng hợp k1, k2, k3, k4 suy ra: khoá gốc tối u k2 ta xác định đợc tối u hình 10.21 Tuy nhiên, so sánh với phơng pháp nêu phần trên, ta thấy chi phí tìm kiếm lớn Vì số tác giả (nh Bruno J; Coffman E.G; Walker W.A; Gotlief CC.v.v) tới nghiên cứu dạng nhị phân tìm kiếm tiệm tối u (nearly optimal binary search tree) đạt đợc kết đáng ý 10.7 tìm kiếm dựa vào giá trị khoá 10.7.1 Giới thiệu phơng pháp Đây phơng pháp tìm kiếm khác hẳn phơng pháp nêu Nó không dựa sở phép so sánh giá trị khoá ghi mà dựa vào thân giá trị khoá Bằng qui tắc biến đổi đó, từ giá trị khoá ta tính địa (địa tơng đối) Địa dùng để lu trữ ghi tơng ứng, đồng thời để tìm kiếm ghi Nh nghĩa ta thiết lập hàm địa (address function) h(k) thực phép ánh xạ tập giá trị k nên tập địa tơng đối, nghĩa số nguyên từ đến m-1 mà ta gọi bảng địa (address table), m đợc gọi độ dài kích thớc bảng Nh ta có: h(k) < m Giá trị h(k) đợc sử dụng lu trữ nh tìm kiếm ghi tơng ứng với k Có thể hình dung sơ phơng pháp qua ví dụ đơn giản sau đây: Xét ghi có khoá tơng ứng số nguyên gồm không chữ số thập phân, chẳng hạn 5402, 0367, 1246, 2983, Giả sử kích th ớc bảng đại m = 1000 nghĩa địa tính đợc phải nằm khoảng từ đến 999 Ta chọn qui tắc tính địa nh sau: Lấy ba chữ số cuối khoá làm địa Nh ứng với khoá nêu ta có kết Gía trị khoá địa Chơng - Quản lý nhớ 490 5402 0367 1246 2983 Chơng - Quản lý nhớ 491 402 367 246 983 Khi lu trữ, ghi ứng với khoá chẳng hạn 5402 đợc đa vào số byte nhớ có địa thực A o + 402 Đến kiếm địa A0 + 402 lại đợc xác định để sử dụng Để tiện trình bày, từ ta qui ớc A0 = nghĩa tạm coi địa tơng đối nh địa thực Rõ ràng với phơng pháp này, khoá có giá trị khác ứng với địa chỉ; ví dụ 5402, 7402, 0402 địa 402 Lúc ta nói: có tợng đụng độ (collision) Lẽ dĩ nhiên hàm h(k) đợc gọi tốt phân bố địa tính đợc bảng địa cho phép tợng đụng độ không xẩy Về mặt lý thuyết, ta cách để xây dựng đợc hàm địa hoàn hảo nh Nhng thực tế ngời ta xác định đợc số phơng pháp có hiệu lực cho phép tạo đợc địa gần ngẫu nhiên (near random) khiến cho tợng đụng độ có khả xuất nên phải tìm cách khắc phục