Bài giảng Cấu trúc dữ liệu và giải thuật (2013): Phần 2

94 82 0
Bài giảng Cấu trúc dữ liệu và giải thuật (2013): Phần 2

Đ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

Bài giảng Cấu trúc dữ liệu và giải thuật: Phần 2 trình bày về các thuật toán sắp xếp và tìm kiếm. Các thuật toán này cùng với các kỹ thuật được sử dụng trong đó được coi là các kỹ thuật cơ sở cho lập trình máy tính. Các thuật toán được xem xét bao gồm các lớp thuật toán đơn giản và cả các thuật toán cài đặt phức tạp nhưng có thời gian thực hiện tối ưu. Mời các bạn cùng tham khảo để nắm nội dung chi tiết.

HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG  KHOA CÔNG NGHỆ THÔNG TIN BÀI GIẢNG CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NGUYỄN DUY PHƯƠNG HàNội 2013 CHƯƠNG SẮP XẾP VÀ TÌM KIẾM Sắp xếp tìm kiếm vấn đề tin học thực tiễn Chương giới thiệu phương pháp xếp tìm kiếm thơng dụng nhất, bao gồm giải thuật từ đơn giản đến phức tạp Đối với giải thuật xếp, phương pháp xếp đơn giản trình bày bao gồm: xếp chọn, xếp chèn, xếp bọt Các phương pháp xếp phức tạp hiệu xem xét giải thuật xếp nhanh (quick sort), xếp vun đống (heap sort) xếp trộn (merge sort) Với phương pháp xếp, ngồi việc trình bày bước thực thuật tốn, độ phức tạp giải thuật tính tốn đánh giá Đối với phương pháp tìm kiếm, ngồi phương pháp tìm kiếm đơn giản, phương pháp tìm kiếm phức tạp hiệu xem xét tìm kiếm nhị phân tìm kiếm nhị phân tìm kiếm Để học tốt chương này, sinh viên cần nghiên cứu kỹ bước thực thuật tốn lấy ví dụ cụ thể, sau thực bước ví dụ 7.1 BÀI TOÁN SẮP XẾP Sắp xếp trình bố trí lại phần tử tập hợp theo thứ tự Mục đích xếp làm cho thao tác tìm kiếm phần tử tập dễ dàng Ví dụ tập đối tượng phổ biến thực tế là: danh bạ điện thoại theo tên, từ từ điển theo vần, sách thư viện theo mã số, theo tên, v.v Nhìn chung, có nhiều thao tác xử lý liệu cần đến việc xếp phần tử liệu theo trình tự Trên thực tế, xếp thao tác đơn giản Tuy nhiên, thấy, có nhiều giải thuật xếp khác nhau, từ đơn giản tới phức tạp Và kỹ thuật sử dụng giải thuật xếp nghiên cứu phân tích nhiều thân giải thuật xếp Các kỹ thuật coi sở để xây dựng nhiều giải thuật quan trọng khác Do đó, thuật tốn xếp trình bày phân tích kỹ hầu hết tài liệu giải thuật Các giải thuật xếp ví dụ điển hình cho đa dạng thuật tốn Cùng mục đích, có nhiều cách thực hiện, cách tối ưu khía cạnh đó, có số cách xếp có nhiều ưu điểm cách khác Do đó, xếp sử dụng ví dụ điển hình việc phân tích thuật tốn Thơng thường, giải thuật xếp chia làm loại Loại thứ giải thuật cài đặt đơn giản, không hiệu (phải sử dụng nhiều thao tác) Loại thứ hai giải thuật cài đặt phức tạp, hiệu mặt tốc độ (dùng thao tác hơn) Đối với tập liệu phần tử, tốt nên lựa chọn loại thứ Đối với tập có nhiều phần tử, loại thứ hai mang lại hiệu 90 Các đối tượng liệu cần xếp thường có nhiều thuộc tính, ta cần chọn thuộc tính làm khóa để xếp liệu theo khóa Ví dụ, đối tượng người thường có thuộc tính họ tên, ngày sinh, giới tính, v.v., nhiên họ tên thường chọn làm khóa để xếp Tham số để tính tốn hiệu giải thuật thường thời gian thực Đối với phương pháp xếp đơn giản, thời gian thực (số thao tác thực hiện) tỷ lệ với N2, N số phần tử tập Các giải thuật xếp phức tạp tinh xảo có thời gian thực tỷ lệ với NlogN Người ta chứng rằng, khơng có giải thuật có thời gian thực nhỏ NlogN Ngoài thời gian thực hiện, dung lượng nhớ bị chiếm tham số để đánh giá tính hiệu giải thuật Một vấn đề cần phải ý thực xếp, tính ổn định giải thuật xếp Một giải thuật gọi ổn định sau xếp, giữ ngun vị trí phần tử có giá trị khóa Chẳng hạn, với danh sách theo vần họ tên sinh viên lớp Nếu ta tiến hành danh sách theo điểm, sinh viên có điểm theo vần họ tên Hầu hết giải thuật xếp đơn giản có tính ổn định, giải thuật tinh xảo lại tính chất 7.2 CÁC GIẢI THUẬT SẮP XẾP ĐƠN GIẢN 7.2.1 Sắp xếp chọn Đây giải thuật xếp đơn giản Ý tưởng giải thuật sau: Lựa chọn phần tử có giá trị nhỏ nhất, đổi chỗ cho phần tử Tiếp theo, lựa chọn phần tử có giá trị nhỏ thứ nhì, đổi chỗ cho phần tử thứ Q trình tiếp tục tồn dãy Ví dụ, bước thực xếp chọn dãy số bên sau: 32 17 49 98 06 25 53 61 53 61 Bước 1: Chọn phần tử nhỏ 06, đổi chỗ cho 32 06 17 49 98 32 25 Bước 2: Chọn phần tử nhỏ thứ nhì 17, phần tử thứ nên giữ nguyên 06 17 49 98 32 25 53 61 53 61 Bước 3: Chọn phần tử nhỏ thứ ba 25, đổi chỗ cho 49 06 17 25 98 32 91 49 Bước 4: Chọn phần tử nhỏ thứ tư 32, đổi chỗ cho 98 06 17 25 32 98 49 53 61 53 61 98 61 61 98 Bước 5: Chọn phần tử nhỏ thứ năm 49, đổi chỗ cho 98 06 17 25 32 49 98 Bước 6: Chọn phần tử nhỏ thứ sáu 53, đổi chỗ cho 98 06 17 25 32 49 53 Bước 7: Chọn phần tử nhỏ thứ bảy 61, đổi chỗ cho 98 06 17 25 32 49 53 Như vậy, toàn dãy Giải thuật gọi xếp chọn bước, phần tử chọn đổi chỗ cho phần tử vị trí cần thiết dãy Thủ tục thực xếp chọn C sau: void selection_sort(){ int i, j, k, temp; for (i = 0; i< N; i++){ k = i; for (j = i+1; j < N; j++){ if (a[j] < a[k]) k = j; } temp = a[i]; a[i] =a [k]; a[k] = temp; } } Trong thủ tục trên, vòng lặp duyệt từ đầu đến cuối dãy Tại vị trí i, tiến hành duyệt tiếp từ i tới cuối dãy để chọn phần tử nhỏ thứ i đổi chỗ cho phần tử vị trí i Thời gian thực thuật toán tỷ lệ với N2, vịng lặp ngồi (biến chạy i) duyệt qua N phần tử, vịng lặp duyệt trung bình N/2 phần tử Do đó, độ phức tạp trung bình thuật toán O(N * N/2) = O(N2/2) = O(N2) 92 7.2.2 Sắp xếp chèn Giải thuật coi dãy chia làm phần Phần đầu phần tử Từ phần tử tiếp theo, chèn vào vị trí thích hợp nửa cho Để chèn phần tử vào nửa sắp, cần dịch chuyển phần tử lớn sang trái vị trí đưa phần tử vào vị trí trống dãy Ví dụ, nửa dãy là: 06 17 49 98 Để chèn phần tử 32 vào nửa dãy này, ta tiến hành dịch chuyển phần tử lớn 32 bên trái vị trí: 06 17 49 98 Sau đó, chèn 32 vào vị trí trống nửa dãy: 06 17 32 49 98 Quay trở lại với dãy số phần trước, bước thực xếp chèn dãy sau: Dãy ban đầu: Nữa trống, nửa chưa toàn dãy 32 17 49 98 06 25 53 61 Bước 1: Chèn phần tử đầu nửa chưa 32 vào nửa Do nửa trống nên chèn vào vị trí 32 17 49 98 Đã 06 25 53 61 Chưa Bước 2: Chèn phần tử 17 vào nửa Dịch chuyển 32 sang phải vị trí đưa 17 vào vị trí trống 17 32 49 98 06 Đã 25 Chưa 93 53 61 Bước 3, 4: Lần lượt chèn phần tử 49, 98 vào nửa 17 32 49 98 06 Đã 25 53 61 Chưa Bước 5: Chèn phần tử 06 vào nửa Dịch chuyển phần tử 17, 32, 49, 98 sang phải vị trí đưa 06 vào vị trí trống 06 17 32 49 98 25 Đã 53 61 Chưa Bước 6: Chèn phần tử 25 vào nửa Dịch chuyển phần tử 32, 49, 98 sang phải vị trí đưa 25 vào vị trí trống 06 17 25 32 49 98 Đã 53 61 Chưa Bước 7: Chèn phần tử 53 vào nửa Dịch chuyển phần tử 98 sang phải vị trí đưa 53 vào vị trí trống 06 17 25 32 49 53 98 Đã 61 Chưa Bước 8: Chèn phần tử cuối 61 vào nửa Dịch chuyển phần tử 98 sang phải vị trí đưa 61 vào vị trí trống 06 17 25 32 49 Đã Thủ tục thực xếp chèn C sau: void insertion_sort(){ int i, j, k, temp; for (i = 1; i< N; i++){ temp = a[i]; j=i-1; 94 53 61 98 while ((a[j] > temp)&&(j>=0)) { a[j+1]=a[j]; j ; } a[j+1]=temp; } } Thuật tốn sử dụng vịng lặp Vịng lặp ngồi duyệt khoảng N lần, vịng lặp duyệt trung bình N/4 lần (giả sử duyệt đến nửa gặp vị trí cần chèn) Do đó, độ phức tạp trung bình thuật tốn O(N2/4) = O(N2) 7.2.3 Sắp xếp bọt Giải thuật xếp bọt thực theo nguyên tắc: Duyệt nhiều lần từ cuối lên đầu dãy, tiến hành đổi chỗ phần tử liên tiếp chúng ngược thứ tự Đến bước đó, khơng có phép đổi chỗ xảy tồn dãy Như vậy, sau lần duyệt đầu tiên, phần tử nhỏ dãy đổi chỗ cho phần tử lớn “nổi” lên đầu dãy Lần duyệt thứ 2, phần tử nhỏ thứ lên vị trí thứ nhì dãy v.v Chu ý rằng, không thiết phải tiến hành tất N lần duyệt, mà tới lần duyệt đó, khơng cịn phép đổi chỗ xảy tức tất phần tử nằm thứ tự toàn dãy Với dãy số phần trước, bước tiến hành giải thuật xếp bọt dãy sau: Bước 1: Tại bước này, duyệt từ cuối dãy lên, xuất cặp ngược thứ tự (06, 98), (06, 49), (06, 17), (06, 32) Phần tử 06 “nổi” lên đầu dãy 32 32 32 32 06 17 17 17 06 32 49 49 06 17 17 98 06 49 49 49 06 98 98 98 98 25 25 25 25 25 53 53 53 53 53 61 61 61 61 61 Bước 2: Duyệt từ cuối dãy lên, xuất cặp ngược thứ tự (25, 98), (25, 49), (17, 32) Phần tử 17 lên vị trí thứ 95 06 06 06 06 32 32 32 17 17 17 17 32 49 49 25 25 98 25 49 49 25 98 98 98 53 53 53 53 61 61 61 61 Bước 3: Duyệt từ cuối dãy lên, xuất cặp ngược thứ tự (53, 98), (25, 32) Phần tử 25 lên vị trí thứ 06 06 06 17 17 17 32 32 25 25 25 32 49 49 49 98 53 53 53 98 98 61 61 61 Bước 4: Duyệt từ cuối dãy lên, xuất cặp ngược thứ tự (61, 98) 06 06 17 17 25 25 32 32 49 49 53 53 98 61 61 98 96 Bước 5: Duyệt từ cuối dãy lên, khơng cịn xuất cặp ngược Toàn dãy Thủ tục thực xếp bọt C sau: void bubble_sort(){ int i, j, temp, no_exchange; i = 1; do{ no_exchange = 1; for (j=n-1; j >= i; j ){ if (a[j-1] > a[j]){ temp=a[j-1]; a[j-1]=a[j]; a[j]=temp; no_exchange = 0; } } i++; } until (no_exchange || (i == n-1)); } Lần duyệt đầ u tiên cần khoảng N-1 phép so sánh đổi chỗ để làm phần tử nhỏ lên đầu Lần duyệt thứ cần khoảng N-2 phép toán, v.v Tổng cộng, số phép so sánh cần thực là: (N-1) + (N-2) + … + + = N(N-1)/2 Như vậy, độ phức tạp giải thuật xếp bọt O(N2) 7.3 QUICK SORT 7.3.1 Giới thiệu Quick sort thuật toán xếp phát minh lần đầu C.A.Hoare vào năm 1960 Đây có lẽ thuật toán nghiên cứu nhiều sử dụng rộng rãi lớp thuật toán xếp Quick sort thuật toán dễ cài đặt, hiệu hầu hết trường hợp, tiêu tốn tài nguyên so với thuật tốn khác Độ phức tạp trung bình giải thuật O(NlogN) Nhược điểm giải thuật phải cài đặt đệ qui (có thể khơng dùng đệ qui, nhiên cài đặt phức tạp nhiều) trường hợp xấu độ phức tạp O(N2) Ngồi ra, cài đặt cho Quick sort phải địi hỏi xác Chỉ cần sai sót nhỏ làm cho chương trình ngừng hoạt động Kể từ Quick sort đời lần đầu tiên, có nhiều nỗ lực nhằm cải tiến thuật toán Tuy nhiên, hầu hết cải tiến khơng mang lại hiệu mong đợi, thân Quick sort thuật toán cần Một cải tiến phần thuật tốn dẫn đến tác dụng ngược lại phần làm cho thuật toán trở nên cân 97 Ý tưởng Quick sort dựa phương pháp chia để trị trình bày chương Giải thuật chia dãy cần thành phần, sau thực việc xếp cho phần độc lập với Để thực điều này, chọn ngẫu nhiên phần tử dãy làm khóa Trong bước tiếp theo, phần tử nhỏ khoá phải xếp vào phía trước khố phần tử lớn xếp vào phía sau khố Để có phân loại này, phần tử so sánh với khố hốn đổi vị trí cho cho khố lớn khóa mà lại nằm trước nhỏ khoá mà lại nằm sau Khi lượt hốn đổi thực xong dãy chia thành đoạn: đoạn bao gồm phần tử nhỏ khố, đoạn cịn lại bao gồm phần tử lớn khố Khố Hình 7.1 Quick sort Áp dụng kỹ thuật cho đoạn tiếp tục làm đoạn cịn phần tử Khi toàn dãy 7.3.2 Các bước thực giải thuật Để chia dãy thành phần thoả mãn yêu cầu trên, ta lấy phần tử dãy làm khoá (chẳng hạn phần tử đầu tiên) Tiến hành duyệt từ bên trái dãy dừng lại gặp phần tử lớn khoá Đồng thời tiến hành duyệt từ bên phải dãy gặp phần tử nhỏ khoá Rõ ràng phần tử nằm vị trí khơng phù hợp chúng cần phải đổi chỗ cho Tiếp tục trình biến duyệt gặp nhau, ta chia dãy thành nửa: Nửa bên phải khoá bao gồm phần tử lớn khoá nửa bên trái phần tử nhỏ khố Ta xem xét q trình phân đơi dãy số cho phần trước 32 17 49 98 06 98 25 53 61 27 Một từ hiểu dãy ký tự không chứa khoảng trống, dấu tab, dấu xuống dòng dấu đầu dòng Ta nói, từ X nối với từ Y ký tự từ X trùng với ký tự cuối từ Y (Ví dụ từ X = ”ABC” nối với từ Y =”EFA”) u cầu: Cho xâu ký tự S có khơng 80 từ (các từ S lặp lại) Hãy cho biết nối tất từ S để tạo nên từ theo ngun tắc nêu hay khơng? Input: Dịng ghi số test, không lớn 100 Mỗi test xâu ký tự S viết dòng Output: Viết dòng giá trị “YES” “NO” ta thực không thực yêu cầu đặt tốn Ví dụ cho Input Output: INPUT OUTPUT YES NO ABC DEA ABC EAD DEA EAD ABC ABD ABF ABG ADH ADA 28 Cho hệ thống giao thông gồm N điểm (N250) Biết hai điểm hệ thống có đường trực tiếp gián tiếp thông qua điểm trung gian Hãy cho biết ta định chiều lại tồn hệ thống giao thông cho hai điểm hệ thống tồn đường chiều hay khơng? Input: Dịng ghi số test, không lớn 100 Mỗi test tổ chức sau:  Dòng thứ ghi lại số N số điểm node giao thông hệ thống;  N dòng ghi lại ma trận vuông A = (aij) cấp N biểu diễn hệ thống giao thơng Trong đó, aij = khơng có đường trực tiếp từ điểm i đến j, aij = có đường trực tiếp từ điểm i đến j Output: Với test, viết dòng giá trị “YES” hệ thống giao thơng định chiều được, giá trị “NO” hệ thống giao thông định chiều Ví dụ cho Input Output: 168 INPUT OUTPUT NO YES 1 0 1 0 1 1 1 0 0 0 1 1 1 0 1 1 29 Số Nnguyên hệ số ACM số nguyên thông thường sử dụng ký hiệu từ 0, 1, ,9 làm ký hiệu hệ đếm (Ví dụ số 719ACM) Nguyên tắc chung để đổi số A =(a1, a2, ,aN) hệ số ACM sang số hệ số 10 thực sau: N K 10   * (i!) , chữ số vị trí thứ i hệ số ACM i 1 Ví dụ: A = 719ACM = 9.(1!) + 1.(2!) + 7.(3!) = 5310 Nhiệm vụ bạn viết chương trình đọc số nguyên hệ số ACM đổi số thành số hệ số 10 Dữ liệu vào: Dữ liệu vào gồm nhiều liệu tương ứng với nhiều test Dòng chứa số nguyên không lớn 100 số lượng liệu Những dòng chứa liệu Mỗi liệu viết dòng Mỗi dòng viết số nhỏ 232 số hệ số ACM Dữ liệu ra: Với liệu, ghi dòng số chuyển đổi Ví dụ liệu vào Ví dụ liệu 169 53 719 1 15 110 102 170 30 Cho hệ thống giao thông gồm N điểm Biết hai điểm hệ thống tồn đường trực tiếp gián tiếp thông qua số điểm trung gian Ta gọi điểm giao thông s điểm thắt cặp nút giao thông u, v đường từ s đến t phải qua s Ví dụ với cặp nút 1, hệ thống giao thông gồm điểm có đỉnh thắt s = s =4 Nhiệm vụ bạn viết chương trình tìm số lượng đỉnh thắt s cặp điếm u, v hệ thống giao thông Dữ liệu vào: Dữ liệu vào gồm nhiều liệu tương ứng với nhiều test Dòng chứa số nguyên không lớn 100 số lượng liệu Các dòng chứa liệu Mỗi liệu gồm nhóm dịng theo khn dạng:  Dịng chứa số nguyên N, M, u, v ( u, v, N100; M1000)  M dòng sau, dòng ghi lại đường nối trực tiếp cặp điểm (i, j) hệ thống giao thông (1i,jN) Dữ liệu ra: Với liệu, ghi dòng số số lượng đỉnh thắt cặp điểm u, v test Ví dụ liệu vào Ví dụ liệu 171 2 2 3 4 3 4 31 Cho chuỗi gồm n bít X = (x1, x2, , xn) Ta gọi K tổng bít liền kề chuỗi X ( ký hiệu AdjBC(X)) tính tốn sau: n 1 K   xi xi 1 ; i 1 Ví dụ : AdjBC(011101101) = AdjBC(111101101) = AdjBC(010101010) = Viết chương trình tìm số chuỗi bít có độ dài N có tổng bít liền kề K Ví dụ với N = 5, ta có chuỗi có tổng bít liền kề sau: 11100, 01110, 00111, 10111, 11101, 11011 Input:  Dòng ghi lại số tự nhiên T số test tốn;  T dịng kế tiếp, dịng ghi lại test Mỗi test ghi lại cặp ba số i, N, K Trong đó, i số thứ tự test, N độ dài chuỗi bít, K tổng bít liền kề Các số ghi cách vài khoảng trống Output: 172  Ghi lại số hiệu test số bít liền kề thỏa mãn u cầu tốn dịng Hai số viết cách vào khoảng trống InputB: OutputB: 10 2 63426 20 1861225 30 17 1682122501 40 24 44874764 50 37 160916 60 52 22937308 70 59 99167 80 73 15476 90 84 10 23076518 10 100 90 32 Cho dãy A[] gồm N số tự nhiên khác số tự nhiên K Hãy sử dụng thuật tốn sinh viết chương trình liệt kê tất dãy dãy số A[] cho tổng phần tử dãy K Dữ liệu vào cho file dayso.in theo khuôn dạng sau:  Dòng ghi lại số tự nhiên N số số dãy số A[] số tự nhiên K, hai số viết cách vài khoảng trống;  Dòng ghi lại N số dãy số A[], hai số viết cách vài khoảng trống Các dãy thoả mãn điều kiện tìm ghi lại file ketqua.out theo khn dạng sau:  Dịng ghi lại số dãy có tổng phần tử K tìm được;  Những dịng dòng ghi lại dãy Hai phần tử khác dãy viết cách vài khoảng trống Ví dụ minh hoạ cho file dayso.in ketqua.out toán Dayso.in Ketqua.out 50 10 15 20 25 10 15 25 20 25 10 15 173 20 33 Cho dãy A[] gồm N số tự nhiên khác số tự nhiên K Hãy sử dụng thuật tốn quay lui viết chương trình liệt kê tất dãy dãy số A[] cho tổng phần tử dãy K Dữ liệu vào cho file dayso.in theo khuôn dạng sau:  Dòng ghi lại số tự nhiên N số số dãy số A[] số tự nhiên K, hai số viết cách vài khoảng trống;  Dòng ghi lại N số dãy số A[], hai số viết cách vài khoảng trống Các dãy thoả mãn điều kiện tìm ghi lại file ketqua.out theo khn dạng sau:  Dịng ghi lại số dãy có tổng phần tử K tìm được;  Những dịng dòng ghi lại dãy Hai phần tử khác dãy viết cách vài khoảng trống Ví dụ minh hoạ cho file dayso.in ketqua.out toán Dayso.in 50 10 Ketqua.out 15 20 25 10 15 25 20 25 10 15 20 34 Cho dãy A[] gồm N số tự nhiên khác số tự nhiên K Hãy sử dụng thuật toán quay nhánh cận viết chương trình liệt kê tất dãy dãy số A[] cho tổng phần tử dãy K Dữ liệu vào cho file dayso.in theo khuôn dạng sau:  Dòng ghi lại số tự nhiên N số số dãy số A[] số tự nhiên K, hai số viết cách vài khoảng trống;  Dòng ghi lại N số dãy số A[], hai số viết cách vài khoảng trống Các dãy thoả mãn điều kiện tìm ghi lại file ketqua.out theo khn dạng sau:  Dịng ghi lại số dãy có tổng phần tử K tìm được;  Những dịng dòng ghi lại dãy Hai phần tử khác dãy viết cách vài khoảng trống Ví dụ minh hoạ cho file dayso.in ketqua.out toán Dayso.in 50 Ketqua.out 174 10 15 20 25 10 15 25 20 25 10 15 20 35 Cho dãy gồm N số nguyên phân biệt A[] = {a1, a2, , aN } số tự nhiên K ( KN100) Hãy sử dụng thuật toán sinh viết chương trình liệt kê tất dãy K phần tử tăng dần tự nhiên dãy số A[] Dữ liệu vào cho file dayso.in theo khuôn dạng sau:  Dòng ghi lại hai số tự nhiên N, K Hai số viết cách vài khoảng trống;  Những dòng ghi lại N số nguyên dãy số A[], hai số khác viết cách vài khoảng trống Các dãy K phần tử tăng dần dãy số A[] tìm ghi lại file ketqua.out theo khn dạng:  Dòng ghi lại số tự nhiên M số dãy K phần tử tăng dần dãy số A[] tìm được;  M dịng kế tiếp, dòng ghi lại dãy Hai phần tử khác dãy viết cách vài khoảng trống Ví dụ với file dayso.in cho ta file ketqua.out tương ứng dayso.in 5 ketqua.out 15 10 20 15 10 20 15 20 10 20 15 20 10 20 36 Cho dãy gồm N số nguyên phân biệt A[] = {a1, a2, , aN } số tự nhiên K ( KN100) Hãy sử dụng thuật toán sinh viết chương trình liệt kê tất dãy K phần tử tăng dần tự nhiên dãy số A[] Dữ liệu vào cho file dayso.in theo khuôn dạng sau:  Dòng ghi lại hai số tự nhiên N, K Hai số viết cách vài khoảng trống;  Những dòng ghi lại N số nguyên dãy số A[], hai số khác viết cách vài khoảng trống 175 Các dãy K phần tử tăng dần dãy số A[] tìm ghi lại file ketqua.out theo khn dạng:  Dịng ghi lại số tự nhiên M số dãy K phần tử tăng dần dãy số A[] tìm được;  M dòng kế tiếp, dòng ghi lại dãy Hai phần tử khác dãy viết cách vài khoảng trống Ví dụ với file dayso.in cho ta file ketqua.out tương ứng dayso.in 5 ketqua.out 15 10 20 15 10 20 15 20 10 20 15 20 10 20 37 Cho ma trận vuông C = (cij) cấp N (1 i, j  N100) gồm N2 số tự nhiên (các số không thiết phải khác nhau) ghi lại file matran.in theo khuôn dạng sau :  Dòng ghi lại số tự nhiên N cấp ma trận vuông C;  N dịng ghi lại ma trận vng C = (cij) Hai phần tử khác ma trận ghi cách vài khoảng trống Hãy sử dụng thuật tốn sinh thích hợp viết chương trình lấy hàng, cột phần tử ma trận C cho tổng phần tử nhỏ Kết tìm ghi lại file ketqua.out theo khn dạng:  Dịng ghi lại tổng giá trị nhỏ N phần tử tìm được;  N dịng kế tiếp, dịng ghi lại ba số i, j, cij tương ứng với số hàng, số cột giá trị phần tử tương ứng ma trận Ba số viết cách vài khoảng trống Ví dụ file matran.in ketqua.out: matran.in ketqua.out 82 10 64 57 29 18 15 1 10 34 20 19 30 16 12 12 176 57 49 40 16 11 19 16 29 21 46 26 21 18 21 28 16 11 21 21 37 11 15 12 15 48 37 30 12 38 Cho ma trận vuông C = (cij) cấp N (1 i, j  N100) gồm N2 số tự nhiên (các số không thiết phải khác nhau) ghi lại file matran.in theo khuôn dạng sau :  Dòng ghi lại số tự nhiên N cấp ma trận vng C;  N dịng ghi lại ma trận vuông C = (cij) Hai phần tử khác ma trận ghi cách vài khoảng trống Hãy sử dụng thuật tốn quay lui viết chương trình lấy hàng, cột phần tử ma trận C cho tổng phần tử nhỏ Kết tìm ghi lại file ketqua.out theo khn dạng:  Dịng ghi lại tổng giá trị nhỏ N phần tử tìm được;  N dòng kế tiếp, dòng ghi lại ba số i, j, cij tương ứng với số hàng, số cột giá trị phần tử tương ứng ma trận Ba số viết cách vài khoảng trống Ví dụ file matran.in ketqua.out: matran.in ketqua.out 82 10 64 57 29 18 15 1 10 34 20 19 30 16 12 12 57 49 40 16 11 19 16 29 21 46 26 21 18 21 28 16 11 21 21 37 11 15 12 15 48 37 30 12 39 Cho ma trận vuông C = (cij) cấp N (1 i, j  N100) gồm N2 số tự nhiên (các số không thiết phải khác nhau) ghi lại file matran.in theo khn dạng sau :  Dịng ghi lại số tự nhiên N cấp ma trận vng C;  N dịng ghi lại ma trận vuông C = (cij) Hai phần tử khác ma trận ghi cách vài khoảng trống Hãy sử dụng thuật toán nhánh cận viết chương trình lấy hàng, cột phần tử ma trận C cho tổng phần tử nhỏ Kết tìm ghi lại file ketqua.out theo khn dạng: 177  Dòng ghi lại tổng giá trị nhỏ N phần tử tìm được;  N dòng kế tiếp, dòng ghi lại ba số i, j, cij tương ứng với số hàng, số cột giá trị phần tử tương ứng ma trận Ba số viết cách vài khoảng trống Ví dụ file matran.in ketqua.out: matran.in ketqua.out 82 10 64 57 29 18 15 1 10 34 20 19 30 16 12 12 57 49 40 16 11 19 16 29 21 46 26 21 18 21 28 16 11 21 21 37 11 15 12 15 48 37 30 12 40 Cho dãy gồm N số nguyên phân biệt A[] = {a1, a2, , aN } số tự nhiên K ( KN100) Hãy sử dụng thuật tốn sinh viết chương trình liệt kê tất dãy K phần tử giảm dần dãy số A[] Dữ liệu vào cho file dayso.in theo khn dạng sau:  Dịng ghi lại hai số tự nhiên N, K Hai số viết cách vài khoảng trống  Những dòng ghi lại N số nguyên dãy số A[], hai số khác viết cách vài khoảng trống Các dãy K phần tử giảm dần dãy số A[] tìm ghi lại file ketqua.out theo khn dạng:  Dịng ghi lại số tự nhiên M số dãy K phần tử giảm dần dãy số A[] tìm được;  M dịng kế tiếp, dịng ghi lại dãy Hai phần tử khác dãy viết cách vài khoảng trống Ví dụ với file dayso.in cho ta file ketqua.out tương ứng dayso.in 20 10 ketqua.out 15 20 10 20 10 20 15 20 15 20 178 10 15 41 Cho dãy gồm N số nguyên phân biệt A[] = {a1, a2, , aN } số tự nhiên K ( KN100) Hãy sử dụng thuật tốn quay lui viết chương trình liệt kê tất dãy K phần tử giảm dần dãy số A[] Dữ liệu vào cho file dayso.in theo khn dạng sau:  Dịng ghi lại hai số tự nhiên N, K Hai số viết cách vài khoảng trống  Những dòng ghi lại N số nguyên dãy số A[], hai số khác viết cách vài khoảng trống Các dãy K phần tử giảm dần dãy số A[] tìm ghi lại file ketqua.out theo khn dạng:  Dịng ghi lại số tự nhiên M số dãy K phần tử giảm dần dãy số A[] tìm được;  M dịng kế tiếp, dịng ghi lại dãy Hai phần tử khác dãy viết cách vài khoảng trống Ví dụ với file dayso.in cho ta file ketqua.out tương ứng dayso.in 20 10 ketqua.out 15 20 10 20 10 20 15 20 15 20 10 15 42 Cho ma trận vuông C = (cij) cấp N (1 i, j  N100) gồm N2 số tự nhiên (các số không thiết phải khác nhau) ghi lại file matran.in theo khn dạng sau :  Dịng ghi lại số tự nhiên N cấp ma trận vng C;  N dịng ghi lại ma trận vuông C = (cij); Hai phần tử khác ma trận ghi cách vài khoảng trống Hãy sử dụng thuật toán sinh (quay lui, nhánh cận, qui hoạch động) viết chương trình lấy hàng, cột phần tử ma trận C cho tổng phần tử lớn Kết tìm ghi lại file ketqua.out theo khn dạng:  Dịng ghi lại tổng giá trị nhỏ N phần tử tìm được; 179  N dịng kế tiếp, dịng ghi lại ba số i, j, cij tương ứng với số hàng, số cột giá trị phần tử tương ứng ma trận Ba số viết cách vài khoảng trống Ví dụ file viec.in ketqua.out: matran.in ketqua.out 238 10 14 27 29 18 27 27 34 20 19 34 16 12 34 57 37 40 57 11 19 57 29 21 46 26 21 18 46 27 37 11 21 21 37 37 55 12 15 48 37 35 37 43 Cho dãy AN = {a1, a2, ,aN} gồm N số tự nhiên phân biệt Hãy sử dụng thuật toán sinh (quay lui, nhánh cận, qui hoạch động) viết chương trình liệt kê tất dãy K phần tử dãy số AN (KN) cho tổng phần tử dãy số B Dữ liệu vào cho file dayso.in theo khn dạng sau:  Dịng ghi lại ba số N, K, B Các số ghi cách vài khoảng trống;  Những dòng ghi lại N số dãy số AN Hai số khác ghi cách vài khoảng trống Các dãy tìm ghi lại file ketqua.out theo khn dạng sau:  Dịng ghi lại số dãy tìm được;  Những dịng kế tiếp, dòng ghi lại dãy thỏa mãn điều kiện Hai số khác ghi cách vài khoảng trống Ví dụ minh họa cho khuôn dạng file dayso.in ketqua.out dayso.in ketqau.out 50 10 15 20 25 20 25 10 15 25 48 Cho file liệu trungto.in theo khn dạng sau:  Dịng ghi lại số tự nhiên N số biểu thức số học biểu diễn dạng trung tố;  N dòng kế tiếp, dòng ghi lại biểu thức trung tố 180 Hãy sử dụng cấu trúc liệu kiểu ngăn xếp viết chương trình dịch chuyển biểu thức trung tố file trungto.in thành file hauto.out Các biểu thức hậu tố dịch chuyển ghi lại file hauto.out theo khn dạng sau:  Dịng ghi lại số tự nhiên N số biểu thức hậu tố dịch chuyển được;  N dòng kế tiếp, dòng ghi lại biểu thức hậu tố Ví dụ minh họa cho file trungto.in hauto.out trungto.in hauto.out 4 (a+b) ab+ (a-b) ab– (a/b) ab/ (a*b) ab* 49 Cho file liệu hauto.in theo khn dạng sau:  Dịng ghi lại số tự nhiên N số biểu thức số học biểu diễn dạng hậu tố;  N dòng kế tiếp, dòng ghi lại biểu thức hậu tố Hãy sử dụng cấu trúc liệu kiểu ngăn xếp viết chương trình tính tốn giá trị biểu thức hậu tố file hauto.in Các biểu thức hậu tố dịch chuyển ghi lại file ketqua.out theo khn dạng sau:  Dịng ghi lại số tự nhiên N số biểu thức hậu tố;  N dòng kế tiếp, dòng ghi lại giá trị biểu thức hậu tố file Ví dụ minh họa cho file hauto.in ketqua.out hauto.in ketqua.out 4 + – / * 181 TÀI LIỆU THAM KHẢO [1] Aho, Hopcroft & Ullman, Data Structures and Algorithms,Addison Wesley, 2001 [2] Robert Sedewick, Algorithms in Java Third Edition,Addison Wesley, 2002 [3] Niklaus Wirth, Data Structures and Algorithms,Prentice Hall, 2004 [4] Robert Sedewick, Algorithms,Addison Wesley, 1983 [5] Bruno R Preiss, Data Structures and Algorithms with Object-Oriented Design, Jon Wiley & Sons, 1998 182 ... bình thuật tốn O(N * N /2) = O(N2 /2) = O(N2) 92 7 .2. 2 Sắp xếp chèn Giải thuật coi dãy chia làm phần Phần đầu phần tử Từ phần tử tiếp theo, chèn vào vị trí thích hợp nửa cho Để chèn phần tử vào... (25 , 32) Phần tử 25 lên vị trí thứ 06 06 06 17 17 17 32 32 25 25 25 32 49 49 49 98 53 53 53 98 98 61 61 61 Bước 4: Duyệt từ cuối dãy lên, xuất cặp ngược thứ tự (61, 98) 06 06 17 17 25 25 32 32. .. 49), (06, 17), (06, 32) Phần tử 06 “nổi” lên đầu dãy 32 32 32 32 06 17 17 17 06 32 49 49 06 17 17 98 06 49 49 49 06 98 98 98 98 25 25 25 25 25 53 53 53 53 53 61 61 61 61 61 Bước 2: Duyệt từ cuối

Ngày đăng: 01/03/2022, 09:35

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

Tài liệu liên quan