![Phân tích tư tưởng của nhân dân qua đoạn thơ: Những người vợ nhớ chồng… Những cuộc đời đã hóa sông núi ta trong Đất nước của Nguyễn Khoa Điềm](https://timtailieu.net/upload/document/136415/phan-tich-tu-tuong-cua-nhan-dan-qua-doan-tho-039-039-nhung-nguoi-vo-nho-chong-nhung-cuoc-doi-da-hoa-song-nui-ta-039-039-trong-dat-nuoc-cua-nguyen-khoa-136415.jpg)
Bài giảng Cấu trúc dữ liệu & thuật toán: Chương 6 - Nguyễn Đức Nghĩa
Số trang: 0
Loại file: pdf
Dung lượng: 1.46 MB
Lượt xem: 13
Lượt tải: 0
Xem trước 0 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Bài giảng Cấu trúc dữ liệu & thuật toán - Chương 6: Tìm kiếm trình bày các kiến thức về tìm kiếm tuần tự và tìm kiếm nhị phân, cây nhị phân tìm kiếm, cây AVL, tìm kiếm xâu mẫu và bảng băm.
Nội dung trích xuất từ tài liệu:
Bài giảng Cấu trúc dữ liệu & thuật toán: Chương 6 - Nguyễn Đức Nghĩa Chương 6 TÌM KIẾM 1 NỘI DUNG 6.1. Tìm kiếm tuần tự và tìm kiếm nhị phân 6.2. Cây nhị phân tìm kiếm 6.3. Cây AVL 6.4. Tìm kiếm xâu mẫu 6.5. Bảng băm Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 2 6.1. Tìm kiếm tuần tự và tìm kiếm nhị phân 6.1.1. Tìm kiếm tuần tự (Linear Search or Sequential Search) 6.1.2. Tìm kiếm nhị phân Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 3 Bài toán tìm kiếm Cho danh sách a gồm n phần tử a1, a2, ..., an và một số x. Hỏi x có mặt trong danh sách đã cho hay không? Nếu câu trả lời là khẳng định, hãy đưa ra vị trí xuất hiện của x trong dãy đã cho, nghĩa là đưa ra chỉ số i sao cho ai = x. Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 4 6.1.1. Tìm kiếm tuần tự current -7 9 -5 2 8 3 -4 0 1 2 3 4 5 6 • Bắt đầu từ phần tử đầu tiên, duyệt qua từng phần tử cho đến khi tìm được đích hoặc kết luận không tìm được. • Các số không cần sắp thứ tự • Làm việc được với cả danh sách móc nối (Linked Lists) Độ phức tạp: O(n) Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 5 Linear Search int linearSearch(float a[], int size, int target) { int i; for (i = 0; i < size; i++) { if (a[i] == target) { return i; } } return -1; } Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 6 Phân tích thời gian tính Cần đánh giá thời gian tính tốt nhất, tồi nhất, trung bình của thuật toán với độ dài đầu vào là n. Rõ ràng thời gian tính của thuật toán có thể đánh giá bởi số lần thực hiện phép so sánh (*) (a[i] == target) trong vòng lặp for. Nếu a[1] = target thì phép so sánh (*) phải thực hiện 1 lần. Do đó thời gian tính tốt nhất của thuật toán là (1). Nếu target không có mặt trong dãy đã cho, thì phép so sánh (*) phải thực hiện n lần. Vì thế thời gian tính tồi nhất của thuật toán là (n). Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 7 Phân tích thời gian tính Cuối cùng, ta tính thời gian tính trung bình của thuật toán. Nếu target tìm thấy ở vị trí thứ i của dãy (target = a[i]) thì phép so sánh (*) phải thực hiện i lần (i = 1, 2, ..., n), còn nếu target không có mặt trong dãy đã cho thì phép so sánh (*) phải thực hiện n lần. Từ đó suy ra số lần trung bình phải thực hiện phép so sánh (*) là [(1 + 2 + . . . + n) + n] /(n+1) = [n+ n(n+1)/2]/(n+1) = (n2 + 3n)/[2(n+1)] . Ta có: n/4 (n2+3n)/[2(n+1)] n Vì vậy, thời gian tính trung bình của thuật toán là (n). Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 8 6.1.2. Tìm kiếm nhị phân- Binary Search mid • Điều kiện: – Danh sách phải được sắp thứ tự. – Phải cho phép trực truy. Độ phức tạp: O(log n) Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 9 Tình huống 1: target < list[mid] target list: lower New mid upper upper Tình huống 2: list[mid] < target target list: lower mid New upper Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN lower 10 Cài đặt trên C int binarySearch(float array[], int size, int target) { int lower = 0, upper = size - 1, mid; while (lower target) { upper = mid - 1; } else if (array[mid] < target) { lower = mid + 1; } else { return mid; } Đoạn cần khảo sát } có độ dài giảm đi một nửa return -1; sau mỗi lần lặp } Độ phức tạp: O(log n) Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 11 Ví dụ minh hoạ ứng dụng BS • Dãy cấp ba Bộ gồm ba số nguyên (a1, a2, a3) được gọi là một cấp số cộng tăng nếu như: a2 – a1 = a3 – a2 và a2 – a1 > 0. Bộ ba (a1, a2, a3) được gọi là đi trước bộ ba (b1, b2, b3) trong thứ tự từ điển nếu như một trong ba điều kiện sau đây được thực hiện: 1) a1 < b1; 2) a1 = b1 và a2 < b2; 3) a1 = b1 , a2 = b2 và a3 < b3. • Dãy số nguyên c1, c2, …, cn ( | ci | < 231, i = 1, 2, …, n) được gọi là dãy cấp ba nếu như có thể tìm được ba số hạng của nó để lập thành một bộ ba cấp số cộng tăng. • Ví dụ: Dãy 3, 1, 5, 2, -7, 0, -1 là một dãy cấp ba, vì nó chứa bộ ba cấp số cộng tăng, chẳng hạn (1, 3, 5) hay (-7, -1, 5). Bộ ba (-7, -1, 5) là bộ ba cấp số cộng tăng đầu tiên theo thứ tự từ điển trong số các bộ ba cấp số cộng tăng của dãy đã cho. • Yêu cầu: Hãy kiểm tra xem dãy số nguyên cho trước có phải là dãy cấp ba hay không. Nếu câu trả lời là khẳng định hãy đưa ra bộ ba cấp số cộng tăng đầu tiên trong thứ tự từ điển Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 12 ...
Nội dung trích xuất từ tài liệu:
Bài giảng Cấu trúc dữ liệu & thuật toán: Chương 6 - Nguyễn Đức Nghĩa Chương 6 TÌM KIẾM 1 NỘI DUNG 6.1. Tìm kiếm tuần tự và tìm kiếm nhị phân 6.2. Cây nhị phân tìm kiếm 6.3. Cây AVL 6.4. Tìm kiếm xâu mẫu 6.5. Bảng băm Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 2 6.1. Tìm kiếm tuần tự và tìm kiếm nhị phân 6.1.1. Tìm kiếm tuần tự (Linear Search or Sequential Search) 6.1.2. Tìm kiếm nhị phân Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 3 Bài toán tìm kiếm Cho danh sách a gồm n phần tử a1, a2, ..., an và một số x. Hỏi x có mặt trong danh sách đã cho hay không? Nếu câu trả lời là khẳng định, hãy đưa ra vị trí xuất hiện của x trong dãy đã cho, nghĩa là đưa ra chỉ số i sao cho ai = x. Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 4 6.1.1. Tìm kiếm tuần tự current -7 9 -5 2 8 3 -4 0 1 2 3 4 5 6 • Bắt đầu từ phần tử đầu tiên, duyệt qua từng phần tử cho đến khi tìm được đích hoặc kết luận không tìm được. • Các số không cần sắp thứ tự • Làm việc được với cả danh sách móc nối (Linked Lists) Độ phức tạp: O(n) Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 5 Linear Search int linearSearch(float a[], int size, int target) { int i; for (i = 0; i < size; i++) { if (a[i] == target) { return i; } } return -1; } Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 6 Phân tích thời gian tính Cần đánh giá thời gian tính tốt nhất, tồi nhất, trung bình của thuật toán với độ dài đầu vào là n. Rõ ràng thời gian tính của thuật toán có thể đánh giá bởi số lần thực hiện phép so sánh (*) (a[i] == target) trong vòng lặp for. Nếu a[1] = target thì phép so sánh (*) phải thực hiện 1 lần. Do đó thời gian tính tốt nhất của thuật toán là (1). Nếu target không có mặt trong dãy đã cho, thì phép so sánh (*) phải thực hiện n lần. Vì thế thời gian tính tồi nhất của thuật toán là (n). Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 7 Phân tích thời gian tính Cuối cùng, ta tính thời gian tính trung bình của thuật toán. Nếu target tìm thấy ở vị trí thứ i của dãy (target = a[i]) thì phép so sánh (*) phải thực hiện i lần (i = 1, 2, ..., n), còn nếu target không có mặt trong dãy đã cho thì phép so sánh (*) phải thực hiện n lần. Từ đó suy ra số lần trung bình phải thực hiện phép so sánh (*) là [(1 + 2 + . . . + n) + n] /(n+1) = [n+ n(n+1)/2]/(n+1) = (n2 + 3n)/[2(n+1)] . Ta có: n/4 (n2+3n)/[2(n+1)] n Vì vậy, thời gian tính trung bình của thuật toán là (n). Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 8 6.1.2. Tìm kiếm nhị phân- Binary Search mid • Điều kiện: – Danh sách phải được sắp thứ tự. – Phải cho phép trực truy. Độ phức tạp: O(log n) Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 9 Tình huống 1: target < list[mid] target list: lower New mid upper upper Tình huống 2: list[mid] < target target list: lower mid New upper Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN lower 10 Cài đặt trên C int binarySearch(float array[], int size, int target) { int lower = 0, upper = size - 1, mid; while (lower target) { upper = mid - 1; } else if (array[mid] < target) { lower = mid + 1; } else { return mid; } Đoạn cần khảo sát } có độ dài giảm đi một nửa return -1; sau mỗi lần lặp } Độ phức tạp: O(log n) Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 11 Ví dụ minh hoạ ứng dụng BS • Dãy cấp ba Bộ gồm ba số nguyên (a1, a2, a3) được gọi là một cấp số cộng tăng nếu như: a2 – a1 = a3 – a2 và a2 – a1 > 0. Bộ ba (a1, a2, a3) được gọi là đi trước bộ ba (b1, b2, b3) trong thứ tự từ điển nếu như một trong ba điều kiện sau đây được thực hiện: 1) a1 < b1; 2) a1 = b1 và a2 < b2; 3) a1 = b1 , a2 = b2 và a3 < b3. • Dãy số nguyên c1, c2, …, cn ( | ci | < 231, i = 1, 2, …, n) được gọi là dãy cấp ba nếu như có thể tìm được ba số hạng của nó để lập thành một bộ ba cấp số cộng tăng. • Ví dụ: Dãy 3, 1, 5, 2, -7, 0, -1 là một dãy cấp ba, vì nó chứa bộ ba cấp số cộng tăng, chẳng hạn (1, 3, 5) hay (-7, -1, 5). Bộ ba (-7, -1, 5) là bộ ba cấp số cộng tăng đầu tiên theo thứ tự từ điển trong số các bộ ba cấp số cộng tăng của dãy đã cho. • Yêu cầu: Hãy kiểm tra xem dãy số nguyên cho trước có phải là dãy cấp ba hay không. Nếu câu trả lời là khẳng định hãy đưa ra bộ ba cấp số cộng tăng đầu tiên trong thứ tự từ điển Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 12 ...
Tìm kiếm theo từ khóa liên quan:
Bài giảng Cấu trúc dữ liệu thuật toán Cấu trúc dữ liệu thuật toán Cấu trúc dữ liệu Tìm kiếm tuần tự Tìm kiếm nhị phân Cây nhị phân tìm kiếmTài liệu liên quan:
-
Đề cương chi tiết học phần Cấu trúc dữ liệu và giải thuật (Data structures and algorithms)
10 trang 330 0 0 -
Giáo trình Lập trình cơ bản với C++ - Phan 2
69 trang 208 0 0 -
Giải thuật và cấu trúc dữ liệu
305 trang 177 0 0 -
Bài giảng Phân tích thiết kế phần mềm: Chương 1 - Trường ĐH Ngoại ngữ - Tin học TP.HCM
64 trang 161 0 0 -
Tập bài giảng Thực hành kỹ thuật lập trình
303 trang 143 0 0 -
Giáo trình Cấu trúc dữ liệu và thuật toán (Tái bản): Phần 1
152 trang 141 0 0 -
Tài liệu tham khảo: Cấu trúc dữ liệu và giải thuật
229 trang 133 0 0 -
Ứng dụng và cài đặt cấu trúc dữ liệu bằng C: Phần 1
338 trang 85 0 0 -
Lập trình C - Cấu trúc dữ Liệu
307 trang 84 0 0 -
49 trang 77 0 0