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
537,06 KB
Nội dung
BÀI TÌM KIẾM Giảng viên: ThS Thạc Bình Cường v2.0014101214 MỤC TIÊU • Mơ tả nội dung tốn tìm kiếm hướng giải tốn tìm kiếm; • Trình bày thực cài đặt thuật tốn tìm kiếm tìm kiếm tuần tự, tìm kiếm nhị phân cách xác thơng qua ngơn ngữ lập trình C; • Mơ tả nhị phân tìm kiếm Trình bày cài đặt thao tác nhị phân tìm kiếm cách xác; • Sử dụng giải thuật tìm kiếm thích hợp để giải tốn thực tế v2.0014101214 NỘI DUNG • Bài tốn tìm kiếm; • Tìm kiếm tuần tự; • Tìm kiếm nhị phân; • Cây nhị phân tìm kiếm v2.0014101214 BÀI TỐN TÌM KIẾM Ví dụ 6.1: Một Ngân hàng nắm giữ tất thông tin nhiều tài khoản khách hàng cần tìm kiếm để kiểm tra biến động Một hãng Bảo hiểm hay hệ thống trợ giúp bán vé xe, vé máy bay… Việc tìm kiếm thơng tin để đáp ứng việc đặt ghế yêu cầu tương tự thực cần thiết v2.0014101214 BÀI TOÁN TÌM KIẾM Một tốn tìm kiếm tổng qt phát biểu sau: • “Cho bảng gồm n mẩu tin R1, R2,…, Rn Với mẩu tin Ri tương ứng với khóa ki Hãy tìm mẩu tin có giá trị khóa X cho trước.” • Cơng việc tìm kiếm hồn thành có hai tình sau xảy ra: Tìm mẩu tin có khóa tương ứng X, lúc phép tìm kiếm thành cơng Khơng tìm mẩu tin có khóa tìm kiếm X, phép tìm kiếm thất bại v2.0014101214 BÀI TỐN TÌM KIẾM Giải thuật tìm kiếm thuật tốn lấy đầu vào toán trả kết lời giải cho tốn Các thao tác gồm: • Khởi tạo cấu trúc liệu (INITIALIZE); • Tìm kiếm hay nhiều mẩu tin có khố cho (SEARCH); • Chèn thêm mẩu tin (INSERT); • Nối lại từ điển để tạo thành từ điển lớn (JOIN); • Sắp xếp từ điển; xuất tất mẩu tin theo thứ tự xếp (SORT) v2.0014101214 TÌM KIẾM TUẦN TỰ Tư tưởng thuật toán (Sequential Search): • Bắt đầu từ mẩu tin đầu tiên, so sánh khóa tìm kiếm với khóa tương ứng mẩu tin danh sách, tìm thấy mẩu tin có khóa khóa tìm kiếm duyệt hết danh sách mà chưa thấy; • Thuật tốn tìm kiếm dễ thực thông tin lưu trữ dạng mảng Nội dung cách cài đặt thuật tốn: • Giả sử mẩu tin cần tìm kiếm lưu trữ danh sách R với n mẩu tin X khóa tìm kiếm; • Thuật tốn mơ tả sau: Bước 1: Gán i=0;//duyệt từ đầu mảng Bước 2: while((R[i]!=X)&&(i NewKey PrtTree^.left = NewNode; + Nếu (PrtTree->infor < NewKey) PrtTree->right = NewNode; • Bước 9: Kết thúc 24 v2.0014101214 4.1 THAO TÁC CHÈN MỘT NÚT (tiếp theo) Cài đặt thuật toán chèn nút vào nhị phân tìm kiếm: void BSTinseart (Tree BST, KeyType NewKey) { Tree Root, PrtTree; Root=BST; PrtTree=NULL; while((Root!=NULL)&&(Root->infor!=NewKey)) {PrtTree=Root; if (Root->infor>NewKey) Root=Root->left; else if (Root->inforright; } if(Root!=NULL) printf(“da co phan tu NewKey tren cay”); else {Root=(Tree)malloc(sizeof(Tree)); Root->infor=NewKey; Root->left=NULL; Root->right=NULL; if(PrtTree==NULL) BST=Root; else if(PrtTree->infor>NewKey) PrtTree->left=Root; else PrtTree->right=Root; } } v2.0014101214 25 4.1 THAO TÁC CHÈN MỘT NÚT (tiếp theo) Ví dụ 6.6: Chèn nút NewNode chứa liệu 55 vào nhị phân tìm kiếm sau: 26 v2.0014101214 4.1 THAO TÁC CHÈN MỘT NÚT (tiếp theo) Ta có kết sau: 27 v2.0014101214 4.2 THAO TÁC XỐ MỘT NÚT TRÊN CÂY NHỊ PHÂN TÌM KIẾM Việc xóa nút nhị phân tìm kiếm phải bảo đảm sau xóa nhị phân tìm kiếm Việc xóa nút nhị phân tìm kiếm xảy ba trường hợp sau: • Nút xóa nút lá; 28 v2.0014101214 4.2 THAO TÁC XOÁ MỘT NÚT TRÊN CÂY NHỊ PHÂN TÌM KIẾM Việc xóa nút nhị phân tìm kiếm phải bảo đảm sau xóa nhị phân tìm kiếm Việc xóa nút nhị phân tìm kiếm xảy ba trường hợp sau: • Nút xóa nút có nút gốc con; 29 v2.0014101214 4.2 THAO TÁC XOÁ MỘT NÚT TRÊN CÂY NHỊ PHÂN TÌM KIẾM Việc xóa nút nhị phân tìm kiếm phải bảo đảm sau xóa nhị phân tìm kiếm Việc xóa nút nhị phân tìm kiếm xảy ba trường hợp sau: • Nút xóa có đủ hai nút gốc 30 v2.0014101214 4.2 THAO TÁC XOÁ MỘT NÚT TRÊN CÂY NHỊ PHÂN TÌM KIẾM (tiếp theo) Cài đặt thao tác xóa nút cho nhị phân tìm kiếm: void BSTDelete(Tree BST, KeyType X) { Tree Root,PrtTree,Parent; Root=BST; Parent=NULL; while(Root!=NULL) { if(Root->infor==X) break; Parent=Root; if(Root->inforleft; else Root=Root->right; } if(Root==NULL) printf(“khong có phan tu tren cay”); 31 v2.0014101214 4.2 THAO TÁC XOÁ MỘT NÚT TRÊN CÂY NHỊ PHÂN TÌM KIẾM (tiếp theo) Cài đặt thao tác xóa nút cho nhị phân tìm kiếm: else {if((Root->left!=X)&&(Root->right!=X) { PrtTree=Root->right; Parent=Root; while(PrtTree->left!=NULL) { Parent=PrtTree; PrtTree=PrtTree->left; } Root->infor=PrtTree->infor; } PrtTree=Root->left; if (PrtTree==NULL) PrtTree=Root->right; if (Parent==NULL) Root=PrtTree; else if(Parent->left==Root) Parent->left=PrtTree; else Parent->right=PrtTree; } } v2.0014101214 32 4.2 THAO TÁC XOÁ MỘT NÚT TRÊN CÂY NHỊ PHÂN TÌM KIẾM (tiếp theo) • Trong trường hợp trung bình, thao tác xóa nhị phân tìm kiếm có độ phức tạp O(lgn); • Cịn trường hợp xấu nhị phân tìm kiếm bị suy biến thao tác có độ phức tạp O(n) với n số nút nhị phân tìm kiếm 33 v2.0014101214 4.3 TÌM KIẾM TRÊN CÂY NHỊ PHÂN TÌM KIẾM Việc tìm khóa nhị phân tìm kiếm thực thuật tốn tìm kiếm nhị phân • Chúng ta gốc; • Nếu khóa cần tìm khóa gốc khóa cây; • Nếu khóa cần tìm nhỏ khoa gốc, ta phải tìm trái; • Nếu khóa cần tìm lớn khóa gốc, ta phải tìm phải; • Nếu (trái phải) rỗng khóa cần tìm khơng có 34 v2.0014101214 4.3 TÌM KIẾM TRÊN CÂY NHỊ PHÂN TÌM KIẾM Thuật tốn thực thao tác tìm kiếm nhị phân tìm kiếm: • Bước 1: đặt trỏ Root=BST; • Bước 2: (Root=NULL) (Root->infor=X) Kết thúc thuật tốn; • Bước 3: ngược lại:nếu (Root->infor>X) Root=Root->left;//tìm X bên trái • Bước 4: ngược lại nếu(Root->inforright;//tìm X bên phải • Bước 5: lặp lại bước 2; Như thuật tốn kết thúc việc tìm kiếm trống nút gốc có giá trị khóa cần tìm 35 v2.0014101214 4.3 TÌM KIẾM TRÊN CÂY NHỊ PHÂN TÌM KIẾM (tiếp theo) Cài đặt thuật toán: Tree BSTSearch(Tree BST,KeyType X) { Tree Root; Root=BST; while((Root!=NULL)&&(Root->infor!=X)) { if(Root->infor>X) Root=Root->left; else if(Root->inforright; } return Root; } 36 v2.0014101214 4.3 TÌM KIẾM TRÊN CÂY NHỊ PHÂN TÌM KIẾM (tiếp theo) Ví dụ 6.10: Xét nhị phân tìm kiếm có dạng sau: Ta tìm nút có thành phần liệu 40 Bắt đầu từ nút gốc, 40 nhỏ giá trị 50 nút gốc nên cần tìm bên trái nút gốc Tiếp tục tìm kiếm cách so sánh 40 với gốc Vì 40 > 30 nên nút cần tìm nằm bên phải là: Ta tìm nút chứa giá trị cần tìm 37 v2.0014101214 TĨM LƯỢC CUỐI BÀI • Tìm kiếm công việc hay sử dụng nhiều ứng dụng Trên đây, ta trình bày phép tìm kiếm danh sách để tìm mẩu tin có khóa khóa tìm kiếm; • Tuy nhiên, nhiều trường hợp ta chuyển sang tìm mẩu tin mang khóa lớn hay nhỏ khóa tìm kiếm, tìm mẩu tin mang khóa nhỏ mà lớn khóa tìm kiếm v.v…; • Để cài đặt thuật tốn cho trường hợp cần có mềm dẻo định; • Ngồi khơng nên đánh giá giải thuật tìm kiếm tốt giải thuật tìm kiếm khác mà vào yêu cầu cụ thể để đưa giải thuật tìm kiếm cho phù hợp 38 v2.0014101214