Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 23 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
23
Dung lượng
403,32 KB
Nội dung
Cấu trúc liệu giải thuật Vi en Zo ne C om Chương VII : Tìm kiếm nh Tìm kiếm – Phần I Nội dung Si z Tìm kiếm tìm kiếm nhị phân Tìm kiếm nhị phân Cây nhị phân tìm kiếm Đặc điểm nhị phân tìm kiếm Thao tác bổ sung nhị phân tìm kiếm Thao tác loại bỏ nhị phân tìm kiếm Cây nhị phân tìm kiếm cân (AVL) Khơi phục tính cân thực bổ sung loại bỏ Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Bài tốn Tìm kiếm – Tìm kiếm thuật tốn tìm phần tử có giá trị cho trước tập phần tử 78? Khóa tìm kiếm: Một phận phần tử tập mà giá trị sử dụng để so sánh tìm kiếm Vi en Zo ne – C 23 78 45 32 56 om 23 78 45 32 56 nh Tìm kiếm Si – Tìm kiếm z z Các phần tử tập đầu vào khơng xếp theo khóa tìm kiếm Mô tả – – – Duyệt dãy (danh sách, hàng đợi , v…v ) chứa phần tử tập So sánh với khóa cần tìm tới tìm thấy khóa duyệt qua hết mảng mà chưa tìm thấy Trả lại số phần tử dãy (nếu thấy) Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Tìm kiếm Function SEQUENTIAL(A, n, key) ≠ {tìm phần tử có khóa key mảng A gồm n phần tử Kết trả ra: -1 khơng tìm thấy phần tử có khóa key, số phần tử tìm thấy} om i:= 1; while (i n) then return -1 { khơng thấy}; nh Tìm kiếm Si – Độ phức tạp : z z z Trường hợp tốt nhất: O(1) Trường hợp tồi nhất: O(n) Trường hợp trung bình : O(n) Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Tìm kiếm nhị phân z Tìm kiếm nhị phân – Sử dụng cho việc tìm kiếm mảng xếp Mô tả z Chọn phần tử “ở giữa” dãy – A[k] để thực so sánh với giá trị cần tìm z Nếu key = A[k] tìm thấy , kết thúc z Nếu key < A[k] tìm nửa đầu mảng cho z Nếu key > A[k] tìm nửa sau mảng cho Vi en Zo ne C om – nh Tìm kiếm nhị phân Si Function BINARY-SEARCH(A,l, r, key) If (l> r) return -1; m = (l+r) /2 ; If (A[m] = key ) return m ; Else if (A[m] > key) return BINARY-SEARCH(A, l, m-1, key); Else return BINARY-SEARCH(A, m+1, r, key); Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Tìm kiếm nhị phân Function BINARY-SEARCH(A,n,key) l:=1 ; r := n ; { l, r biến số sử dụng để ghi nhận số phần tử đầu phần tử cuối mảng mà tìm kiếm đó} {Tìm số phần tử giữa} m:= (l+r) / 2; if key < A[m] then r:= m-1; if key > A[m] then l:= m+1 end; Vi en Zo { Khơng tìm thấy } return -1; ne else return m; C else om while l Ỉ Đi xuống tìm kiếm phải < > = Vi en Zo ne C – om – Si nh Tìm kiếm nhị phân tìm kiếm z Giải thuật đệ qui Algorithm BST-Recursive(T, key) {T trỏ trỏ tới gốc cây; key giá trị cần tìm, trả trỏ trỏ tới nút chứa giá trị cần tìm } If ( T = NULL) then return NULL; If ( key < INFO(T) ) return BST-Recursive(LPTR(T), key); Else if (key > INFO(T)) return BST-Recursive(RPTR(T), key); Else return T; Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Tìm kiếm nhị phân tìm kiếm Giải thuật khơng đệ qui Algorithm BST(T, key) q= T ; {Khởi tạo biến trỏ để duyệt cây} om while q < > NULL begin if (INFO(q) = key then return q; else begin else q = LPTR(q); end ne end .C if (INFO(q) < key) then q = RPTR(q); Vi en Zo Return NULL; nh Bổ sung nhị phân tìm kiếm Si – Cách thực thêm nút có giá trị x vào nhị phân tìm kiếm z z z Tìm nút có giá trị x Nếu tìm thấy, khơng cần thêm Nếu khơng tìm thấy – – Giả sử gọi w nút mà ta chạm đến trình tìm kiếm Tạo nút có giá trị x biến nút thành nút w (con trái hay phải phụ thuộc vào việc so sánh x với giá trị lưu w) Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Bổ sung nhị phân tìm kiếm Bổ sung nút có giá trị 6 > w Vi en Zo ne C om < nh Bổ sung nhị phân tìm kiếm Si Algorithm Insert_BST_Recursive(T, x) {Tìm bổ sung nút có giá trị x nhị phân tìm kiếm Trả sau bổ sung trả nút có chứa x } If (T = null) then Call New (p) ; {Xin nhớ cho nút mới} INFO(p) := x; LPTR(p): = RPTR(p) := NULL; T = p ; If ( key < INFO(T) ) then LPRT(T) := Insert_BST(LPTR(T), x) ; Else if ( key > INFO(T) ) then begin RPTR(T) := Insert_BST(RPTR(T), x) ; return T; Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Bổ sung nhị phân tìm kiếm Algorithm Insert_BST(T, x) {Bổ sung nút có giá trị x vào cây, trả trỏ trỏ tới nút mới, trả Vi en Zo ne C om trỏ trỏ tới nút trong có nút chứa khóa x } q= T ; {Khởi tạo biến trỏ để duyệt cây} while q < > NULL begin if (INFO(q) = key) then return q; // Tìm thấy, kết thúc giải thuật else begin if (INFO(q) < key) then begin p= q; q = RPTR(q); end; else begin p=q; q = LPTR(q);end; end end Call New(q); INFO(q) = x; LPTR(q) = RPTR(q) = NULL; if (T= null ) then T = q; else if x < INFO(p) then LPTR(p) = q; else RPTR(p) = q; Si nh Dựng nhị phân tìm kiếm – Ví dụ: Dựng nhị phân tìm kiếm sử dụng phép bổ sung cho với dãy số {8,3,14,6, 12, 28, 10,21,5} T 14 28 12 10 21 Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com 10 https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Xóa nút nhị phân tìm kiếm Các trường hợp : – – Vi en Zo ne C – Nút loại bỏ nút lá: Xóa Nút loại bỏ nút nhánh có (trái phải) : Thay nút cần xóa nút Nút loại bỏ nút nhánh có con: Thay nút cần xóa nút cực phải trái nút cực trái phải om z Si nh Xóa nút – Trường hợp nút cần xóa nút z z Xóa nút Gán liên kết từ cha trở thành NULL NULL T2 T1 T3 Nút cần xóa T4 T2 T3 T1 Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com T4 11 https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Xóa nút nhánh có Trường hợp nút cần xóa nút nhánh có – z Gắn nút cần xóa vào cha T3 T4 C T2 om Nút cần xóa T2 T1 T4 Vi en Zo ne T1 T3 nh Xóa nút nhánh có đầy đủ Si – Trường hợp nút cần xóa nút có z Bước 1: Xác định nút thay z Nút thay nút cực phải trái nút cực trái phải Nút cần xóa T3 T4 T5 T1 Nút thay T2 Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com 12 https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Xóa nút nhánh có đầy đủ – Trường hợp nút cần xóa nút có z Bước 2: Có nút thay y – – Gỡ y khỏi Gắn trái y vào cha y T1 T2 T4 T5 ne T3 C om Nút cần xóa Vi en Zo y nh Xóa nút nhánh có đầy đủ Si – Trường hợp nút cần xóa nút có z Bước 3: Có nút thay y – Gắn y vào vị trí nút cần xóa T3 T1 T4 T5 T2 Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com 13 https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Xóa nút nhị phân tìm kiếm Algorithm BSTDEL(key, nut_xoa, nut_cha) {Thực việc xóa nút trỏ trỏ nut_xoa , biết trỏ nut_cha trỏ tới nút cha nút xóa, biết giá trị key nút cần xóa} If (LPTR(nut_xoa) = null && RPTR(nut_xoa) = null) then begin om if ( key < INFO(nut_cha)) then LPTR(nut_cha): = null; else RPTR(nut_cha) := null; call dispose(nut_xoa) ; end; If (LPTR(nut_xoa) = null || RPTR(nut_xoa) = null) then begin C if LPTR(nut_xoa) = NULL then nut_thay := RPTR(P); else if RPTR(nut_xoa) = NULL then nut_thay := LPTR(P); ne if (key < INFO(nut_cha)) then LPTR(nut_cha) := nut_thay; else RPTR(nut_cha) := nut_thay; Vi en Zo call dispose(nut_xoa); end; nh Xóa nút nhị phân tìm kiếm Si If (LPTR(nut_xoa) != null && RPTR(nut_xoa) != null) then begin nut_thay := LPTR(nut_xoa); {sang trái} while RPTR(nut_thay) null begin T := nut_thay; nut_thay := RPTR(nut_thay); end;{Kết thúc vòng lặp nut_thay trỏ đến nút cực phải trái, T:nút cha nút thay} RPTR(nut_thay) := RPTR(nut_xoa); RPTR(T) := LPTR(nut_thay); LPTR(nut_thay) := LPTR(nut_xoa); if (key < INFO(nut_cha)) then LPTR(nut_cha) := nut_thay; else RPTR(nut_cha) := nut_thay; call dispose(nut_xoa); End Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com 14 https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Cây nhị phân tìm kiếm z Đánh – giá giải thuật : tìm kiếm loại bỏ Thời gian thực trung bình Ttb(n) = O(log2n) z Nhược Cây suy biến hình thành trình bổ sung, ảnh hưởng đến hiệu việc sử dụng nhị phân tìm kiếm Vi en Zo ne C om – điểm tìm kiếm nhị phân: Si nh Cây nhị phân cân đối AVL z Cây nhị phân cân đối AVL (AVL balanced binary search tree) – Một nhị phân tìm kiếm gọi cân đối AVL với nút cây, chiều cao tương ứng chênh nhiều đơn vị 33 33 29 19 29 64 30 23 19 70 40 65 80 Cây nhị phân tìm kiếm cân đối AVL 64 70 30 23 65 Cây nhị phân tìm kiếm khơng cân đối Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com 80 15 https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Cây nhị phân cân đối AVL Bổ sung AVL – Bổ sung theo nguyên tắc giống với nhị phân tìm kiếm Việc bổ sung làm vi phạm tính cân 27 18 12 44 20 35 18 52 22 12 44 20 19 27 Khôi phục cân 35 22 20 52 18 12 22 19 44 35 52 25 ne 19 27 Bổ sung 25 om – C z Vi en Zo 25 nh Cây nhị phân cân đối AVL Si – Khơi phục tính cân z z z Kiểm tra tính cân nút nằm đường từ nút gốc đến nút bổ sung Xác định nút vi phạm gần với nút Thực phép quay với nút vi phạm mà không cần thực phép quay khác tổ tiên nút – Tùy vào vị trí nút so với nút vi phạm có loại phép quay khác Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com 16 https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Cây nhị phân cân đối AVL Xác định phép quay cần sử dụng – – Bước 1: Xác định nút vi phạm gần Bước 2: Quan sát vị trí nút nút cháu nút vi phạm đường xác định vị trí bổ sung z Trường hợp 1: Quay đơn phải om z Nút vi phạm (nút bất thường) C Nút Vi en Zo ne Nút cháu Si nh Cây nhị phân cân đối AVL z Trường hợp 2: Quay đơn trái (single left rotation) z Trường hợp 3: Quay kép phải (double right rotation) : quay trái với trái quay phải với có nút vi phạm trái Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com 17 https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Cây nhị phân cân đối AVL Trường hợp 4: Quay kép trái (double left rotation) : quay phải với phải, quay trái với có nút vi phạm phải Vi en Zo ne C om z nh Cây nhị phân cân đối AVL Si – Trường hợp 1: Phép quay đơn phải Nút vi phạm Trước quay B A A B Sau quay đơn phải C h+1 C T1 h T2 h+1 h T1 T2 T3 h-1 h-1 or h-2 h-1 T4 T3 h-1 or h-2 T4 AVL trở lại trạng thái cân Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com 18 https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Cây nhị phân cân đối AVL – Trường hợp 3: Phép quay kép phải D A B C B om A D h-1 T3 T1 T4 h-1 or h-2 h T1 T′2 h C T"2 T3 h-1 T4 h-1 or h-2 ne T′2 T"2 C h h Sau quay kép phải Nút vi phạm Trước quay Vi en Zo AVL trở lại trạng thái cân Si nh Cây nhị phân cân đối AVL – Bổ sung AVL – Ví dụ: Bổ sung 30 vào s Nút vi phạm 14 10 Không vi phạm 19 17 Không vi phạm 24 30 Không vi phạm Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com 19 https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Cây nhị phân cân đối AVL – Để sửa đổi lại cây, quay có gốc 14: Quay từ phải sang trái với phải (nút 14 19) – Phép quay gọi phép quay đơn trái 19 14 24 C om 30 17 Vi en Zo ne 10 Si nh Cây nhị phân cân đối AVL – Bổ sung AVL – Ví dụ Nút vi phạm 14 10 19 24 17 Không vi phạm 18 Bổ sung 18 vào Không vi phạm Không vi phạm Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com 20 https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Cây nhị phân cân đối AVL Loại bỏ AVL dẫn đến tình trạng cân đối cây, tương tự phép bổ sung, ta thực phép quay để tái cân lại z Ví dụ: Loại bỏ nút khơng làm ảnh hưởng đến tình trạng cân 20 14 22 18 25 19 ne 17 C 15 om z Vi en Zo Loại bỏ Si nh Cây nhị phân cân đối AVL z Ví dụ: Loại bỏ nút nhánh khơng làm ảnh hưởng đến tính cân 20 15 14 22 18 17 25 19 Loại bỏ Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com 21 https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Cây nhị phân cân đối AVL z Ví dụ: Loại bỏ nút dẫn đến phải thực phép quay để tái cân 18 20 Loại bỏ 22 18 14 25 17 19 25 ne 19 20 Vi en Zo 17 15 C 15 14 om Nút vi phạm nh Cây nhị phân cân đối AVL Tái cân lại sau loại bỏ AVL Si z – – – – – Gọi z nút khơng cân đường từ vị trí nút bị loại lên đến gốc Gọi y nút z, y nút có chiều cao lớn Gọi x nút y, x nút có chiều cao lớn Ta thực phép quay nút z xét thêm y, x để tái cân lại Phép quay ảnh hưởng đến tính cân nút có chiều cao lớn z (các nút tổ tiên z đường đến gốc) cần phải kiểm tra tính cân nút chạm tới gốc Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com 22 https://fb.com/sinhvienzonevn Cấu trúc liệu giải thuật Cây nhị phân cân đối AVL z 50 54 78 17 x 50 48 88 78 88 54 Si nh Vi en Zo ne 48 44 y 62 om 17 C Nút cần xóa 62 44 Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone.com 23 https://fb.com/sinhvienzonevn ... nhị phân tìm kiếm Với tập khóa xác định nhiều nhị phân tìm kiếm Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone. com https://fb .com/ sinhvienzonevn Cấu trúc liệu giải thuật Cây nhị phân tìm kiếm 33... BST-Recursive(RPTR(T), key); Else return T; Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone. com https://fb .com/ sinhvienzonevn Cấu trúc liệu giải thuật Tìm kiếm nhị phân tìm kiếm Giải thuật không đệ qui Algorithm... dispose(nut_xoa); End Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN SinhVienZone. com 14 https://fb .com/ sinhvienzonevn Cấu trúc liệu giải thuật Cây nhị phân tìm kiếm z Đánh – giá giải thuật : tìm kiếm loại bỏ Thời