slike bài giảng cấu trúc dữ liệu và giải thuật - đỗ bích diệp chương 7 tìm kiếm

23 426 0
slike bài giảng cấu trúc dữ liệu và giải thuật - đỗ bích diệp chương 7 tìm kiếm

Đ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

Cấu trúc dữ liệu và giải thuật Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 1 Chương VII : Tìm kiếm Tìm kiếm–PhầnI z Nội dung 1. Tìm kiếmtuầntự và tìm kiếmnhị phân 2. Tìm kiếm trên cây nhị phân 1. Cây nhị phân tìm kiếm 1. Đặc điểmcủa cây nhị phân tìm kiếm 2. Thao tác bổ sung trên cây nhị phân tìm kiếm 3. Thao tác loạibỏ trên cây nhị phân tìm kiếm 2. Cây nhị phân tìm kiếmcânbằng (AVL) 1. Khôi phục tính cân bằng khi thựchiệnbổ sung và loạibỏ Cấu trúc dữ liệu và giải thuật Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 2 Bài toán Tìm kiếm – Tìm kiếmlàthuật toán tìm 1 phầntử có giá trị cho trước trong mộttập các phầntử – Khóa tìm kiếm: Mộtbộ phậncủa các phầntử trong tậpmà giá trị củanóđượcsử dụng để so sánh và tìm kiếm 23 78 45 8 32 56 23 78 45 8 32 56 78? Tìm kiếmtuầntự – Tìm kiếmtuầntự z Các phầntử trong tập đầu vào không đượcsắpxếp theo khóa tìm kiếm z Mô tả – Duyệt dãy (danh sách, hàng đợi , v…v ) chứa các phần tử trong tập – So sánh vớikhóacần tìm tới khi tìm thấykhóahoặc duyệt qua hếtmảng mà chưa tìm thấy – Trả lạichỉ số phầntử trong dãy (nếuthấy) Cấu trúc dữ liệu và giải thuật Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 3 Tìm kiếmtuầntự Function SEQUENTIAL(A, n, key) {tìm phầntử có khóa key trong mảng A gồmn phầntử. Kếtquả trả ra: -1 nếu không tìm thấyphầntử có khóa key, chỉ số của phầntử nếu tìm thấy} 1. i:= 1; 2. while (i <= n ) and (A[i] <> key) do i:= i + 1; 3. if (i> n) then return -1 { không thấy}; 4. else return i{tìm thấytạivị trí i} ≠ Tìm kiếmtuầntự – Độ phứctạp: z Trường hợptốtnhất: O(1) z Trường hợptồinhất: O(n) z Trường hợp trung bình : O(n) Cấu trúc dữ liệu và giải thuật Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 4 Tìm kiếmnhị phân z Tìm kiếmnhị phân – Sử dụng cho việc tìm kiếmtrênmảng đã đượcsắpxếp – Mô tả z Chọnphầntử “ở giữa” dãy – A[k] để thựchiệnso sánh vớigiátrị cần tìm z Nếu key = A[k] thì tìm thấy, kết thúc z Nếu key < A[k] thì tìm trên nửa đầucủamảng đãcho z Nếu key > A[k] thì tìm trên nửasaucủamảng đãcho Tìm kiếmnhị phân Function BINARY-SEARCH(A,l, r, key) 1. If (l> r) return -1; 2. m = (l+r) /2 ; 3. If (A[m] = key ) return m ; 4. Else if (A[m] > key) return BINARY-SEARCH(A, l, m-1, key); 5. Else return BINARY-SEARCH(A, m+1, r, key); Cấu trúc dữ liệu và giải thuật Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 5 Tìm kiếmnhị phân Function BINARY-SEARCH(A,n,key) 1. l:=1 ; r := n ; { l, r lầnlượtlàbiếnchỉ số sử dụng để ghi nhậnchỉ số củaphầntử đầuvàphầntử cuốicủamảng mà chúng ta đang tìm kiếmtrênđó} 2. while l <= r do begin {Tìm chỉ số củaphầntử giữa} m:= (l+r) / 2; if key < A[m] then r:= m-1; else if key > A[m] then l:= m+1 else return m; end; 3. { 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ếmnhị phân ứng với 1 dãy gồmn khóaa 1 , a 2 , …, a n là một cây nhị phân thỏamãntínhchấtsau – Mọigiátrị thuộc cây con trái củamột nút đềunhỏ hơngiátrị tại nút đó – Mọigiátrị thuộc cây con phảicủamột nút đềulớnhơngiátrị tại nút đó – Mỗi cây con củamột nút cũng đềulàcâynhị phân tìm kiếm z Vớimộttập khóa có thể xác định được nhiều cây nhị phân tìm kiếm Cấu trúc dữ liệu và giải thuật Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 6 Cây nhị phân tìm kiếm 33 29 64 19 30 40 23 65 70 80 64 30 70 23 33 65 29 80 40 19 Cây nhị phân tìm kiếm – Các thao tác trên cây nhị phân tìm kiếm z Duyệt cây nhị phân tìm kiếm z Tìm kiếmnútcógiátrị x z Thêm mộtnútmớicógiátrị x z Xóa một nút có giá trị x Cấu trúc dữ liệu và giải thuật Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 7 Tìm kiếm trên cây nhị phân tìm kiếm – Cách thựchiện z Nếucâyrỗng: không tìm thấy z Nếu cây không rỗng: – So sánh giá trị cần tìm kiếm với các giá trị khóa tìm kiếm ở nút gốc z Nếu= Æ Tìm thấy z Nếu< Æ Đixuống tìm kiếm trong cây con trái z Nếu> Æ Đixuống tìm kiếm trong cây con phải 6 9 2 4 1 8 < > = Tìm kiếm trên cây nhị phân tìm kiếm z Giảithuật đệ qui Algorithm BST-Recursive(T, key) {T là con trỏ trỏ tớigốccủa cây; key là giá trị cần tìm, trả ra con trỏ trỏ tớinút chứagiátrị cầntìm} 1. If ( T = NULL) then return NULL; 2. If ( key < INFO(T) ) return BST-Recursive(LPTR(T), key); 3. Else if (key > INFO(T)) return BST-Recursive(RPTR(T), key); 4. Else return T; Cấu trúc dữ liệu và giải thuật Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 8 Tìm kiếm trên cây nhị phân tìm kiếm Algorithm BST(T, key) 1. q= T ; {Khởitạobiếncon trỏđểduyệtcây} 2. while q < > NULL do begin if (INFO(q) = key then return q; else begin if (INFO(q) < key) then q = RPTR(q); else q = LPTR(q); end. end. 3. Return NULL; Giảithuật không đệ qui Bổ sung trên cây nhị phân tìm kiếm – Cách thựchiện thêm một nút có giá trị x vào cây nhị phân tìm kiếm z Tìm nút có giá trị x z Nếutìmthấy, không cầnthêm z Nếu không tìm thấy – Giả sử gọi w là nút lá mà ta chạm đến trong quá trình tìm kiếm – Tạomột nút mớicógiátrị x và biến nút này thành nút con của w (con trái hay con phảiphụ thuộcvàoviệc so sánh x vớigiátrị lưu trong w) Cấu trúc dữ liệu và giải thuật Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 9 Bổ sung trên cây nhị phân tìm kiếm 6 92 41 8 < > Bổ sung nút có giá trị 5 6 92 41 8 5 w Bổ sung trên cây nhị phân tìm kiếm Algorithm Insert_BST_Recursive(T, x) {Tìm hoặcbổ sung nút có giá trị x trên cây nhị phân tìm kiếm. Trả ra cây sau khi bổ sung hoặctrả ra nút có chứax } 1. If (T = null) then 1. Call New (p) ; {Xin bộ nhớ cho nút mới} 2. INFO(p) := x; LPTR(p): = RPTR(p) := NULL; 3. T = p ; 2. If ( key < INFO(T) ) then 1. LPRT(T) := Insert_BST(LPTR(T), x) ; 3. Else if ( key > INFO(T) ) then begin 1. RPTR(T) := Insert_BST(RPTR(T), x) ; 4. return T; Cấu trúc dữ liệu và giải thuật Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 10 Bổ sung trên cây nhị phân tìm kiếm Algorithm Insert_BST(T, x) {Bổ sung nút mới có giá trị x vào cây, trả ra con trỏ trỏ tới nút mới, hoặctrả ra con trỏ trỏ tớimột nút trong cây nếu trong cây đã có nút chứa khóa x } 1. q= T ; {Khởitạobiến con trỏđểduyệt cây} 2. while q < > NULL do begin if (INFO(q) = key) then return q; // Tìm thấy, kết thúc giảithuậ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. 3. 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 cây nhị phân tìm kiếm – Ví dụ: Dựng cây nhị phân tìm kiếmsử dụng phép bổ sung cho ở trên vớidãysố {8,3,14,6, 12, 28, 10,21,5} 8 T 3 14 6 12 28 10 215 [...]... call dispose(nut_xoa); End Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 14 Cấu trúc dữ liệu và giải thuật Cây nhị phân tìm kiếm Đánh giá giải thuật : tìm kiếm và loại bỏ – Thời gian thực hiện trung bình Ttb(n) = O(log2n) Nhược điểm của cây tìm kiếm nhị phân: – Cây suy biến có thể được hình thành trong quá trình bổ sung, ảnh hưởng đến hiệu năng của việc sử dụng cây nhị phân trong tìm kiếm Cây nhị phân cân đối AVL... 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ằng Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 18 Cấu trúc dữ liệu và 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 khi quay kép phải Nút vi phạm Trước khi 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 bằng Cây... tiên của z trên đường đi đến gốc) vì vậy cần phải kiểm tra tính cân bằng của các nút đó cho đến khi chạm tới gốc Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 22 Cấu trúc dữ liệu và giải thuật Cây nhị phân cân đối AVL z Nút cần xóa 62 44 17 50 48 54 Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 44 y 62 78 88 x 17 78 50 48 88 54 23 ... binary search tree) – Một cây nhị phân tìm kiếm được gọi là cây cân đối AVL nếu với mọi nút trên cây, chiều cao của 2 cây con tương ứng chỉ chênh nhau nhiều nhất là 1 đơ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 Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 64 70 30 23 65 80 Cây nhị phân tìm kiếm không cân đối 15 Cấu trúc dữ liệu và giải thuật Cây nhị phân cân đối AVL Bổ sung... T2 Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 12 Cấu trúc dữ liệu và giải thuật Xóa nút nhánh có đầy đủ 2 con – Trường hợp nút cần xóa là nút có 2 con Bước 2: Có nút thay thế là y – – Gỡ y ra khỏi cây Gắn con trái của y vào cha của y Nút cần xóa T3 T1 T4 T5 T2 y Xóa nút nhánh có đầy đủ 2 con – Trường hợp nút cần xóa là nút có 2 con Bước 3: Có nút thay thế là y – Gắn y vào vị trí của nút cần xóa T3 T1 Đỗ Bích Diệp. .. cây AVL – Ví dụ: Bổ sung 30 vào cây s 8 3 1 6 4 Nút vi phạm 14 10 Không vi phạm 19 17 Không vi phạm 24 30 Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN Không vi phạm 19 Cấu trúc dữ liệu và giải thuật Cây nhị phân cân đối AVL – Để sửa đổi lại cây, quay cây có gốc tại 14: Quay từ phải sang trái với cây con phải (nút 14 và 19) – Phép quay này gọi là phép quay đơn trái 8 3 19 1 6 4 14 24 30 17 10 Cây nhị phân cân đối... 20 15 14 22 18 25 17 19 Loại bỏ Cây nhị phân cân đối AVL Ví dụ: Loại bỏ một nút nhánh không làm ảnh hưởng đến tính cân bằng của cây 20 15 14 22 18 17 25 19 Loại bỏ Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 21 Cấu trúc dữ liệu và giải thuật Cây nhị phân cân đối AVL Ví dụ: Loại bỏ một nút dẫn đến phải thực hiện phép quay để tái cân bằng cây Nút vi phạm 18 20 14 18 17 Loại bỏ 22 15 20 15 25 14 17 19 25 19 Cây nhị... phạm và con trái của nó Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 17 Cấu trúc dữ liệu và 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 cây con phải, rồi quay trái với cây có nút vi phạm và con phải của nó 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 khi quay B A A B Sau khi quay đơn phải C h+1 C T1 h T2 h+1 h T1 T2 T3 h-1... không cần thực hiện phép quay nào khác tại tổ tiên của nút đó – Tùy vào vị trí nút mới so với nút vi phạm có 4 loại phép quay khác nhau Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 16 Cấu trúc dữ liệu và giải thuật Cây nhị phân cân đối AVL Xác định các phép quay cần sử dụng – – Bước 1: Xác định nút vi phạm gần nhất Bước 2: Quan sát vị trí của nút con và nút cháu của nút vi phạm trên đường đi xác định vị trí bổ sung... phép quay đơn trái 8 3 19 1 6 4 14 24 30 17 10 Cây nhị phân cân đối AVL – Bổ sung trên cây AVL – Ví dụ 8 3 1 Nút vi phạm 14 6 4 10 19 24 17 Không vi phạm 18 Bổ sung 18 vào cây Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN Không vi phạm Không vi phạm 20 Cấu trúc dữ liệu và giải thuật Cây nhị phân cân đối AVL Loại bỏ trên cây AVL cũng có thể dẫn đến tình trạng mất cân đối của cây, tương tự như trong phép bổ sung, . Cấu trúc dữ liệu và giải thuật Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 1 Chương VII : Tìm kiếm Tìm kiếm PhầnI z Nội dung 1. Tìm kiếmtuầntự và tìm kiếmnhị phân 2. Tìm kiếm trên cây nhị. sung và loạibỏ Cấu trúc dữ liệu và giải thuật Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 2 Bài toán Tìm kiếm – Tìm kiếml thuật toán tìm 1 phầntử có giá trị cho trước trong mộttập các phầntử – Khóa tìm kiếm: . phân tìm kiếm z Vớimộttập khóa có thể xác định được nhiều cây nhị phân tìm kiếm Cấu trúc dữ liệu và giải thuật Đỗ Bích Diệp - Khoa CNTT-ĐHBK HN 6 Cây nhị phân tìm kiếm 33 29 64 19 30 40 23 65 70 80 64 30 70 23

Ngày đăng: 24/10/2014, 15:02

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

Tài liệu liên quan