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
415,65 KB
Nội dung
Cấu trúc liệu giải thuật Chương VII : Tìm kiếm Tìm kiếm – Phần I z Nội dung 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 CuuDuongThanCong.com https://fb.com/tailieudientucntt 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ử 23 78 45 32 56 78? 23 78 45 32 56 – 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 Tìm kiếm – 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 CuuDuongThanCong.com https://fb.com/tailieudientucntt 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} i:= 1; while (i n) then return -1 { khơng thấy}; else return i{tìm thấy vị trí i} Tìm kiếm – Độ 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 CuuDuongThanCong.com https://fb.com/tailieudientucntt 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 Tìm kiếm nhị phân 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 CuuDuongThanCong.com https://fb.com/tailieudientucntt 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 đó} while l A[m] then l:= m+1 else return m; end; { Khơng tìm thấy } return -1; Cây nhị phân tìm kiếm Binary Search Tree (BST) z Cây tìm kiếm nhị phân ứng với dãy gồm n khóa a1, a2, …, an nhị phân thỏa mãn tính chất sau – – – z Mọi giá trị thuộc trái nút nhỏ giá trị nút Mọi giá trị thuộc phải nút lớn giá trị nút Mỗi nút 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 CuuDuongThanCong.com https://fb.com/tailieudientucntt Cấu trúc liệu giải thuật Cây nhị phân tìm kiếm 33 64 29 64 19 30 70 40 23 30 65 23 80 19 70 33 29 65 80 40 Cây nhị phân tìm kiếm – Các thao tác nhị phân tìm kiếm z z z z Duyệt nhị phân tìm kiếm Tìm kiếm nút có giá trị x Thêm nút có giá trị x Xóa nút có giá trị x Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN CuuDuongThanCong.com https://fb.com/tailieudientucntt Cấu trúc liệu giải thuật Tìm kiếm nhị phân tìm kiếm – Cách thực z z Nếu rỗng: khơng tìm thấy Nếu khơng rỗng: – So sánh giá trị cần tìm kiếm với giá trị khóa tìm kiếm nút gốc z Nếu = Ỉ Tìm thấy z Nếu < Ỉ Đi xuống tìm kiếm trái z Nếu > Ỉ Đi xuống tìm kiếm phải < > = 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 CuuDuongThanCong.com https://fb.com/tailieudientucntt 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} while q < > NULL begin if (INFO(q) = key then return q; else begin if (INFO(q) < key) then q = RPTR(q); else q = LPTR(q); end end Return NULL; Bổ sung nhị phân tìm kiếm – 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 CuuDuongThanCong.com https://fb.com/tailieudientucntt 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ị < > w Bổ sung nhị phân tìm kiếm 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 CuuDuongThanCong.com https://fb.com/tailieudientucntt 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ả 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; 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 CuuDuongThanCong.com 10 https://fb.com/tailieudientucntt Cấu trúc liệu giải thuật Xóa nút nhị phân tìm kiếm z Các trường hợp : – – – 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 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 T4 T1 Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN CuuDuongThanCong.com 11 https://fb.com/tailieudientucntt 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 Nút cần xóa T2 T3 T4 T2 T1 T3 T4 T1 Xóa nút nhánh có đầy đủ – 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 CuuDuongThanCong.com 12 https://fb.com/tailieudientucntt 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 Nút cần xóa T3 T1 T4 T5 T2 y Xóa nút nhánh có đầy đủ – 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 CuuDuongThanCong.com 13 https://fb.com/tailieudientucntt 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 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 if LPTR(nut_xoa) = NULL then nut_thay := RPTR(P); else if RPTR(nut_xoa) = NULL then nut_thay := LPTR(P); if (key < INFO(nut_cha)) then LPTR(nut_cha) := nut_thay; else RPTR(nut_cha) := nut_thay; call dispose(nut_xoa); end; Xóa nút nhị phân tìm kiếm 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 CuuDuongThanCong.com 14 https://fb.com/tailieudientucntt 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 – điểm tìm kiếm nhị phân: Cây suy biến hình thành q trình bổ sung, ảnh hưởng đến hiệu việc sử dụng nhị phân tìm kiếm 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 80 Cây nhị phân tìm kiếm khơng cân đối Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN CuuDuongThanCong.com 15 https://fb.com/tailieudientucntt Cấu trúc liệu giải thuật Cây nhị phân cân đối AVL z 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 19 27 Bổ sung 25 35 18 52 22 12 44 20 19 27 Khôi phục cân 35 20 52 18 22 12 44 22 19 35 52 25 25 Cây nhị phân cân đối AVL – 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 CuuDuongThanCong.com 16 https://fb.com/tailieudientucntt Cấu trúc liệu giải thuật Cây nhị phân cân đối AVL z 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 Nút vi phạm (nút bất thường) Nút Nút cháu 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 CuuDuongThanCong.com 17 https://fb.com/tailieudientucntt Cấu trúc liệu giải thuật Cây nhị phân cân đối AVL z 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 Cây nhị phân cân đối AVL – 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 CuuDuongThanCong.com 18 https://fb.com/tailieudientucntt 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 Sau quay kép phải Nút vi phạm Trước quay D A B C B A D C h h-1 T3 T1 T4 h-1 or h-2 h T1 T′2 h T′2 h T"2 T"2 T3 h-1 T4 h-1 or h-2 AVL trở lại trạng thái cân 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 CuuDuongThanCong.com 19 https://fb.com/tailieudientucntt 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 30 17 10 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 CuuDuongThanCong.com 20 https://fb.com/tailieudientucntt .. .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ử 23 78 45 32 56 78 ? 23 78 45 32 56 – Khóa tìm kiếm: Một phận phần... giá trị cần tìm kiếm với giá trị khóa tìm kiếm nút gốc z Nếu = Ỉ Tìm thấy z Nếu < Ỉ Đi xuống tìm kiếm trái z Nếu > Ỉ Đi xuống tìm kiếm phải < > = Tìm kiếm nhị phân tìm kiếm z Giải thuật đệ qui... https://fb.com/tailieudientucntt 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