1 [Kinh nghiệm]Sinh các hoán vị và tổ hợp Thu Jul 07, 2011 7:03 pm
Admin
Quản trị viên
Sinh các hoán vị và tổ hợp
1. Sinh các hoán vị:
Mọi tập n phần tử đề có thể tương ứng với tập {1, 2,..., n}
Chúng ta có thể liệt kê các hoán vị của một tập bất kỳ gồm n phần tử bằng cách sinh ra các hoán vị của tập n số nguyên dương nhỏ nhất, sau đó thay thế các số nguyên này bằng các phần tử tương ứng của chúng. Có nhiều thuật toán đã được phát triển để sinh ra n! hoán vị của tập này. Chúng ta sẽ mô tả một trong các phương pháp đó, phương pháp liệt kê các hoán vị của tập {1, 2...n} theo thứ tự từ điển.
Khi đó hoán vị a1, a2, ..., an được gọi là đi trước (nhỏ hơn) hoán vị b1, b2, ..., bn nếu với k nào đó ( 1 ≤ k ≤ n ) , a1 = b1 , a2 = b2 ,... ak-1 = bk-1 và ak < bk . Nói cách khác, một hoán vị của tập n số nguyên dương đầu tiên được gọi là đi trước (theo thứ tự từ điển) một hoán vị khác nếu con số của hoán vị đầu tại vị trí đầu tiên mà 2 hoán vị khác nhau, nhỏ hơn con số thuộc hoán vị thứ 2 cũng ở vị trí đó.
Ví dụ 1:
Hoán vị 23415 của tập {1, 2, 3, 4, 5} là đi trước hoán vị 23514, vì những hoán vị này trùng nhau ở 2 vị trí đầu tiên, nhưng số 4 ở vị trí thứ 3 của hoán vị đầu nhỏ hơn số 5 cũng ở vị trí 3 của hoán vị sau. Tương tự hoán vị 41532 là đi trước 52143.
Thuật toán sinh các hoán vị của tập {1, 2, 3... n} dựa trên thủ tục xây dựng hoán vị kế tiếp theo thứ tự từ điển , của hoán vị cho trước a1, a2, ..., an. Bây giờ chúng ta sẽ chỉ rõ cách xây dựng hoán vị liên tiếp này.
Đầu tiên ta giả sử an-1 < an. Rõ ràng nếu đổi chỗ an-1 và an cho nhau thì ta nhận được hoán vị mới (đi sau) hay lớn hơn hoán vị đã cho, và không thể có hoán vị nào khác lớn hơn hoán vị xuất phát mà lại bé hơn hoán vị nhận được bằng việc đổi chỗ an-1 và an cho nhau. Ví dụ, hoán vị liền tiếp sau hoán vị 234156 là hoán vị 234165. Nếu an-1 > an thì không thể nhận được hoán vị lớn hơn bằng cách đổi chỗ 2 phần tử này trong hoán vị.
Bây giờ ta xem xét 3 số. Nếu an-2 < an-1 thì có thể sắp xếp lại 3 số cuối cùng để có thể nhận được một hoán vị mới liền sau hoán vị xuất phát. Đặt số nhỏ hơn trong 2 số an-1 và an vào vị trí n-2 sau đó đặt số nguyên còn lại và số an-2 vào 2 vị trí cuối cùng theo thứ tự tăng dần. Ví dụ hoán vị liền sau hoán vị 234165 là 234516.
Nếu an-2 > an-1 (và trước đó đã an-1 > an) khi đó không thể nhận được hoán vị lớn hơn bằng cách đổi chỗ 3 số hạng cuối cùng của hoán vị. Dựa trên những nhận xét này ta có thể mô tả phương pháp tổng quát tạo hoán vị liền sau (theo thứ tự từ điển) của hoán vị cho trước a1, a2, ..., an như sau:
Trước tiên tìm các số nguyên aj và aj+1 sao cho aj < aj+1và aj+1> aj+2>...>an tức là tìm cặp số nguyên liền kề đầu tiên tính từ bên phải sang bên trái của hoán vị mà số trước nhỏ hơn số sau. Sau đó , để nhận được hoán vị liền sau, Khách viếng thăm đặt vào vị trí thứ j số nguyên dương nhỏ nhất trong các số lớn hơn aj của tập aj+1, aj+2..., an vào các vị trí j + 1, ..., n. Dễ thấy không có hoán vị nào lớn hơn hoán vị xuất phát và nhỏ hơn hoán vị vừa tạo ra.
Ví dụ 2.
Để sinh ra n! hoán vị các số 1, 2, ..., n chúng ta sẽ bắt đầu bằng hoán vị nhỏ nhất theo thứ tự từ điển , tức là 12,...n và áp dụng liên tiếp (n! -1) lần thủ tục đã mô tả ở trên. Bằng cách đó Khách viếng thăm nhận được tất cả các hoán vị của n số nguyên.
1. Sinh các hoán vị:
Mọi tập n phần tử đề có thể tương ứng với tập {1, 2,..., n}
Chúng ta có thể liệt kê các hoán vị của một tập bất kỳ gồm n phần tử bằng cách sinh ra các hoán vị của tập n số nguyên dương nhỏ nhất, sau đó thay thế các số nguyên này bằng các phần tử tương ứng của chúng. Có nhiều thuật toán đã được phát triển để sinh ra n! hoán vị của tập này. Chúng ta sẽ mô tả một trong các phương pháp đó, phương pháp liệt kê các hoán vị của tập {1, 2...n} theo thứ tự từ điển.
Khi đó hoán vị a1, a2, ..., an được gọi là đi trước (nhỏ hơn) hoán vị b1, b2, ..., bn nếu với k nào đó ( 1 ≤ k ≤ n ) , a1 = b1 , a2 = b2 ,... ak-1 = bk-1 và ak < bk . Nói cách khác, một hoán vị của tập n số nguyên dương đầu tiên được gọi là đi trước (theo thứ tự từ điển) một hoán vị khác nếu con số của hoán vị đầu tại vị trí đầu tiên mà 2 hoán vị khác nhau, nhỏ hơn con số thuộc hoán vị thứ 2 cũng ở vị trí đó.
Ví dụ 1:
Hoán vị 23415 của tập {1, 2, 3, 4, 5} là đi trước hoán vị 23514, vì những hoán vị này trùng nhau ở 2 vị trí đầu tiên, nhưng số 4 ở vị trí thứ 3 của hoán vị đầu nhỏ hơn số 5 cũng ở vị trí 3 của hoán vị sau. Tương tự hoán vị 41532 là đi trước 52143.
Thuật toán sinh các hoán vị của tập {1, 2, 3... n} dựa trên thủ tục xây dựng hoán vị kế tiếp theo thứ tự từ điển , của hoán vị cho trước a1, a2, ..., an. Bây giờ chúng ta sẽ chỉ rõ cách xây dựng hoán vị liên tiếp này.
Đầu tiên ta giả sử an-1 < an. Rõ ràng nếu đổi chỗ an-1 và an cho nhau thì ta nhận được hoán vị mới (đi sau) hay lớn hơn hoán vị đã cho, và không thể có hoán vị nào khác lớn hơn hoán vị xuất phát mà lại bé hơn hoán vị nhận được bằng việc đổi chỗ an-1 và an cho nhau. Ví dụ, hoán vị liền tiếp sau hoán vị 234156 là hoán vị 234165. Nếu an-1 > an thì không thể nhận được hoán vị lớn hơn bằng cách đổi chỗ 2 phần tử này trong hoán vị.
Bây giờ ta xem xét 3 số. Nếu an-2 < an-1 thì có thể sắp xếp lại 3 số cuối cùng để có thể nhận được một hoán vị mới liền sau hoán vị xuất phát. Đặt số nhỏ hơn trong 2 số an-1 và an vào vị trí n-2 sau đó đặt số nguyên còn lại và số an-2 vào 2 vị trí cuối cùng theo thứ tự tăng dần. Ví dụ hoán vị liền sau hoán vị 234165 là 234516.
Nếu an-2 > an-1 (và trước đó đã an-1 > an) khi đó không thể nhận được hoán vị lớn hơn bằng cách đổi chỗ 3 số hạng cuối cùng của hoán vị. Dựa trên những nhận xét này ta có thể mô tả phương pháp tổng quát tạo hoán vị liền sau (theo thứ tự từ điển) của hoán vị cho trước a1, a2, ..., an như sau:
Trước tiên tìm các số nguyên aj và aj+1 sao cho aj < aj+1và aj+1> aj+2>...>an tức là tìm cặp số nguyên liền kề đầu tiên tính từ bên phải sang bên trái của hoán vị mà số trước nhỏ hơn số sau. Sau đó , để nhận được hoán vị liền sau, Khách viếng thăm đặt vào vị trí thứ j số nguyên dương nhỏ nhất trong các số lớn hơn aj của tập aj+1, aj+2..., an vào các vị trí j + 1, ..., n. Dễ thấy không có hoán vị nào lớn hơn hoán vị xuất phát và nhỏ hơn hoán vị vừa tạo ra.
Ví dụ 2.
- Tìm hoán vị liền sau theo thứ tự từ điển của hoán vị 362541:
Cặp số nguyên đầu tiên tính từ phải qua trái có số trước nhỏ hơn số sau là a3 = 2 và a4 =5. Số nhỏ nhất trong các số bên phải của số 2 mà lại lớn hơn 2 là số 4. Đặt số 4 vào vị trí 3. Sau đó đặt các số 2, 5, 1 theo thứ tự tăng dần vào 3 vị trí còn lại. Ta được hoán vị liền sau hoán vị đã cho là 364125.
Để sinh ra n! hoán vị các số 1, 2, ..., n chúng ta sẽ bắt đầu bằng hoán vị nhỏ nhất theo thứ tự từ điển , tức là 12,...n và áp dụng liên tiếp (n! -1) lần thủ tục đã mô tả ở trên. Bằng cách đó Khách viếng thăm nhận được tất cả các hoán vị của n số nguyên.