Thuật toán sinh kế tiếp – 1. Liệt kê các hoán vị của n phần tử

 Thuật toán sinh kế tiếp 1

 Liệt kê các hoán vị của n phần tử

Bài toán: Cho tập hợp X = {1, 2, …, n} . Hãy liệt kê tất cả các hoán vị của X.

Ví dụ: {1, 2, 3, 4} khi đó các hoán vị của 4 phần tử được sắp xếp theo thứ tự từ điển như sau:

  • Như vậy hoán vị đầu tiên là 1, 2, 3, …, n, hoán vị cuói cùng là n, n-1, …, 1

Thuật toán sẽ làm như sau:

Ví dụ :

1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
  • Nội dung thuật toán
  1. Tìm từ phải qua trái vị trí có chỉ số j đầu tiên thỏa mãn aj < aj+1
  2. Tìm ak là số nhỏ nhất còn lớn hơn aj trong các số bên phải aj
  3. Đổi chỗ aj cho ak
  4. Lật ngược đoạn aj+1, …, an.

Phân tích ví dụ :

  • Phân tích hàng thứ nhất -> hàng thứ 2:
  1. Vt đầu tiên thỏa mãn số sau lớn hơn số trước là ở vt thứ 3 a3=3.
  2. Ở vị trí a4 = 4 là giá trị nhỏ nhất mà vẫn lớn hơn a3 = 3.
  3. Thưc hiện đổi chỗ a3 cho a4. Ta được dãy 1  2  4  3
  4. Vì nó đã ở vị trí cuối cùng nên không cần lật ngược.
  • Phân tích ở hàng thứ 2 -> hàng thứ 3:
  1. Vt đầu tiên thỏa mãn số sau lớn hơn số trước là ở vt thứ 2 a2=2
  2. Ở vị trí a4 = 3 là giá trị nhỏ nhất bên phải a2 và lớn hơn a2
  3. Đổi chỗ acho a4 ta được 1  3   4   2
  4. Lật ngược từ aj+1 tức vị trí thứ 3 thì ta được dãy 1 3  2  4 như trong dãy 3.
  • Ta có thể thấy rằng điều kiện sô nhỏ nhất nằm bên phải a­j chỉ cần tìm từ bên phải sang trái số nào lớn hơn aj ­được tìm thấy đầu tiền thì đó chính là giá trị cần tìm, tính chất của dãy đã giúp ta bỏ được công đoạn này.

Cài đặt code : Souce codeBaiTap

Leave a comment