Trong thuật toán “sắp xếp sủi bọt”, ta có một danh sách gồm n số phân biệt (để đơn giản ta xét ntập n số nguyên dương đầu tiên) cần được sắp xếp theo thứ tự (tăng). Trước hết ta so sánh hai số đầu tiên, nếu chúng không theo thứ tự thì ta đổi chỗ cho nhau để được thứ tự mong muốn. Tiếp theo ta so sánh số thứ hai và thứ ba với nhau rồi đổi chỗ nếu cần thiết, và cứ tiếp tục như thế
Trang 1MỘT VÍ DỤ NHỎ về ỨNG DỤNG của
HÀM SINH trong PHÂN TÍCH THUẬT TOÁN
Nguyễn An Khương
1 Trong thuật toán “sắp xếp sủi bọt”, ta có
một danh sách gồm n số phân biệt (để đơn giản ta xét [n]-tập n số nguyên dương đầu
tiên) cần được sắp xếp theo thứ tự (tăng)
Trước hết ta so sánh hai số đầu tiên, nếu chúng không theo thứ tự thì ta đổi chỗ cho nhau để được thứ tự mong muốn Tiếp theo
ta so sánh số thứ hai và thứ ba với nhau rồi đổi chỗ nếu cần thiết, và cứ tiếp tục như thế
Sau n − 1 lần so sánh, ta quay lại đầu danh
sách và tiếp tục quy trình trên
Trang 2Bài toán: Trong số n! hoán vị của n số phân
biệt có bao nhiêu trường hợp ta thu được thứ
tự như mong muốn ngay trong lượt đầu tiên?
Lời giải Ta sẽ giải bài toán tổng quát hơn,
với 𝑘 ≤ 𝑛, ta sẽ chứng tỏ rằng số hoán vị
sao cho sau không quá k lượt xếp bằng thuật
toán sắp xếp sủi bọt ta sẽ thu được thứ tự cần thiết là
1 2 3 k k 1 n k !k k1)n k (1.1)
Xét một hoán vị a1a2 · · · a n của [n], và ta sẽ
xem liệu nó có thể được xếp sau ≤ k lượt hay không Lưu ý rằng ta có thể đẩy a n về
phía trước tối đa k lần Do đó, nếu a n <
n−k, thì dĩ nhiên ta không thể xếp xong sau
Trang 3k lượt
Bây giờ giả sử a n ≥ n−k Trước hết ta chứng tỏ
rằng a1a2 · · · a n được xếp xong sau không quá
k lượt khi và chỉ khi a1a2 · · · a n-1 cũng được
xếp xong sau không quá k lượt
Đặt a n =n–t, với 1≤ t ≤ k Gọi 𝑎1𝑖 𝑎2𝑖 … 𝑎𝑛−1𝑖 là
kết quả sau lượt xếp thứ i của a1a2 · · · a n-1 Khi
đó, sau lượt đầu trên n-1 phần tử đầu tiên a1
a n−1, ta thu được 𝑎11𝑎21 … 𝑎𝑛−11 a n, và trong phép so sánh cuối cùng của lượt này ta so
𝑎𝑛−11 với a n, ta có 𝑎𝑛−11 = 𝑛 nên 𝑎𝑛−11 và a n đổi chỗ cho nhau
𝑎11𝑎21 … 𝑎𝑛−21 (𝑛 − 𝑡)𝑛
Trang 4Tương tự, sau lượt 2 ta có
𝑎12𝑎22 … 𝑎𝑛−32 (𝑛 − 𝑡)(𝑛 − 1)𝑛
Cứ tiếp tục như thế, sau t lượt ta có
𝑎1𝑡𝑎2𝑡 … 𝑎𝑛−𝑡−1𝑡 (𝑛 − 𝑡)(𝑛 − 𝑡 + 1) … (𝑛 − 1)𝑛
Sau đó, thực hiện tiếp k – t lượt còn lại ta sẽ thu được
𝑎1𝑘𝑎2𝑘 … 𝑎𝑛−𝑡−1𝑘 (𝑛 − 𝑡)(𝑛 − 𝑡 + 1)(𝑛 − 1)𝑛
Vậy ta thấy rằng a1a2 · · · a n được xếp xong sau
≤k lượt khi và chỉ khi a1a2 · · · a n-1 cũng được
xếp xong sau ≤ k lượt và a n ≥ n−k
Gọi 𝑆𝑛𝑘 là số hoán vị sao cho sau không quá
k lượt xếp trong sắp xếp sủi bọt ta sẽ thu
được thứ tự cần thiết Ta mô tả một hoán vị thỏa mãn điều này như sau
Trang 5Một hoán vị như thế có thể xây dựng được
bằng cách chọn a n là một trong số min(k +
1, n) phần tử {n − k, n − k + 1, , n}, và với mỗi cách chọn được a n như thế ta phải
chọn một hoán vị xếp được sau k lượt của
n – 1 phần tử còn lại
Vậy ta có 𝑆𝑛𝑘 = (𝑘 + 1)𝑆𝑛−1𝑘 với n ≥ k + 1
và thu được (1.1)
2 Trong thuật toán sắp xếp “cocktail-shaker (trộn/lắc?)”, ta thực hiện từng lượt cũng giống như trong sắp xếp sủi bọt nhưng ngay sau khi kết thúc mỗi lượt ta bắt đầu lượt kế tiếp theo chiều ngược lại kể từ vị trí ngay trước khi kết thúc lượt đó Chẳng hạn sau khi kết thúc lượt
đầu, ta so sánh hai số ở vị trí thứ (n − 2) và thứ
Trang 6(n − 1) với nhau; tiếp theo đó, so sánh các số
ở vị trí (n − 3) và vị trí (n − 2) với nhau; và cứ
tiếp tục như thế
Bài toán: Gọi 𝑥𝑛 là số trường hợp trong số
n! hoán vị của n số phân biệt sao cho chỉ trong
2 lượt sắp ngược chiều nhau ta thu được thứ
tự như mong muốn Hãy tìm công thức truy hồi và công thức tường minh cho 𝑥𝑛 nếu
x 1 =1
Lời giải Xét một hoán vị a1a2 · · · a n of [n],
và ta sẽ chia thành 2 trường hợp, tùy theo
giá trị của a1 Nếu a1 = 1 thì a1a2 · · · a n được
xếp xong sau 2 lượt ngược chiều nhau nếu như
hoán vị a2 · · · a n của n-1 phần tử còn lại cũng
thế Vậy ta có x n−1 hoán vị thỏa mãn yêu cầu trong trường hợp này
Trang 7Bây giờ xét a1 = t, với t > 1 Giả sử rằng các số a2, · · ·, a i đều không lớn hơn t và
a i+1 >t Khi đó trong lượt xếp đầu thì t bị
đẩy về phía sau đúng i − 1 lần, đến vị trí thứ i Trong lượt xếp ngựợc lại, t di chuyển
0 hoặc thêm 1 lần nữa Vậy ta chỉ có được
phép sắp xếp mong muốn nếu i = t, hoặc i
= t-1 (hay t=i+1) Ta xét hai trường hợp con
như sau
a) Xét i = t
Lượt xếp đầu sẽ bắt đầu đẩy t sang phải để
có a2a3 · · · a t ta t+1 · · · a n Sau đó ta thực hiện
sắp xếp hai lượt ngược chiều đối với a t+1 · ·
· a n Có x n−t hoán vị như thế Cuối cùng, ta chỉ còn cần sắp nổi bọt một lượt trên a2a3 · · ·
a t Theo Bài toán 1 có 2t−2 hoán vị như thế
Trang 8(thay k=1 và n=t-1 vào (1.1)) Vậy trong
trường hợp này ta có 2t−2
x n−t hoán vị
b) Xét i = t-1 (hay t=i+1)
Chọn
u ∈ {1, 2,· · · , t−1}\{a2, a3, · · · , a t−1} Khi đó lượt đầu cho ta
a2a3 · · · a t−1 ta t · · · a n Sau đó sẽ thực hiện hai lượt ngược chiều
trên a t · · · a n Khi kết thúc, vị trí của t (vị trí thứ t-1) giờ sẽ là phần tử u Cho nên u đổi chỗ với t (sau 2 lượt, khi kết thúc)
Cuối cùng ta thực hiện một lượt xếp nổi
bọt còn lại đối với a2a3 · · · a t−1 u Có 2 t-2
cách thực hiện điều này
Ta có thể lầm rằng sẽ có x n−t+1 cách để xếp
Trang 9được a t · · ·a n sau hai lượt ngược chiều Tuy nhiên lưu ý rằng ta chỉ tính những
cách mà a t khác với u; trường hợp a t =
u đã được tính vào trong trường hợp a)
rồi
Số trường hợp mà ta phải loại ra chính là
số trường hợp mà trong đó a t = u và a t+1 ·
· · a n có thể được xếp sau 2 lượt ngược
chiều nhau, nó chính bằng x n−t Vậy
trường hợp này có 2 t-2 (x n−t+1 − x n−t )
hoán vị thỏa yêu cầu
Vậy ta có tổng cộng
x n =𝑥𝑛−1 + ∑𝑛𝑡=2 2𝑡−2(𝑥𝑛−𝑡 +
𝑥𝑛−𝑡+1 − 𝑥𝑛−𝑡)
=𝑥𝑛−1 + ∑𝑛𝑡=2 2𝑡−2𝑥𝑛−𝑡+1
Trang 10=2x n−1 + 2x n−2 + 4x n−3 + 8x n−4 +
16x n−5 + · · · +2n-2x1
Để tìm công thức tường minh cho x n ta xét hàm sinh F(z) của nó Từ hệ thức truy hồi trên, ta có
𝐹(𝑧) = 𝑧𝐹(𝑧)
+ (𝑧 + 2𝑧2 + 4𝑧3 + 8𝑧4 + 16𝑧5 + ⋯ )𝐹(𝑧) + 1
Cho nên
1 − 4𝑧 + 2𝑧2
= 1
2 (
1
1 − 𝛼𝑧 −
1
1 − 𝛽𝑧), với 𝛼, 𝛽 là hai nghiệm của 1 − 4𝑧 + 2𝑧2 Vậy 𝑥𝑛 = 𝛼𝑛+𝛽𝑛
2