Bài giảng Cấu trúc dữ liệu 1: Chương 2 - Huỳnh Cao Thế Cường
lượt xem 2
download
Chương 2 trang bị cho người học những kiến thức về giải thuật tìm kiếm và sắp xếp. Nội dung chính trong chương này gồm có: Nhu cầu tìm kiếm và sắp xếp dữ liệu trong hệ thống thông tin, các giải thuật tìm kiếm nội, các giải thuật sắp xếp nội. Mời các bạn cùng tham khảo.
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 1: Chương 2 - Huỳnh Cao Thế Cường
- TRƯỜNG ĐẠI HỌC AN GIANG KHOA KỸ THUẬT CÔNG NGHỆ MÔI TRƯỜNG CẤU TRÚC DỮ LIỆU 1 Giảng viên phụ trách: HUỲNH CAO THẾ CƯỜNG Bộ môn Tin học email: hctcuong@agu.edu.vn 1 1
- Chương 2. TÌM KIẾM VÀ SẮP XẾP Nhu cầu tìm kiếm và sắp xếp dữ liệu trong HTTT Các giải thuật tìm kiếm nội Tìm kiếm tuyến tính Tìm kiếm nhị phân Các giải thuật sắp xếp nội 2
- Nhu cầu tìm kiếm và sắp xếp dữ liệu trong HTTT Nhu cầu? Các giải thuật tìm kiếm nội (Searching Techniques) Tìm kiếm tuyến tính (Sequential Search) Tìm kiếm nhị phân (Linear Search) 3
- Mô tả bài toán Cho mảng A[1..n] các đối tượng, có các khóa key Chúng ta cần tìm trong mảng có phần tử nào có giá trị bằng x hay không? Lưu ý: Khi cài đặt bằng ngôn ngữ C, do chỉ số mảng trong C bắt đầu từ 0 lên các giá trị chỉ số có thể chênh lệnh so với thuật tóan Để đơn giản: Dùng mảng các số nguyên làm cơ sở để cài đặt thuật tóan. 4
- Tìm kiếm tuyến tính (Sequential Search) Ý tưởng: Đây là giải thuật tìm kiếm cổ điển Thuật tóan tiến hành so sánh x với lần lượt với phần tử thứ nhất, thứ hai,.. của mảng a cho đến khi gặp được phần tủ có khóa cần tìm. 5
- Tìm kiếm tuyến tính Giải thuật Bước 1: i=1; //Bắt đầu từ phần từ đầu tiên Bước 2: So sánh a[i].key với x có 2 khả năng • a[i].key = x: Tìm thấy, Dừng; • a[i].key # x: Sang bước 3; Bước 3: • i=i +1; //Xét tiếp phần tử kế tiếp trong mảng • Nếu i>n: hết mảng, không tìm thấy. Dừng • Ngược lại: lặp lại bước 2 6
- Tìm kiếm tuyến tính – ví dụ Tìm giá trị x =5, x=46, x=19 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 a 5 7 99 13 19 15 11 19 23 28 8 30 32 3 41 46 7
- Tìm kiếm tuyến tính – cài đặt Cách 1 void LinearSearch(int a[], int N, int x) { int i, flag = 0; for(i=0;i
- Tìm kiếm tuyến tính – cài đặt Cách 2 int LinearSearch (int a[], int N, int x) { int i=0; while ((i
- Tìm kiếm tuyến tính – cài đặt Cách 3 int LinearSearch (int a[], int N, int x) { int i=0; a[N] =x; //Thêm phần tử N+1 while (a[i]!=x) i++ if (i==N) return -1 ; //Không có x, đã tìm hết mảng else return i; //Tìm thấy ở vị trí i } 10
- Tìm kiếm tuyến tính – đánh giá Đánh giá giải thuật: Có thể ước lượng độ phức tạp của giải thuật tìm kiếm qua số lượng các phép so sánh được tiến hành để tìm ra x. Trường hợp giải thuật tìm tuyến tính, có: Trường Số lần Giải thích hợp so sánh Tốt nhất 1 Phần tử đầu tiên có giá trị x Xấu nhất n+1 Phần tử cuối cùng có giá trị x Trung bình (n+1)/2 Giả sử xác suất các phần tử trong mảng nhận giá trị x là như nhau. Vậy giải thuật tìm tuyến tính có độ phức tạp tính toán cấp n: T(n) = O(n) 11
- Tìm kiếm nhị phân Nhận xét Không phụ thuộc vào thứ tự các phần tử trong mảng Một thuật tóan có thể được cài đặt theo nhiều cách khác nhau, kỹ thuật cài đặt ảnh hưởng đến tốc độ thực hiện của thuật tóan. 12
- Tìm kiếm nhị phân (binary search) Bạn sẽ làm thế nào để tìm một tên chủ thuê bao trong danh bạ điện thoại, hoặc 1 từ (word) trong từ điển? Tìm nơi nào đó ở giữa (danh bạ, từ điển) So sánh nơi tên/từ nằm ở vị trí nào? Quyết định tìm kiếm ở nửa đầu hay nửa sau danh bạ. Lặp lại bước trên Đây chính là ý tưởng giải thuật tìm kiếm nhị phân (the binary search algorithm) 13
- Tìm kiếm nhị phân Giải thuật Bước 1: đặt left=1; right=N; //tìm kiếm tất cả các phần tử Bước 2: mid =(left+right)/2; //mốc so sánh • So sánh a[mid].key = x; • a[mid].key = x: Tìm thấy, Dừng; • a[mid].key >x : right = mid -1; • a[mid].key
- Tìm kiếm nhị phân Tìm trong mảng a, giá trị 36: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 a 5 7 10 13 13 15 19 19 23 28 28 32 32 37 41 46 1. (0+15)/2=7; a[7]=19; tìm trong 8..15 2. (8+15)/2=11; a[11]=32; tìm trong 12..15 3. (12+15)/2=13; a[13]=37; tím trong 12..12 4. (12+12)/2=12; a[12]=32; tìm trong 13..12 ...nhưng 13>12, => 36 không thấy 15
- Tìm kiếm nhị phân Tìm trong mảng a, giá trị 7: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 a 5 7 10 13 13 15 19 19 23 28 28 32 32 37 41 46 1. (0+15)/2=7; a[7]=19; tìm trong 0..6 2. (0+6)/2=3; a[3]=13; tìm trong 0..2 3. (0+2)/2=1; a[1]=7; Kết thúc 16
- Tìm kiếm nhị phân – cài đặt void BinarySearch(int a[],int N, int x) { int left,right,mid, flag = 0; left = 0; right= n-1; while(left
- Tìm kiếm nhị phân – cài đặt int BinarySearch(int a[],int N, int x) { int left, right; mid ; left = 0; right= N-1; do { mid = (left+right)/2; if( x=a[mid]) return mid; //thấy x tại vị trí mid else if(x
- Tìm kiếm nhị phân Nhận xét: Chỉ áp dụng cho dãy các phần tử đã có thứ tự Tiết kiệm thời gian hơn so với tìm tiếm tuần tự. Nếu dãy chưa được sắp xếp thứ tự? • Sắp xếp • Tìm kiếm • Tốn thời gian 19
- Các giải thuật sắp xếp nội Mô tả bài tóan Các phương pháp sắp xếp thông dụng Phương pháp chọn trực tiếp – Selection Sort Phương pháp chèn trực tiếp – Insertion sort Phương pháp đổi chỗ trực tiếp – Interchange Sort Phương pháp nổi bọt - Bubble Sort Sắp xếp cây – Heap Sort Sắp xếp với độ dài bước giảm dần – Shell Sort Sắp xếp dựa trên phân hoạch – Quick Sort Sắp xếp theo phương pháp trôn trực tiếp – Merge Sort Sắp xếp theo phương pháp cơ số - Radix Sort 20
CÓ THỂ BẠN MUỐN DOWNLOAD
-
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 – 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: 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: Các cấu trúc dữ liệu
193 p | 62 | 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 | 174 | 6
-
Bài giảng Cấu trúc dữ liệu - Chương 3: Cấu trúc cây
65 p | 59 | 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 trong C++ - Bài 9: Cấu trúc dữ liệu hàng đợi
12 p | 57 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 6 - Ngô Quang Thạch
41 p | 106 | 4
-
Bài giảng Cấu trúc dữ liệu: Chương 1 - ThS. Thiều Quang Trung (2018)
44 p | 45 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Bài 1b - Hoàng Thị Điệp (2014)
29 p | 30 | 3
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 2 - Th.S Thiều Quang Trung
41 p | 70 | 3
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 5 - Ngô Quang Thạch
24 p | 58 | 3
-
Bài giảng Cấu trúc dữ liệu giải thuật: Cấu trúc dữ liệu
17 p | 53 | 2
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Bài 1a - Hoàng Thị Điệp (2014)
12 p | 59 | 1
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