Bài giảng Cấu trúc dữ liệu và giải thuật trong C++ - Bài 13: Tìm kiếm - Search
lượt xem 3
download
Bài giảng "Cấu trúc dữ liệu và giải thuật trong C++ - Bài 13: Tìm kiếm - Search" cung cấp cho người học các kiến thức: Tìm kiếm tuần tự (Sequence search), tìm kiếm nhị phân (Binary search), bảng băm (Hash table). Mời các bạn cùng tham khảo nội dung chi tiết.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Cấu trúc dữ liệu và giải thuật trong C++ - Bài 13: Tìm kiếm - Search
- Bài 13. Tìm kiếm- Search Bài toán Input: Cho một tập S các phần tử, mỗi phần tử là một bộ gồm khóa-giá trị (key-value) và một khóa k bất kỳ. Output: Trong S có phần tử có khóa k hay không? Search 1
- 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 2
- 1. Tìm kiế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 3
- 1. Tìm kiếm tuần tự Ví dụ 1: Cho dãy S: 0 45 3 34 13 7 43 9 11 Tìm xem trong dãy có phần tử k=33 Quá trình tìm kiếm 0 45 3 34 13 7 43 9 11 Bước 1 Bước 2 Bước 3 Bước 4 Bước 5 Bước 6 Bước 7 Bước 8 Bước 9 • Không tìm thấy Search 4
- 1. Tìm kiếm tuần tự Ví dụ 2: Cho dãy S: 0 45 3 34 13 7 43 9 11 Tìm xem trong dãy có phần tử k=13 Quá trình tìm kiếm 0 45 3 34 13 7 43 9 11 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 5
- 1. Tìm kiếm tuần tự 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; //Chuyển sang phần tử kế tiếp } return found; Search 6
- 1. Tìm kiếm tuần tự 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 7
- 2. Tìm kiế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 8
- 2.1 Tì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ìm kiếm nhị phân được thiết kế dựa trên chiến lược chia để 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 9
- 2.1 Tìm kiếm nhị phân trên mảng •Ví dụ 1: Cho dãy dưới đây. Tìm phần tử k=6 0 1 3 4 5 7 8 9 11 14 16 18 19 Bước1: 6< 0 1 3 4 5 7 Bước 2: 6> 4 5 7 Bước 3: 6> 7 Bước 4: 6< Rỗng Bước 5: 6 Không tìm thấy Search 10
- 2.1 Tìm kiếm nhị phân trên mảng • Ví dụ 2: Cho dãy dưới đâ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 Bước 2: 5> 4 5 7 Bước 3: 5= Tìm thấy Search 11
- 2.1 Tìm kiếm nhị phân trên mảng • Thuật toán: Algorithm BinarySearch(S, k, n); Found = 0; i = 1; j = n; while(i
- 2.1 Tìm kiếm nhị phân trên mảng • 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ầ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ìm kiếm trên cây TKNP Định nghĩa: cây tìm kiếm nhị phân là cây nhị phân < 6 > thỏa mãn: Nút cha có khóa lớn hơn 2 10 khóa của tất cả các nút của cây con bên trái, và 8 0 4 nhỏ hơn khóa của tất cả các nút của cây con bên phải. -1 1 3 5 7 9 Các nút con trái và phải cũng là cây tìm kiếm nhị Ví dụ: Cây tìm kiếm nhị phân phân Search 14
- Cây tìm kiếm nhị phân (Binary search tree) < 6 2 > 9 1 4 = 8 Search 15
- 2.2 Tìm kiếm trên cây TKNP •Ví dụ: Find(4) < 6 2 > 9 = 12 1 4 8 Search 16
- Cấu trúc Node biểu diễn cây nhị phân Phương thức Node *Parent() Thuộc tính Node *Left() Keys key Node *Right() T elem void setLeft(Node*) Node *Parent void setRight(Node*) Node *Left void setParent(Node *) Node *Right int hasLeft() int hasRight() Chú ý: Keys là tập các Object getElem() giá trị được sắp có thứ void setElem(T o) tự void setKey(Keys k) Search Keys getKey() 17
- Cấu trúc của cây TKNP Thuộc tính Các phương thức truy cập: Node * root Node *root() Phương thức 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, T) void Remove(Keys) Search 18
- Thuật toán tìm kiếm Tìm trong cây có nút có khóa bằng k không? Thuật toán Xuất phát từ nút gốc So sánh giá trị khóa của nút gốc với k Nếu giá trị =k thì trả lại đ/c của nút đó và dừng lại Nếu giá trị k thì tiếp tục 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; else // k > v->getKey() return TreeSearch(k, v->Right()); Search 20
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Cấu trúc dữ liệu & thuật toán: Chương 3 - Nguyễn Đức Nghĩa
0 p | 491 | 166
-
Bài giảng Cấu trúc dữ liệu cơ bản và giải thuật - Chương 1
9 p | 258 | 29
-
Bài giảng Cấu trúc dữ liệu - Bài 1:Tổng quan về cấu trúc dữ liệu và giải thuật
47 p | 179 | 17
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 3 - Đỗ Bích Diệp
28 p | 119 | 10
-
Bài giảng Cấu trúc dữ liệu: Chương 10 - Nguyễn Xuân Vinh
31 p | 95 | 10
-
Bài giảng Cấu trúc dữ liệu 1: Chương 1 - Lương Trần Hy Hiến
7 p | 162 | 9
-
Bài giảng Cấu trúc dữ liệu và giải thuật trong C++ - Bài 8: Cấu trúc dữ liệu ngăn xếp
28 p | 81 | 9
-
Bài giảng Cấu trúc dữ liệu giải thuật: Các kiểu dữ liệu trừu tượng cơ bản - Cấu trúc dữ liệu tuyến tính
92 p | 117 | 9
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Cấu trúc dữ liệu cây đỏ đen - Bùi Tiến Lên
25 p | 88 | 8
-
Bài giảng Cấu trúc dữ liệu và giải thuật – Bài 17: Cấu trúc dữ liệu dạng cây
21 p | 77 | 8
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Các cấu trúc dữ liệu
193 p | 62 | 7
-
Bài giảng Cấu trúc dữ liệu: Chương Giới thiệu - Nguyễn Xuân Vinh
8 p | 112 | 7
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 - Trần Minh Thái (2016)
62 p | 94 | 6
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 - Trần Minh Thái (Trường Đại học Hồng Bàng )
62 p | 173 | 6
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 – Trần Minh Thái (2017)
67 p | 107 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 7 - Châu Thị Bảo Hà
133 p | 115 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật – Chương 1: Tổng quan về giải thuật và cấu trúc dữ liệu
10 p | 70 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Các khái niệm cơ bản
23 p | 48 | 3
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn