Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 38 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
38
Dung lượng
688 KB
Nội dung
Search 1 Bài 13. Tìm kiếm- Search Bài toán Input: Cho một dãy S các phần tử, mỗi phần tử là một bộ gồm khóa-giatrị (key-value). Một khóa k bất kỳ. Output: Trong S có phần tử có khóa k hay không? Search 2 Các phương pháp tìmkiếmTìmkiếm tuần tự (sequence search) Tìmkiếm nhị phân (Binary search) Bảng băm (hash table) Search 3 1. Tìmkiếm tuần tự Tập S các phần tử được lưu bằng mảng hoặc danh sách liên kết. Thuật toán tìm kiếm: • Xuất phát từ phần tử đầu của dãy, thực hiện so sánh khóa của nó với k. Nếu trùng nhau thì dừng lại, nếu không trùng thì lặp lại với phần tử tiếp theo. • Quá trình dừng lại khi tìm thấy hoặc không còn phần tử nào nữa. Khi đó thông báo không tìm thấy. Search 4 Ví dụ 1 Cho dãy S: Tìm xem trong dãy có phần tử k=33 Quá trình tìmkiếm 45 3 34 13 7 43 9 110 45 3 34 13 7 43 9 110 Bước 1 Bước 8Bước 7 Bước 2 Bước 3 Bước 4 Bước 5 Bước 6 Bước 9 • Không tìm thấy Search 5 Ví dụ 2 Cho dãy S: Tìm xem trong dãy có phần tử k=13 Quá trình tìmkiếm 45 3 34 13 7 43 9 110 45 3 34 13 7 43 9 110 Bước 1 Bước 2 Bước 3 Bước 4 Bước 5 • Tìm thấy, tại vị trí 5 Search 6 Thuật toán Input: Cho một dãy S các phần tử, mỗi phần tử là một bộ key và value. Một khóa k bất kỳ. Output: Trong S có phần tử có khóa k hay không? found = 0; i =1; while ((chưa duyệt hết S ) && (found= =0) ){ if (S[i].key == k) found =1; i = i+1; } return found; Search 7 Thời gian chạy Trong trường hợp xấu nhất thuật toán phải duyệt qua tất cả các phần tử của S. Vậy thời gian chạy là O(n) Search 8 2. Tìmkiếm nhị phân Tập S được tổ chức lưu trữ dựa trên mảng Tập S được tổ chức lưu trữ dạng cây nhị phân Search 9 2.1Tìm kiếm nhị phân trên mảng Các phần tử của S được lưu trữ trong mảng và được sắp xếp theo thứ tự tăng dần (giảm dần) của giá trị khóa (key). Thuật toán tìmkiếm nhị phân được thiết kế dựa trên chiến lược chia và trị Thuật toán: So sánh khóa k với khóa của phần tử ở giữa dãy. • Nếu trùng thì thông báo tìm thấy và dừng • Nếu k> thì gọi đệ qui tìm trên nửa cuối dãy • Nếu k< thì gọi đệ qui tìm trên nửa đẫu dãy • Quá trình tìm nếu phải tìm trong dãy rỗng thì dưng lại và thông báo không tìm thấy Search 10 Ví dụ 1 1 3 4 5 7 8 9 11 14 16 18 190 • Cho dãy dưới đây. Tìm phần tử k=6 Bước1: 6< 1 3 4 5 70 Bước 2: 6> 4 5 7 Bước 3: 6> 7 Bước 4: 6< Bước 5: 6 Rỗng Không tìm thấy [...]... if(v->hasLeft() && (!v->hasRight()){ p=v->getParent(); if(p->Left()==v) p->setLeft(v->Left()); else p->setRight(v->Left()); } if((!v->hasLeft()) && (v->hasRight()){ p=v->getParent(); if(p->Left()==v) p->setLeft(v->Right()); else p->setRight(v->Right()); } delete v; } Search 34 Hàm xóa nút bất kỳ trên cây void Remove(Keys k) { Node *v = TreeSearch(root, k); if(v==NULL) return; if((v->hasLeft() && !v->hasRight())... Node(); q->setKey(k); q->setEmlem(elem); q->setLeft(NULL); q->setRight(NULL); q->setParent(NULL); if(root==NULL){root = q;} else{ p = root; while(p != NULL){ if(k< p->getKey()) if(p->Left()==NULL){ q->setParent(p); p->setLeft(q); p = NULL; }else p = p->Left(); else if(k> p->getKey()) // nam ben cay con ben phai if(p->Right() == NULL){ q->setParent(p); p->setRight(q); p = NULL; } else p = p->Right; else {... chạy Sau mỗi lần tìm kiếm, thì dãy cần tìm lại được chia đôi và ta chỉ phải tìm trên một nửa Trong trường hợp xấu nhất là không tìm thấy phần tử có khóa k Và như vậy ta phải thực hiện chia đôi liên tiếp đến khi được dãy rỗng Số lần thực hiện chia đôi là: log2n Vậy thời gian chạy là O(log2n) Search 13 2.2 Tìmkiếm trên cây tìmkiếm nhị phân Định nghĩa: cây tìmkiếm nhị phân là cây nhị phân thỏa mãn:... các nút của cây con bên phải Các nút con trái và phải cũng là cây tìmkiếm nhị phân Search 6 < < 2 10 0 -1 8 4 1 3 5 7 9 Ví dụ: Cây tìmkiếm nhị phân 14 Cây tìmkiếm nhị phân (Binary search tree) < 2 6 9 > 4 = 1 Search 8 15 find(4) < 2 1 6 > 9 4 = Search 8 12 16 Cấu trúc Node biểu diễn cây Phương thức nhị phân Node *Parent() Thuộc tính Node *Left() Node *Right() Keys key Object elem void... gốc < k thì gọi đệ qui tìm trên cây con phải Nếu giá trị của nút gốc > k thì gọi đệ qui tìm trên cây con trái Quá trình tìm dừng lại khi tìm thấy hoặc phải tìm trên cây rỗng, trả lại địa chỉ của nút mà thuật toán dừng lại Search 19 Thuật toán giả mã Node* TreeSearch(Keys k, Node* v) if(v==NULL) return v; else if (k < v->getKey()) return TreeSearch(k, v->Left()); else if (k == v->getKey()) return v... Cấu trúc của cây tìmkiếm nhị phântính Thuộc Các phương thức truy Node * root cập: Phương thức Node *root() int size() int isEmpty() int isInternal(Node*) int isExternal(Node*) int isRoot(Node*) void preOrder(Node*) void inOrder(Node*) void postOrder(Node*) Node * TreeSearch(Keys, Node*) Node * InsertTree(Keys, Object ) void Remove(Keys) Search 18 Thuật toán tìmkiếm Tìm. .. đây Tìm phần tử k=5 0 1 3 4 5 7 8 9 11 14 16 18 19 Bước1: 5< 0 1 3 4 5 7 5 7 Bước 2: 5> 4 Tìm thấy Bước 3: 5= Search 11 Thuật toán tìmkiếm nhị phân trên mảng Algorithm BinarySearch(S, k, n); Found = 0; i = 1; j = n; while(i 4 8 > 6 2 1 9 4 8 5 Search 24 void TreeInsert(Keys k, Object elem) q = new Node(); q->setKey(k);... kỳ trên cây void Remove(Keys k) { Node *v = TreeSearch(root, k); if(v==NULL) return; if((v->hasLeft() && !v->hasRight()) || ((v->hasRight() && !v>hasLeft())) Remove(v); else{ Node *first; int kt=0; InOrder(v->Right(), first, kt); v->setKey(first->getKeys()); v->setElem(first->getElem()); Remove(first); } } Search 35 Ví dụ: Mô tả từng bước xóa bỏ nút có key=58? 58 31 90 62 25 12 75 64 63 Search 36 ... return TreeSearch(k, v->Left()); else if (k == v->getKey()) return v else // k > key(v) return TreeSearch(k, v->Right()); Search 20 Ví dụ < 2 1 6 9 > 4 = 8 Tìm giá trị 4 trên cây: Gọi T.TreeSearch(4, T.root()) Gọi T.TreeSearch(4, T.root( )-> Left())) Gọi T.TreeSearch(4, T.root( )-> Left( )-> Right()) Search 21 Phân tích Thuật toán TreeSearch Là thuật toán đệ qui, Mỗi lần gọi đệ qui nó thực . hay không? Search 2 Các phương pháp tìm kiếm Tìm kiếm tuần tự (sequence search) Tìm kiếm nhị phân (Binary search) Bảng băm (hash table) Search 3 1. Tìm kiếm tuần tự Tập S các phần tử được. toán tìm kiếm nhị phân trên mảng Search 13 Thời gian chạy Sau mỗi lần tìm kiếm, thì dãy cần tìm lại được chia đôi và ta chỉ phải tìm trên một nửa Trong trường hợp xấu nhất là không tìm thấy. phải. Các nút con trái và phải cũng là cây tìm kiếm nhị phân 6 102 40 8 < < -1 1 3 9 7 5 Ví dụ: Cây tìm kiếm nhị phân Search 15 Cây tìm kiếm nhị phân (Binary search tree) 6 92 41 8 < > = Search