Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 64 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
64
Dung lượng
1,14 MB
Nội dung
Tìm kiếm xếp Nội dung trình bày Tìm kiếm Sắp xếp Cấu trúc liệu - Khoa CNTT 2.1 Tìm kiếm Tìm kiếm thao tác quan trọng & thường xuyên tin học - Tìm kiếm nhân viên danh sách nhân viên Tìm sinh viên danh sách sinh viên lớp… Tìm kiếm tên sách thư viện Cấu trúc liệu - Khoa CNTT 2.1 Tìm kiếm Tìm kiếm trình xác định đối tượng tập đối tượng Kết trả đối tượng tìm (nếu có) số (nếu có) xác định vị trí đối tượng tập Việc tìm kiếm dựa theo trường đối tượng, trường khóa (key) việc tìm kiếm VD: đối tượng sinh viên có liệu { MaSV, HoTen, DiaChi,…} Khi tìm kiếm danh sách sinh viên khóa thường chọn MaSV HoTen Cấu trúc liệu - Khoa CNTT 2.1 Tìm kiếm Bài toán mô tả sau: - Tập liệu lưu trữ dãy a , a , ,a Giả sử n chọn cấu trúc liệu mảng để lưu trữ dãy số nhớ chính, có khai báo: int a[n]; - Khóa cần tìm x, có kiểu nguyên: int x; Tìm kiếm Tìm kiếm tuyến tính Tìm kiếm nhị phân Tập liệu Tập liệu xếp Cấu trúc liệu - Khoa CNTT 2.1.1 Tìm kiếm tuyến tính Ý tưởng chính: duyệt từ phần tử đầu tiên, so sánh khóa tìm kiếm với khoá tương ứng phần tử danh sách Cho đến gặp phần tử cần tìm đến duyệt hết danh sách Các bước tiến hành sau: - - Bước 1: i = 1; Bước 2: So sánh a[i] với x, có hai khả A[i] = x: Tìm thấy ⇒ Dừng A[i] ≠ x: Sang bước Bước 3: i = i + // xét phần tử mảng Nếu i > N: Hết mảng, không tìm thấy ⇒ Dừng Nếu i ≤ N: Quay lại bước Cấu trúc liệu - Khoa CNTT 2.1.1 Tìm kiếm tuyến tính Ví dụ: Cho dãy số a, giá trị tìm x = 8: 12 Minh họa tìm kiếm tuyến tính Tìm X=8 12 Cấu trúc liệu - Khoa CNTT 2.1.1 Tìm kiếm tuyến tính Thuật toán tìm kiếm tuyến tính int Search(int a[], int n, int key) { int i =0; while (i= n) return -1; // tìm không thấy else return i; // tìm thấy vị trí i } Cấu trúc liệu - Khoa CNTT 2.1.1 Tìm kiếm tuyến tính Thuật toán tìm kiếm tuyến tính cải tiến int Search(int a[], int n, int key) { int i =0; a[n] =key; // thêm phần tử thứ n+1 while (key != a[i]) i++; if (i == n) return -1; // tìm hết mảng x else return i; // tìm thấy x vị trí i } Cấu trúc liệu - Khoa CNTT 2.1.1 Tìm kiếm tuyến tính Nhận xét - - Giải thuật tìm kiếm tuyến tính không phụ thuộc vào thứ tự phần tử mảng, phương pháp tổng quát để tìm kiếm dãy Một thuật toán cài đặt theo nhiều cách khác nhau, kỹ thuật cài đặt ảnh hưởng nhiều đến tốc độ thực Ví dụ thuật toán Search cải tiến chạy nhanh thuật toán trước vòng lặp while so sánh điều kiện Cấu trúc liệu - Khoa CNTT 10 2.2.5 PP ShellSort void ShellSort(int a[], int n, int h[], int k){ // h[] chứa bước nhảy int step, i, j; // số phần tử h k int x, len; for(step = 0; step < k; step++) { // duyệt qua bước nhảy len = h[step]; // chiều dài bước nhảy for(i = len; i < n; i++) { // duyệt dãy x = a[i]; // lưu phần tử cuối để tìm vị trí thích hợp dãy j = i – len; // a[j] đứng trước a[i] dãy while ((x < a[j]) && (j ≥ 0)) { // pp chèn a[j+len] = a[j]; // dời sau theo dãy j = j – len; // qua phần tử trước dãy } a[j+len] = x; // đưa x vào vị trí thích hợp dãy } // end for i } // end for step } Cấu trúc liệu - Khoa CNTT 50 2.2.6 PP QuickSort Thuật toán Hoare đề xuất - Tốc độ trung bình nhanh thuật toán khác Do Hoare dùng “quick” để đặt tên Ý tưởng - QS phân hoạch dãy ban đầu thành hai phần dựa vào giá trị x Dãy 1: gồm phần tử a[i] ko lớn x Dãy 2: gồm phần tử a[i] ko nhỏ x Cấu trúc liệu - Khoa CNTT 51 2.2.6 PP QuickSort Sau phân hoạch dãy ban đầu phân thành ba phần: a[k] < x, với k = i a[k] = x, với k = i j a[k] > x, với k = j n a[k] < x a[k] = x a[k] > x Cấu trúc liệu - Khoa CNTT 52 2.2.6 PP QuickSort GT phân hoạch dãy a[left], a[left+1], ,a[right] thành hai dãy con: B1: Chọn tùy ý phần tử a[k] dãy giá trị mốc, left ≤ k ≤ right, Cho x = a[k], i = left, j = right B2: Tìm hoán vị cặp phần tử a[i] a[j] không thứ tự B2-1: Trong a[i] < x ⇒ i++; B2-2: Trong a[j] > x ⇒ j ; B2-3: Nếu i < j ⇒ Swap(a[i], a[j]) // a[i], a[j] sai thứ tự B3: Nếu i < j: ⇒ Bước 2; Nếu i ≥ j: ⇒ Dừng Cấu trúc liệu - Khoa CNTT 53 2.2.6 PP QuickSort GT để xếp dãy a[left], a[left+1], ,a[right]: phát biểu theo cách đệ quy sau: B1: Phân hoạch dãy a[left] a[right] thành dãy con: - Dãy 1: a[left] a[j] < x - Dãy 2: a[j+1] a[i-1] = x - Dãy 3: a[i] a[right] > x B2: - Nếu (left < j) // dãy có nhiều phần tử - Phân hoạch dãy a[left] a[j] Nếu (i < right) // dãy có nhiều phần tử Phân hoạch dãy a[i] a[right] Cấu trúc liệu - Khoa CNTT 54 2.2.6 PP QuickSort void QuickSort(int a[], int left, int right) { int i, j, x; x = a[(left+right)/2]; // chọn phần tử làm gốc i = left; j = right; { while (a[i] < x) i++; // lặp đến a[i] >= x while (a[j] > x) j ; // lặp đến a[i] [...]... j=4 Cấu trúc dữ liệu - Khoa CNTT 28 2. 2 .2 Bubble Sort 12 2 1 8 5 4 6 15 2 8 5 4 6 15 2 8 5 4 6 15 j=3 i=1 12 1 i=1 j =2 1 12 i =2 j=6 Cấu trúc dữ liệu - Khoa CNTT 29 2. 2 .2 Bubble Sort 1 12 2 8 i =2 1 1 4 5 6 15 j=5 12 2 i =2 j=3 2 12 i=3 4 8 5 6 15 4 8 5 6 15 j=6 Cấu trúc dữ liệu - Khoa CNTT 30 2. 2 .2 Bubble Sort 1 1 2 2 12 4 i=3 j=4 4 12 5 8 6 15 5 8 6 15 i=4 1 2 4 j=7 12 5 i=4 j=5 6 Cấu trúc dữ liệu -... cho các bảng biểu Cấu trúc dữ liệu - Khoa CNTT 17 2. 2 Sắp xếp Dữ liệu thường được tổ chức thành mảng các mẫu tin dữ liệu Mỗi mẫu tin thường có một số các trường dữ liệu khác nhau Trường tham gia quá trình tìm kiếm gọi là khoá (key) Việc sắp xếp sẽ được tiến hành dựa vào giá trị khoá này Cấu trúc dữ liệu - Khoa CNTT 18 2. 2 Sắp xếp Các phương pháp sắp xếp 1 Selection Sort (*) 2 Insertion Sort... phí cho việc sắp xếp mảng Vì khi mảng được sắp thứ tự rồi thì mới tìm kiếm nhị phân Cấu trúc dữ liệu - Khoa CNTT 16 2. 2 Sắp xếp tử Sắp xếp là quá trình bố trí lại các phần của một tập đối tượng theo một thứ tự nhất định Ví dụ: {1, 2, 5, 7, 9, 12} , {14, 12, 7, 5, 2, 1} {“An” “Binh” “Dương” “Hương”} Việc sắp xếp là một bài toán phổ biến trong tin học Do các yêu cầu tìm kiếm thuận lợi, sắp xếp kết xuất... dữ liệu - Khoa CNTT 8 15 31 2. 2 .2 Bubble Sort 1 1 1 2 2 2 4 4 4 5 5 5 12 6 i=5 j=6 6 6 8 15 12 8 15 i=6 j=7 8 12 15 i=7 1 2 4 5 6 8 Cấu trúc dữ liệu - Khoa CNTT 12 15 32 2 .2. 2 Bubble Sort Cài đặt Bubble sort void BubbleSort(int a[], int n) { int i, j; for(i =0; i < n-1; i++) for(j=n-1; j >i; j ) if (a[j] < a[j-1]) Swap(a[j], a[j-1]); } Cấu trúc dữ liệu - Khoa CNTT 33 2. 2.3 Insertion Sort Ý tưởng... - Khoa CNTT 6 4 15 22 2. 2.1 Selection Sort 12 2 8 5 6 4 15 min=5 i=1 1 1 2 8 5 12 6 4 15 8 5 12 6 4 15 i =2 1 2 i=3 Cấu trúc dữ liệu - Khoa CNTT min=7 23 2. 2.1 Selection Sort 1 2 4 5 12 6 8 15 12 6 8 15 i=5 min=6 6 8 12 15 i=4 1 1 2 2 4 4 5 5 i=7 1 2 4 5 6 Cấu trúc dữ liệu - Khoa CNTT 8 12 15 24 2. 2.1 Selection Sort Cài đặt Selection Sort void SelectionSort(int a[], int n) { int min; // lưu chỉ số... B2: j=n; // duyệt từ cuối dãy ngược về vị trí i Trong khi (j>i) thực hiện: Nếu a[j] < a[j-1]: Hoán đổi a[j] và a[j-1] j = j -1; - B3: i = i+1; // lần xử lý kế tiếp Nếu i > n-1: Hết dãy ⇒ Dừng Ngược lại: quay lại B2 Ví dụ: Minh họa sắp xếp dãy số sau: 12 2 8 5 1 6 4 Cấu trúc dữ liệu - Khoa CNTT 15 27 2. 2 .2 Bubble Sort 12 2 8 5 1 6 2 8 5 i=1 1 4 6 15 4 6 15 j=5 i=1 12 15 j=7 i=1 12 4 2 8 1 5 j=4 Cấu. .. CNTT 21 2. 2.1 Selection Sort Các bước thực hiện - - B1: i = 1 B2: Tìm phần tử a[min] nhỏ nhất trong dãy hiện hành từ a[i] đến a[n] B3: Hoán vị a[i] và a[min] B4: Nếu i < n -1 thì i= i+1 ⇒ Lặp B2 Ngược lại ⇒ Dừng Ví dụ: cho dãy số như sau: 12 2 8 5 1 Minh họa phương pháp chọn như sau Cấu trúc dữ liệu - Khoa CNTT 6 4 15 22 2. 2.1 Selection Sort 12 2 8 5 6 4 15 min=5 i=1 1 1 2 8 5 12 6 4 15 8 5 12 6... dãy số gồm 8 phần tử bên dưới và 2 2 4 X =58 4 Left = 1 5 6 8 12 15 6 8 12 15 Mid = 4 Right = 8 Đoạn tìm kiếm X=8 = 1 2 4 5 6 8 12 Left = 5 Mid = 6 15 Right = 8 Đoạn tìm kiếm Cấu trúc dữ liệu - Khoa CNTT 14 2. 1 .2 Tìm kiếm nhị phân Thuật toán tìm kiếm NP BinarySearch int BinarySearch(int key){ int left = 0, right = n-1, mid; while (left x thì có nghĩa là đoạn a[m] đến a[right] chỉ chứa khoá > x, ta tiến hành tìm kiếm từ a[left] đến a[mid-1] Nếu a[mid] = x thì việc tìm kiếm thành công Quá trình tìm kiếm thất bại nếu left > right Cấu trúc dữ liệu - Khoa CNTT 12 2.1 .2 Tìm kiếm nhị phân Các bước tiến hành - B1: left =1, right = n // tìm kiếm trên tất cả phần tử B2: mid = (left ... i=1 12 15 j=7 i=1 12 j=4 Cấu trúc liệu - Khoa CNTT 28 2. 2 .2 Bubble Sort 12 15 15 15 j=3 i=1 12 i=1 j =2 12 i =2 j=6 Cấu trúc liệu - Khoa CNTT 29 2. 2 .2 Bubble Sort 12 i =2 1 15 j=5 12 i =2 j=3 12 i=3... liệu - Khoa CNTT 15 22 2. 2.1 Selection Sort 12 15 min=5 i=1 1 12 15 12 15 i =2 i=3 Cấu trúc liệu - Khoa CNTT min=7 23 2. 2.1 Selection Sort 12 15 12 15 i=5 min=6 12 15 i=4 1 2 4 5 i=7 Cấu trúc liệu. .. j=6 Cấu trúc liệu - Khoa CNTT 30 2. 2 .2 Bubble Sort 1 2 12 i=3 j=4 12 15 15 i=4 j=7 12 i=4 j=5 Cấu trúc liệu - Khoa CNTT 15 31 2. 2 .2 Bubble Sort 1 2 4 5 12 i=5 j=6 6 15 12 15 i=6 j=7 12 15 i=7 Cấu