Thứ tự từ điển
Các bài toán về thứ tự từ điển thì có cách giải thông thường là: viết ra giấy vài trường hợp, để ý phân tích, mò ra quy luật, từ đó có phương án implement tốt nhất.
Xét ví dụ bài toán phát biểu như sau:
Cho số nguyên dương
n
:
Với dãy
a
là một hoán vị các số nguyên từ1
đếnn
, hãy tính thứ tự từ điển của hoán vị này.Ngược lại, cho số tự nhiên
k
bé hơnn!
, hãy tìm dãya
là hoán vị có số thứ tựk
.Lưu ý là thứ tự bắt đầu tính từ
0
.
Trước hết là câu 1, giải thích qua ví dụ thì dễ dàng hơn, chẳng hạn với n = 5
và dãy a = [ 4, 5, 3, 1, 2 ]
. Tư tưởng là đi đếm xem có bao nhiêu hoán vị bé hơn a
. Những hoán vị bé hơn a
dễ thấy nhất có dạng:
[ 1, x, x, x, x ]
[ 2, x, x, x, x ]
[ 3, x, x, x, x ]
trong đó mỗi dạng đều có số lượng hoán vị là 4!
suy ra tổng cộng là 3 * 4!
hoán vị.
Bây giờ xét đến dạng [ 4, x, x, x, x ]
, bài toán có vẻ được lặp lại với kích thước giảm đi một đơn vị. Thật vậy, ta có thể bỏ số 4
để được dãy mới [ 5, 3, 1, 2 ]
và quay lại cách tính như bước trên. Tuy nhiên có một điều cực kì quan trọng là trong dãy [ 5, 3, 1, 2 ]
này, các số hạng không hề liên tiếp nhau: 1, 2, 3
rồi vọt lên 5
. Do đó, ta phải quan niệm số 5
là số 4
mới được. Để khi đó sẽ xét tiếp các dạng:
[ 1, x, x, x ]
[ 2, x, x, x ]
[ 3, x, x, x ]
Nếu không quan niệm 5
là 4
ta sẽ vô tình xét thêm dạng [ 4, x, x, x ]
dẫn đến kết quả sai. Để biết phải quan niệm số 5
là số mấy, đơn giản đếm xem trong dãy [ 5, 3, 1, 2 ]
có bao nhiêu số bé hơn 5
.
Câu 2 suy ngược lại từ câu 1, vẫn lấy ví dụ n = 5
, nhận xét rằng các hoán vị sẽ được sắp theo kiểu:
4! các hoán vị dạng [ 1, x, x, x, x ]
4! các hoán vị dạng [ 2, x, x, x, x ]
4! các hoán vị dạng [ 3, x, x, x, x ]
4! các hoán vị dạng [ 4, x, x, x, x ]
4! các hoán vị dạng [ 5, x, x, x, x ]
Để tính phần tử đầu tiên của a
, ta sẽ tìm xem dãy a
thuộc dạng nào trong 5
dạng trên, chỉ cần lấy thương trong phép chia k
cho 4!
. Để tính phần tử tiếp theo của a
, ta lại đi sâu vào dạng mới tìm được với số thứ tự là số dư trong phép chia k
cho 4!
. Cứ thế cho đến khi tính được phần tử cuối cùng của a
.
Code minh họa:
|
|
2023/05/07 – Cập nhật code minh họa F# thần chưởng:
|
|