Bài giảng Cấu trúc dữ liệu - Chương 4: Tìm kiếm

40 25 0
Bài giảng Cấu trúc dữ liệu - Chương 4: 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

Chương 4: Tìm kiếm trong Bài giảng Cấu trúc dữ liệu trình bày những nội dung chính về các phương pháp tìm kiếm trong danh sách, tìm kiếm tuyến tính, tìm kiếm nhị phân, tìm kiếm nội suy và cây nhị phân tìm kiếm.

CHƯƠNG 4- TÌM KIẾM CHƯƠNG TÌM KIẾM 4.1 Các phương pháp tìm kiếm danh sách 4.1.1 Tìm kiếm tuyến tính 4.1.2 Tìm kiếm nhị phân 4.1.1 Tìm kiếm nội suy 4.2 Cây nhị phân tìm kiếm 4.2.1 Định nghĩa 4.2.2 Các phép toán 4.1 Các phương pháp tìm kiếm danh sách Mô hình chung của bài toán tìm kiếm: Có một tập n đối tượng Mỗi đối tượng có nhiều thuộc tính, được thể hiện bằng một kiểu bản ghi gồm nhiều trường Trong đó có trường mà giá trị của nó đặc trưng cho đối tượng, cho phép xác định hoàn toàn đối tượng, thường gọi là khóa Bài toán tìm kiếm: Có một tập các đối tượng và cho trước một đối tượng x Cần tìm xem x có mặt tập hợp đã cho hay không? 4.1 Các phương pháp tìm kiếm danh sách Mô hình toán học của bài toán tìm kiếm: Có tập hợp n giá trị khóa k1, k2, kn Cho giá trị khóa x Tìm xem x có tồn tại ki=x? Công việc tìm kiếm sẽ hoàn thành khi: – Tìm được bản ghi có giá trị khóa =x, lúc đó phép tìm kiếm được thành công successful – Không tìm thấy bản ghi nào có khóa bằng x, gọi là tìm kiếm không thành công unsuccessful Lúc này có thể xuất hiện yêu cầu bổ sung giá trị x vào tập hợp, gọi là tìm kiếm có bổ sung 4.1.1 Tìm kiếm tuần tự (sequential searching)  Là phương pháp tìm kiếm đơn giản và cổ điển Ý tưởng: Bắt đầu từ bản ghi thứ nhất, lần lượt so sánh khóa tìm kiếm với khóa tương ứng của bản ghi bảng, cho tới tìm được bản ghi mong muốn hoặc đã hết bảng mà chưa tìm thấy 4.1.1 Tìm kiếm tuần tự (sequential searching)  Giải thuật 1: SEQUEN-SEARCH(k,n,x) SEQUEN-SEARCH(k,n,x) //Khởi //Khởi đầu đầu i=1; k[i+1]=x k[i+1]=x i=1; ////Tìm Tìm khóa khóa trong dãy dãy while (k[i] (k[i] !=x) !=x) do i++; i++; while ////Tìm Tìm thấy thấy hay hay không không (i==n+1) return return 00 //không //không tìm tìm thấy thấy IfIf (i==n+1) else return return i;i; else 4.1.1 Tìm kiếm tuần tự (sequential searching)  Giải thuật (giải thuật đệ quy-tìm danh sách liên kết): Node*timdequy(struct *timdequy(structnode node*first, *first,element_type element_typee) e) Node {{ (first== ==NULL) NULL) ifif(first returnNULL; NULL; return else else (first->element== ==e) e) return returnfirst; first; ifif(first->element else else returntimdequy(first->next, timdequy(first->next,e); e); return }} 4.1.1 Tìm kiếm tuần tự (sequential searching)  Đánh giá giải thuật: Trường hợp tốt nhất: Tmin = 1; Trường hợp xấu nhất: Tmax = O(n); Trung bình Ttb= O(n) 4.1.2 Tìm kiếm nhị phân (Binary Serching)  Là phương pháp tìm kiếm thông dụng  Ý tưởng: – – – – Dãy khóa đã được sắp xếp theo thứ tự (tăng dần hoặc giảm dần) Giả sử dãy khóa xét là kl và kr thì khóa ở giữa dãy sẽ là ki với i = (l+r)/2 Tìm kiếm sẽ kết thúc nếu x=ki Ngược lại, nếu xki, phép tìm kiếm sẽ được thực hiện tiếp với ki+1 với kr Quá trình tìm kiếm sẽ dừng tìm thấy khóa hoặc dãy xét trở nên rỗng 4.1.2 Tìm kiếm nhị phân (Binary Serching)  Giải thuật 1: BINARY-SEARCH(k,n,x) BINARY-SEARCH(k,n,x) b1 l=1; l=1; r=n;//khởi r=n;//khởiđầu đầu b1 b2 while while (l V.element lặp lại việc tìm để loại bỏ bên phải, - X = V.element, tiến hành gỡ bỏ nút V 29 4.2.2.3 Phép xóa một nút Giải thuật chi tiết: - Gỡ bỏ nút V: - Nếu V.right = Null, nối trái của V vào nút cha - Nếu V.left = Null, nối phải của V vào nút cha - V có đủ thì dò xuống nút cực phải của trái và sửa để đảm bảo điều kiện của nhị phân tìm kiếm 30 4.2.2.3 Phép xóa một nút Ví dụ t/h đủ cả con: A Nút E là nút cực phải của trái, xóa nút V bằng cách: V B A C -Thay nội dung V = E -Sửa F thành của D D E F -Hủy nút E E B C D F 31 4.2.2.3 Phép xóa một nút Hàm xóa phần tử intxoacuctrai xoacuctrai(tree (tree*root *root)) int intk; k; {{int ((*root)->left== ==NULL) NULL) ifif((*root)->left {{ k=(*root)->element; k=(*root)->element; (*root)==(*root)->right; (*root)->right; (*root) returnk; k; return }} elsereturn returnxoacuctrai(&(*root)->left); xoacuctrai(&(*root)->left); else }} 32 4.2.2.3 Phép xóa một nút Thủ tục xóa voidxoa(int xoa(intx,tree x,tree*root) *root) void {{ ((*root)!=NULL) ifif((*root)!=NULL) (xelement)xoa(x,&(*root)->left) xoa(x,&(*root)->left);; ifif(x elseifif(x (x>>(*root)->element) (*root)->element)xoa(x,&(*root)->right); xoa(x,&(*root)->right); else else else (((*root)->left==NULL)&&((*root)->right==NULL)) ifif(((*root)->left==NULL)&&((*root)->right==NULL)) (*root)=NULL; (*root)=NULL; else else 33 4.2.2.3 Phép xóa một nút Thủ tục xóa ((*root)->left == == NULL) NULL) (*root) (*root) ==(*root)->right; (*root)->right; ifif ((*root)->left else else ((*root)->right==NULL) (*root) (*root) == (*root)->left; (*root)->left; ifif ((*root)->right==NULL) else (*root)->element (*root)->element== xoacuctrai(&(*root)->right); xoacuctrai(&(*root)->right); else }} 34 4.3 Cây nhị phân cân đối (AVL) Định nghĩa: Cây nhị phân tìm kiếm được gọi là cân đối nếu đối với mọi nút của nó chiều cao của hai tương ứng chỉ lệnh một đơn vị 35 4.3 Cây nhị phân cân đối (AVL) Khai báo: Với cân đối AVL, tại mỗi nút ta ghi thêm một hệ số cân đối bal bal = -1 nếu trái cao phải - cao bằng - thấp - 36 4.3 Cây nhị phân cân đối (AVL) Cấu trúc của một nút sẽ sau: typedef int element_type; struct node { element_type element; struct node *left, *right; int bal[-1,0,1] } 37 4.3 Cây nhị phân cân đối (AVL) Các phép toán nhị phân (sinh viên tự nghiên cứu thêm) 38 Bài tập Bài 1.Vẽ nhị phân tìm kiếm bằng cách thêm dần các khóa : 10, 7, 19, 11, 3, 16, 13, 4, 22, Bài 2: Cài đặt chương trình thực hiện: – Nhập một nhị phân tìm kiếm với các giá trị được nhập vào bàn phím trên, thực hiện các phép duyệt để in các giá trị – Nhập giá trị x từ bàn phím, kiểm tra x có không? 39 Bài tập Bài 3: Viết các thủ tục thêm, xoá một nút có khoá x tìm kiếm nhị phân bằng cách không đệ qui Bài 4: a- Vẽ hình tìm kiếm nhị phân tạo từ rỗng bằng cách lần lượt thêm vào các khoá là các số nguyên: 54, 31, 43, 29, 65, 10, 20, 36, 78, 59 b- Vẽ lại hình tìm kiếm nhị phân ở câu a/ sau lần lượt xen thêm các nút 15, 45, 55 c- Vẽ lại hình tìm kiếm nhị phân ở câu a/ sau lần lượt xoá các nút 10, 20, 43, 65, 54 40 ... nút (tam->element element) (*root )-> element) ifif (tam->element ((*root )-> left) chen(e, chen(e, &(*root )-> left); &(*root )-> left); ifif ((*root )-> left) else (*root )-> left (*root )-> left... if(tam->element >> (*root )-> element) (*root )-> element) if(tam->element ((*root )-> right) chen(e, chen(e, &(*root )-> right); &(*root )-> right); ifif ((*root )-> right) else (*root )-> right (*root )-> right... ==(*root )-> right; (*root )-> right; ifif ((*root )-> left else else ((*root )-> right==NULL) (*root) (*root) == (*root )-> left; (*root )-> left; ifif ((*root )-> right==NULL) else (*root )-> element (*root )-> element==

Ngày đăng: 11/05/2021, 01:26

Mục lục

  • CHƯƠNG 4- TÌM KIẾM

  • CHƯƠNG 4. TÌM KIẾM

  • 4.1 Các phương pháp tìm kiếm trong danh sách

  • 4.1.1 Tìm kiếm tuần tự (sequential searching)

  • 4.1.2. Tìm kiếm nhị phân (Binary Serching)

  • Bài tập về nhà

  • 4.2. Cây nhị phân tìm kiếm

  • 4.2.1 Định nghĩa

  • 4.2.2 Các phép toán

  • 4.2.2.1 Phép tìm kiếm

  • 4.2.2.2 Phép thêm một nút

  • 4.2.2.3 Phép xóa một nút

  • 4.3 Cây nhị phân cân đối (AVL)

  • Bài tập

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

Tài liệu liên quan