Phương pháp sinh và thuạt toán quay lùi

48 127 0
Phương pháp sinh và thuạt toán quay lùi

Đ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

PHƯƠNG PHÁP SINH Nội dung  Bài toán tổ hợp  Phương pháp sinh Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT  Bài toán Cho tập hợp gồm n phần tử X = { X1, X2, , Xn } Hãy liệt kê tất tập tập  Các tập gồm có : { X1 } , { X1, X2 } , { X1, X3 }, { X1,X2, ,Xn } Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT Phân tích tốn  Để biểu diễn tập Y X Ta dùng xâu nhị phân Bn = { B1,B2, ,Bn } cho Bi = Xi Y, ngược lại Bi = Xi  Y  Ví dụ dãy 0011 Thể cho tập Y = {X3, X4} phần tử B3 B4 có giá trị  Khi để giải tốn liệt kê tất tập X, ta quy toán liệt kê tất xâu nhị phân có kích thước n  Số xâu nhị phân 2n Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT Nhận xét  Một dãy nhị phân x độ dài n VD: x = 101111 n=6 Là biểu diễn số nguyên p(x) đoạn [0, 2n-1]  Do số dãy nhị phân độ dài n số số nguyên  [0, 2n-1] = 2n  Mục tiêu tốn lập chương trình liệt kê dãy nhị phân n phần tử theo thứ tự từ điển, có nghĩa liệt kê dãy nhị phân biểu diễn số nguyên theo thứ tự 0, 1, , 2n-1 Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT  Ví dụ n = 6: Dãy có: Cộng thêm 1: Dãy mới: 010000 +1 010001 Dãy có: 010111 Cộng thêm 1: Dãy mới: +1 011000  Kỹ thuật sinh cấu hình từ cấu hình mơ tả sau: - Xét từ cuối dãy lên tìm số - Nếu tìm thấy thay số số đặt tất phần tử phía sau vị trí - Nếu khơng tìm thấy dãy chứa tồn số 1, cấu hình cuối Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT Chương trình minh họa 1: int stop; // biến toàn cục void Next_BS(int B[MAX], int n) // Hàm phát sinh chuỗi { int i = n; // duyệt từ cuối while ( i>0 && B[i] ) // lặp chưa tìm thấy B[i] ==0 { B[i] = 0; // gán bit sau i ; // giảm trước 10 } 11 if (i==0 ) stop = 1; // cấu hình cuối nên khơng tìm // B[i] = -> dừng 12 else 13 B[i] = 1; // gán cho B[i] 14 } Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT                 void Generate( int B[MAX], int n ) // Hàm sinh chuỗi nhị phân { Stop = 0; while (! Stop) { Result(B,n); // xuất chuỗi nhị phân Next_BS(B,n); // chuỗi nhị phân } } void Result ( int B[MAX], int n ) { int count=0; printf (“\n Xau nhi phan thu %d”, ++count ) ; for( int i=0; i < n; i++ ) printf(“%3d”, B[i]); } Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT  int main() {  int i, B[MAX], n ;  printf( “ Nhap n: ”); scanf(“%d”,&n);  for(i=0; i< n; i++)  B[i] =0;  Generate(B, n);  getch();  return 0; }   Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT Bài tốn tổ hợp  Có n biến x1, x2, x3, , xn  Mỗi biến xi mang trị thuộc tập hợp Pi  Miền trị tốn tập tích P1 x P2 x P3 x x Pn  Phép gán trị (assignment): Là trị a1, a2, a3, , an Trong xi   Pi  Một lời giải toán phép gán trị  Một phép gán trị gọi cấu hình Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 10 Bài toán tập k-phần tử  Tập đầu: { 1,2,3, ,k } Thí dụ { 1,2,3 } với k=3, n=5  Tập cuối:{ (n-k+1), (n-k+2) , , n } Thí dụ: { 3,4,5 } với k=3, n=5 Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 34 Bài toán tập k-phần tử  Cách sinh tập từ tập có a1 a2 a3 a4 ak , số từ (1) Tìm vị trí từ bên phải vị trí i cho a[i] ≠ n-k+i i=k; while (a[i]==n-k+i) i ; (2) Thay a[i] a[i] +1 a[i]= a[i] + 1; (3) Thay trị sau i (a[j]) trị a[i]+j-i , for (j=i+1;j= số sau Ngược thứ tự từ điển Tại thời điểm, số phần tử k Bắt đầu: k=1, kết thúc: k=n Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 61 52 511 43 421 4111 331 322 3211 31111 2221 22111 211111 1111111 39 Bài toán chia số nguyên n= 20 , trạng thái k=15 541111111111111 //số phải giảm 4, số >1 từ bên phải, vị trí i=2 //với số từ 1, giảm trị đơn vị 53 // số trị phải chia lại 14 = số trị bên phải +1 //= k-i+1=15-2+1=14 //Số chia từ a[2]=3, 14/3 lần trị thêm vào // 3, dư 3 3 ( k=i+SốLầnBằngTrị) 3 3 //thêm phần dư vào cuối (k++) Đây trạng thái kế tiếp- xong Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 40 Bài toán chia số nguyên Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 41 Bài tốn chia số ngun Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 42 Bài toán chia số nguyên Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 43 Bài tốn chia số ngun Thêm dịng: delete[ ] vars; Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 44 Bài tốn chia số ngun Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 45 Xin cám ơn Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 46 Tài liệu tham khảo  Giáo trình mơn học kỹ thuật lập trình nâng cao – Ths Nguyễn Hà Giang  Slide Kỹ thuật lập trình nâng cao – Ths Thân Văn Sử  Slide Kỹ thuật lập trình nâng cao – GV Mai Ngọc Thu  Slide Kỹ thuật lập trình nâng cao –Ths Văn Thiên Hồng Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 47 Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 48 ... k =1, kết thúc: k=n Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT 61 52 511 43 4 21 411 1 3 31 322 3 211 311 11 22 21 2 211 1 211 111 11 111 11 39 Bài toán chia số nguyên n= 20 , trạng thái k =15 5 411 111 111 111 11. .. 0000 00 01 0 010 0 011 010 0 010 1 011 0 011 1 p(b) vars 10 00 10 01 1 010 10 11 110 0 11 01 111 0 11 11 Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT p(b) 10 11 12 13 14 15 Với thứ tự từ điển, tập sau lớn tập... theo thứ tự 0, 1, , 2n -1 Kỹ thuật lập trình - Nguyễn Thúy Loan- KCNTT  Ví dụ n = 6: Dãy có: Cộng thêm 1: Dãy mới: 010 000 +1 010 0 01 Dãy có: 010 111 Cộng thêm 1: Dãy mới: +1 011 000  Kỹ thuật

Ngày đăng: 01/08/2020, 02:28

Mục lục

    Phân tích bài toán

    Bài toán tổ hợp

    Thứ tự từ điển

    Thuật toán sinh tổng quát

    Bài toán chuỗi 3 ký tự

    Bài toán n ký tự

    Bài toán liệt kê các tập con của 1 tập gồm n phần tử

    Bài toán liệt kê các hoán vị

    Bài toán tập con k-phần tử

    Bài toán chia số nguyên

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

Tài liệu liên quan