Phương pháp tìm dãy kế tiếp

Một phần của tài liệu Bài giảng toán rời rạc chương 3 lý thuyết tổ hợp (Trang 51 - 62)

+ Nếu tìm thấy thì ta xây dựng dãy t = [t1, t2, ..., tn] như sau: ti = si với i = 1, 2, ..., m – 1 tm = 1 ti = 0 với i = m + 1, m + 2, ...., n Ví dụ:

Thuật toán liệt kê dãy nhị phân

- Đầu ra: Danh sách tất cả các dãy nhị phân độ dài n theo thứ tự từ điển tăng dần.

+ B2: Kết xuất s.

+ B1: Khởi tạo: Gán si = 0 với mọi i = 1, 2, ...., n

+ Bước 3: Tìm m thoả mãn m = max{i | si = 0}

 Nếu không tìm thấy thì s = [1,1,...,1] là dãy cuối cùng  kết thúc

 Nếu tìm thấy ta đặt:

sm  1 và si  0 với mọi i = m + 1, m + 2, ..., n Quay lại bước 2.

VÍ D

3.3.3 THUT TOÁN QUAY LUI

Nội dung chính của thuật toán này là xây dựng dần các thành phần của cấu hình bằng cách thử tất cả các khả năng.

Giả thiết cấu hình cần được mô bằng một dãy gồm n thành phần x1x2...xn

Giả sử đã xác định được i – 1 thành phần x1, x2, ..., xi-1. Ta xác định thành phần thứ i là xi bằng cách duyệt tất cả các khả năng có thể có (đánh số các khả năng từ 1 đến ni).

Với mỗi khả năng j, kiểm tra xem khả năng j có chấp nhận được không. Có thể có 2 trường hợp sau:

- Nếu j được chấp nhận thì xác định được xi theo j, sau đó nếu i = n thì ta có được một cấu hình, còn nếu i < n thì tiến hành xác định xi+1

- Nếu thử tất cả các khả năng mà không có khả năng nào được chấp nhận thì quay lại bước trước để xác định lại xi-1

Bước xác định xi có thể được diễn tả qua thủ tục đệ quy sau: Procedure try(i:integer) var j: integer begin for j  1 to ni do if <chấp nhận j> then begin <xác định xi theo j>

if i = n then <ghi nhận một cấu hình> else try(i + 1);

end; End;

Đoạn chương trình chính của bài toán liệt kê có dạng: Begin

Init; Try(1) End.

Đoạn chương trình liệt kê các dãy nhị phân có độ dài n: Var

n:integer

x: array[0..20] of 0..1

Procedure Try(i:integer); Var j: integer; Begin for j 0 to 1 do begin x[i] j;

if i = n then Result else Try(i+1) end;

Begin

Init; Try(1); End.

Một phần của tài liệu Bài giảng toán rời rạc chương 3 lý thuyết tổ hợp (Trang 51 - 62)