backtrack là gì

Đã đăng nhập thg 7 27, 2017 4:42 CH

4 phút đọc

Bạn đang xem: backtrack là gì

Quay lùi là 1 kinh nghiệm kiến thiết giải thuật dựa vào đệ quy. Ý tưởng của con quay lùi là dò la câu nói. giải từng bước, từng bước lựa chọn một trong các số những lựa lựa chọn khả dĩ và đệ quy. Người thứ nhất đưa ra thuật ngữ này (backtrack) là mái ấm toán học tập người Mỹ D. H. Lehmer nhập trong thời hạn 1950.

Tư tưởng

Dùng nhằm giải vấn đề liệt kê những thông số kỹ thuật. Mỗi thông số kỹ thuật được thiết kế vị từng thành phần. Mỗi thành phần lại được lựa chọn bằng phương pháp test toàn bộ những năng lực.

Các bước trong các việc liệt kê thông số kỹ thuật dạng X[1...n]:

  • Xét toàn bộ những độ quý hiếm X[1] rất có thể nhận, test X[1] nhận những độ quý hiếm bại liệt. Với từng độ quý hiếm của X[1] tao sẽ:
  • Xét toàn bộ độ quý hiếm X[2] rất có thể nhận, lại test X[2] cho những độ quý hiếm bại liệt. Với từng độ quý hiếm X[2] lại xét năng lực độ quý hiếm của X[3]...kế tiếp như thế cho đến bước:
  • ...
  • ....
  • Xét toàn bộ độ quý hiếm X[n] rất có thể nhận, test mang lại X[n] nhận theo lần lượt độ quý hiếm bại liệt.
  • Thông báo thông số kỹ thuật tìm ra.

Bản hóa học của con quay lùi là 1 quy trình dò la kiếm theo hướng sâu(Depth-First Search).

Xem thêm: bring around là gì

Mô hình thuật toán

  • Mã fake mang lại thuật toán con quay lùi.
Backtracking(k) {
	for([Mỗi phương án lựa chọn i(thuộc tập dượt D)]) {
		if ([Chấp nhận i]) {
			[Chọn i mang lại X[k]];
			if ([Thành công]) {
				[Đưa rời khỏi kết quả];
			} else {
				Backtracking(k+1);
				[Bỏ lựa chọn i mang lại X[k]];
			}
		}
	}
}

Ví dụ: Trò nghịch tặc Sudoku

Sudoku là 1 trò nghịch tặc khá thịnh hành và chắc chắn người nào cũng biết. Trò nghịch tặc như sau: mang 1 hình vuông vắn được phân thành 9x9 dù vuông con cái. Mỗi dù vuông con cái có mức giá trị trong tầm từ là một cho tới 9. Ban đầu hình vuông vắn đem một số trong những dù vuông con cái mang lại trước (có điền sẵn số) và sót lại là trống rỗng. Hãy điền những số kể từ 1-9 nhập những dù con cái lại sao cho: sản phẩm ngang là những số không giống nhau từ là một cho tới 9, sản phẩm dọc là những số không giống nhau từ là một cho tới 9, và từng khối 3x3 đó là những số không giống nhau từ là một cho tới 9. Sau đấy là 1 ví dụ về đề bài xích và câu nói. giải:

Áp dụng con quay lùi nhằm giải vấn đề sudoku. Ý tưởng: Mỗi bước dò la tập dượt những độ quý hiếm khả dĩ nhằm điền nhập dù trống rỗng, và tiếp sau đó đệ quy nhằm điền dù tiếp theo sau. Giả mã của thuật toán (ở trên đây xem xét mảng chỉ mất độ dài rộng 9×9×9)

Xem thêm: tiếng anh đọc là gì

void solveSudoku(int S[][9], int x, int y){
    if(y == 9){
        if(x == 8){
            printSolution(S);
            exit(0);
        } else {
            solveSudoku(S, x+1,0);
        }
    } else if(S[x][y] == 0){
        for (int k = 1; k <=9; k++){
            if(checkValid(S,x,y,k)){
                S[x][y] = k;
                solveSudoku(S, x, y+1);
                S[x][y] = 0;
            }
        }
    } else {
        solveSudoku(S,x,y+1);
    }
}

boolean checkValid(int S[][9], int x, int hắn, int k){
    for(int i = 0; i <9 ; i++){
        if(S[x][i] == k) return false;
    }
    for(int i = 0; i <9 ; i++){
        if(S[i][y] == k) return false;
    }
    int a = x/3, b = y/3;
    for(int i = 3*a; i < 3*a+3; i++){
        for(int j = 3*b; j < 3*b+3; j++){
            if(S[i][j] == k) return false;
        }
    }
    return true;
}

Nhận xét

  • -Ưu điểm: Việc con quay lùi là test toàn bộ những tổng hợp nhằm tìm ra một câu nói. giải. Thế mạnh mẽ của cách thức này là nhiều thiết lập tránh khỏi việc nên test nhiều tình huống ko hoàn hảo, nhờ bại liệt hạn chế thời hạn chạy.

  • Nhược điểm: Trong tình huống xấu xa nhất chừng phức tạp của con quay lùi vẫn chính là cung cấp số nón. Vì nó phạm phải những điểm yếu sau:

    • Rơi nhập biểu hiện "thrashing": qúa trình dò la kiếm cứ gặp gỡ nên thuyệt vọng với và một nguyên vẹn nhân.
    • Thực hiện tại những việc làm dư thừa: Mỗi phen tất cả chúng ta con quay lùi, tất cả chúng ta rất cần phải reviews lại câu nói. giải trong những lúc song khi điều này ko quan trọng.
    • Không sớm phân phát hiện tại được những năng lực bị thuyệt vọng nhập sau này. Quay lùi chuẩn chỉnh, không tồn tại cách thức quan sát về sau này nhằm phân biệt được nhánh dò la kiếm tiếp tục cút nhập thuyệt vọng.

All rights reserved