Giả sử bạn cần thuê một nhân viên văn phòng mới thông qua dịch vụ môi giới việc làm. Nhà môi giới sẽ lần lượt gửi cho bạn một ứng cử viên mỗi ngày. Bạn sẽ phỏng vấn mỗi người và sau đó bạn quyết định có thuê người đó hay không. Để phỏng vấn một người xin việc, bạn phải tốn một chi phí nhỏ để trả cho nhà môi giới, tuy nhiên để thuê được một người thì rất tốn kém vì bạn phải sa thải nhân viên hiện tại và trả một khoản chi phí thuê rất lớn cho nhà môi giới. Vì vậy, sau khi phỏng vấn một người, nếu người đó tốt hơn người hiện tại bạn sẽ sa thải người hiện tại và thuê người mới. Mục tiêu của bài toán này là nhằm ước tính xem chi phí đó là bao nhiêu.
Thủ tục HIRE-ASSISANT dưới đây sẽ mô tả quá trình này. Giả sử số lượng các ứng cử viên là từ 1 đến n. Sau khi phỏng vấn ứng cử viên thứ i, thủ tục có thể cho bạn xác định ứng cử viên nào là tốt nhất trong các ứng cử viên trước đó. Để khởi gán giá trị ban đầu, thủ tục tạo ra 1 ứng cử viên mang giá trị 0 (gọi là ứng cử viên bù nhìn, có chất lượng tệ nhất).
18 trang |
Chia sẻ: tuandn | Lượt xem: 2301 | Lượt tải: 2
Bạn đang xem nội dung tài liệu Tiểu luận Ứng dụng phương pháp phân tích xác suất và các thuật toán ngẫn nhiên trong quá trình phân tích các bài toán, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
ĐẠI HỌC HUẾ
TRƯỜNG ĐẠI HỌC KHOA HỌC
¯
TIỂU LUẬN
MÔN: MÔ PHỎNG NGẪU NHIÊN
ĐỀ TÀI:
ỨNG DỤNG PHƯƠNG PHÁP PHÂN TÍCH XÁC SUẤT VÀ CÁC THUẬT TOÁN NGẪU NHIÊN TRONG QUÁ TRÌNH PHÂN TÍCH CÁC BÀI TOÁN
Giáo viên giảng dạy: PGS.TS. Trần Lộc Hùng
Học viên thực hiện: Nguyễn Lý Hữu Huấn
Lớp: Khoa học máy tính, Khóa năm: 2008-2010
Huế, 6/2009
MỤC LỤC
LỜI MỞ ĐẦU
Tiểu luận này trình bày về phương pháp sử dụng phép phân tích xác suất và các thuật toán ngẫu nhiên trong quá trình phân tích và ước lượng chi phí của một bài toán. Trong tiểu luận này, tôi đưa ra một bài toán cụ thể, đó là bài toán Thuê nhân viên để tiến hành phân tích và đánh giá chi phí thực hiện ở các trường hợp sử dụng phương pháp phân tích xác suất và phương pháp ứng dụng thuật toán ngẫu nhiên.
Tôi xin chân thành cảm ơn Thầy giáo – PGS.TS. Trần Lộc Hùng đã tận tình giảng dạy và chỉ bảo cho tôi những kiến thức bổ ích về môn học. Do khả năng và thời gian có hạn nên tiểu luận không tránh khỏi những thiếu sót và hạn chế. Tôi mong tiếp tục nhận được sự chỉ bảo của Thầy để có thể hoàn chỉnh hơn nữa những hiểu biết của mình.
Học viên thực hiện
Nguyễn Lý Hữu Huấn
1. GIỚI THIỆU BÀI TOÁN
1.1 Mô tả bài toán Thuê nhân viên
Giả sử bạn cần thuê một nhân viên văn phòng mới thông qua dịch vụ môi giới việc làm. Nhà môi giới sẽ lần lượt gửi cho bạn một ứng cử viên mỗi ngày. Bạn sẽ phỏng vấn mỗi người và sau đó bạn quyết định có thuê người đó hay không. Để phỏng vấn một người xin việc, bạn phải tốn một chi phí nhỏ để trả cho nhà môi giới, tuy nhiên để thuê được một người thì rất tốn kém vì bạn phải sa thải nhân viên hiện tại và trả một khoản chi phí thuê rất lớn cho nhà môi giới. Vì vậy, sau khi phỏng vấn một người, nếu người đó tốt hơn người hiện tại bạn sẽ sa thải người hiện tại và thuê người mới. Mục tiêu của bài toán này là nhằm ước tính xem chi phí đó là bao nhiêu.
Thủ tục HIRE-ASSISANT dưới đây sẽ mô tả quá trình này. Giả sử số lượng các ứng cử viên là từ 1 đến n. Sau khi phỏng vấn ứng cử viên thứ i, thủ tục có thể cho bạn xác định ứng cử viên nào là tốt nhất trong các ứng cử viên trước đó. Để khởi gán giá trị ban đầu, thủ tục tạo ra 1 ứng cử viên mang giá trị 0 (gọi là ứng cử viên bù nhìn, có chất lượng tệ nhất).
* Thủ tục HIRE-ASSITANT
1. BEST:=0 {ứng cử viên bù nhìn}
2. For i:=1 to n do
3.
4. if then
5. BEST: = i
6.
Ở đây ta không đề cập đến thời gian thực hiện của thủ tục, mà chỉ quan tâm đến chi phí thực hiện thông qua việc phỏng vấn và thuê. Việc phỏng vấn thì tốn chi phí thấp – gọi là ci, nhưng ngược lại thuê thì tốn chi phí rất đắt – gọi là ch. Gọi m là số người được thuê, thì tổng chi phí của thuật toán này là O(nci + mch). Dù ta thuê bao nhiêu người đi chăng nữa thì ta cũng phải luôn phỏng vấn hết n người, và như vậy ta luôn tốn nci cho việc phỏng vấn. Vì thế, ta chỉ tập trung vào phân tích chi phí thuê mch, con số này biến đổi ứng với mỗi lần thực thi thuật toán.
1.2 Phương pháp phân tích truyền thống
- Trường hợp tốt nhất
Trong trường hợp tốt nhất, ta chỉ cần thực hiện việc thuê đúng 1 lần. Tức là các ứng cử viên đến theo thứ tự giảm dần về chất lượng, như vậy ta đã phỏng vấn n lần và thuê 1 lần với tổng chi phí thuê là O(ch).
- Trường hợp xấu nhất
Trong trường hợp xấu nhất, mọi ứng cử viên phỏng vấn ta đều thuê cả. Tức là các ứng cử viên đến theo thứ tự tăng dần về chất lượng, như vậy ta đã thuê n lần với tổng chi phí thuê là O(nch).
Điều đó có thể xảy ra, tuy nhiên các ứng cử viên không phải lúc nào đến cũng theo thứ tự tăng dần. Thực tế, ta không biết hoặc không thể điều khiển thứ tự mà họ đến.
Ví dụ:
Cho một danh sách đã được xếp hạng theo thứ tự sau A1 = (1,2,3,4,5,6,7,8,9,10), thì sẽ mất 10 lần thuê ứng cử viên mới, vì mỗi ứng cử viên đến sau đều tốt hơn ứng cử viên trước và như vậy việc thuê (dòng 5-6 của giải thuật HIRE-ASSITANT) sẽ luôn được thực hiện với mỗi ứng cử viên.
Cho danh sách được xếp hạng theo thứ tự ngược lại A2 = (10,9,8,7,6,5,4,3,2,1), thì chỉ cần mất 1 lần thuê ứng cử viên mới, vì mỗi ứng cử viên đến sau đều tệ hơn ứng cử viên trước và như vậy dòng 5-6 của giải thuật HIRE-ASSITANT chỉ thực hiện một lần đối với ứng cử viên đầu tiên.
Cho danh sách được xếp hạng theo thứ tự như sau A3 = (5,2,1,8,4,7,10,9,3,6), thì mất 3 lần thuê ứng cử viên mới, đó là ứng cử viên có thứ hạng 5, 8, 10.
Tóm lại, độ phức tạp của thuật toán này tùy thuộc vào số lần mà ta thuê một nhân viên mới, ta có trường hợp xấu nhất là A1, tốt nhất là A2 và trường hợp trung bình là A3.
2. PHƯƠNG PHÁP PHÂN TÍCH XÁC SUẤT
2.1 Khái niệm phân tích xác suất
Phân tích xác suất là sử dụng xác suất trong việc phân tích các bài toán. Hầu hết, ta sử dụng phân tích xác suất để phân tích thời gian thực hiện của thuật toán. Đôi khi ta sử dụng nó để phân tích các đại lượng khác như phân tích chi phí thuê nhân viên trong thủ tục HIRE-ASSISTANT. Để phân tích xác suất, ta phải mô tả được sự phân phối bộ dữ liệu vào hoặc giả định về sự phân phối bộ dữ liệu vào hợp lý. Sau đó, ta phân tích thuật toán, tính toán một kỳ vọng về thời gian thực thi. Kỳ vọng này là dựa trên sự phân phối dữ liệu vào. Như vậy, ta có thể tính được trung bình thời gian thực thi dựa trên dữ liệu vào.
Vậy, ta phải rất cẩn thận trong việc quyết định phân phối bộ dữ liệu vào. Ở một số bài toán, nếu ta có thể giả sử một tập hợp các bộ dữ liệu vào hợp lý thì ta có thể sử dụng phân tích xác suất như một kỹ thuật để thiết kế một thuật toán hiệu quả và như là một phương tiện để hiểu rõ bài toán. Còn nếu ở một bài toán, ta không thể mô tả một bộ phân phối dữ liệu vào hợp lý thì ta không thể sử dụng phân tích xác suất.
Ở bài toán thuê nhân viên, ta có thể giả sử rằng các ứng cử viên đến theo một thứ tự ngẫu nhiên. Điều đó có nghĩa là gì? Giả sử rằng ta có thể so sánh bất kỳ 2 ứng cử viên nào và quyết định người nào tốt hơn; như vậy ta sẽ có được thứ tự toàn bộ các xếp hạng của các ứng cử viên. Ta có thể xếp hạng mỗi ứng cử viên ứng với 1 số duy nhất từ 1 đến n, sử dụng rank(i) là vị thứ của ứng cử viên i và ta quy ước rằng vị thứ cao hơn ứng với người có chất lượng tốt hơn. Danh sách thứ tự (rank(1), rank(2), …, rank(n)) là một sự hoán vị của (1, 2, …, n). Ta nói các ứng cử viên đến theo thứ tự ngẫu nhiên tương đương với việc nói rằng danh sách các hoán vị của các vị thứ là như nhau đối với mỗi hoán vị trong n! hoán vị của 1 đến n. Ta nói rằng các vị thứ tạo nên một hoán vị ngẫu nhiên đều (uniform radom permution) tức là mỗi hoán vị trong n! hoán vị xuất hiện với xác suất bằng nhau.
Để thuê chính xác một lần thì ứng cử viên đến phỏng vấn đầu tiên phải là ứng cử viên tốt nhất. Như vậy xác suất để thuê chính xác một lần chính bằng xác suất để ứng cử viên tốt nhất nằm ở vị trí thứ nhất trong dãy dữ liệu vào (có n vị trí), vậy xác suất này bằng 1/n.
Để thuê chính xác n lần thì các ứng cử viên phải đến theo thứ tự tăng dần về chất lượng, đây là trường hợp xấu nhất của thuật toán. Các hoán vị bộ dữ liệu vào có khả năng như nhau, mà có tất cả là n! hoán vị. Như vậy xác suất để các ứng cử viên đến theo thứ tự tăng dần là 1/n!. Nên xác suất mà bạn sẽ thuê chính xác n lần là 1/n!.
2.2 Biến chỉ thị ngẫu nhiên
Để phân tích nhiều thuật toán như Bài toán thuê nhân viên ở trên ta sẽ sử dụng biến chỉ thị ngẫu nhiên. Biến chỉ thị ngẫu nhiên cho ta một phương pháp thuận tiện để chuyển đổi giữa xác suất và kỳ vọng. Giả sử rằng ta có một không gian mẫu S và một sự kiện A, thì biến chỉ thị ngẫu nhiên I{A} gắn với sự kiện A được định nghĩa như sau:
I{A}=
1 nếu A xuất hiện
0 nếu A không xuất hiện
(1)
Một ví dụ đơn giản, để xác định được kỳ vọng của số lần xuất hiện mặt ngửa khi ta tung một đồng xu cân đối. Ta gọi không gian mẫu S = {H,T} đại diện cho mặt ngửa (H) và mặt sấp (T) của đồng xu với xác suất xuất hiện mặt ngửa và mặt sấp Pr{H}=Pr{T}=1/2. Ta có thể định nghĩa biến chỉ thị ngẫu nhiên XH là số mặt ngửa của đồng xu xuất hiện – gắn với sự kiện H. Biến này tính số mặt ngửa xuất hiện khi tung đồng xu và nó bằng 1 nếu là mặt ngửa, bằng 0 nếu ngược lại (mặt sấp).
Ta viết:
XH=I{H}=
1 nếu H xuất hiện
0 nếu H không xuất hiện
Kỳ vọng của số mặt ngửa xuất hiện trong một lần tung đồng xu chính là giá trị kỳ vọng của biến chỉ thị XH.
E[XH] = E[I{H}] = 1.Pr{H}+ 0.Pr{T}
= 1.(1/2) +0.(1/2) = 1/2
Như vậy, kỳ vọng của số lượng mặt ngửa xuất hiện với một lần tung đồng xu ngẫu nhiên là 1/2. Bổ đề sau cho thấy, giá trị kỳ vọng của một biến chỉ thị ngẫu nhiên với sự kiện A chính bằng xác suất để sự kiện A xảy ra.
Bổ đề 1
Cho không gian mẫu S và sự kiện A trong không gian mẫu. Gọi XA=I{A}, thì E[XA]=Pr{A}
Chứng minh: Từ định nghĩa biến chỉ thị ngẫu nhiên ở công thức (1) và định nghĩa giá trị kỳ vọng, ta có:
E[XA] = E[I{A }] = 1.Pr{A}+ 0.Pr{}
= Pr{A}
Với thể hiện sự kiện S-A (phần bù của A)
Mặc dầu, biến chỉ thị ngẫu nhiên có thể làm cho ứng dụng trở nên nặng nề hơn ví dụ như việc tính kỳ vọng của số mặt ngửa xuất hiện khi tung đồng xu, nhưng nó lại rất cần thiết trong các trường hợp phân tích các mẫu thử nghiệm lặp ngẫu nhiên.
2.3 Phân tích bài toán bằng cách sử dụng biến chỉ thị ngẫu nhiên
Trở lại Bài toán thuê nhân viên, ta muốn tính kỳ vọng của chi phí về thời gian khi ta thuê một nhân viên mới. Để sử dụng phương pháp phân tích xác suất, ta giả sử rằng các ứng cử viên đến theo thứ tự ngẫu nhiên. Gọi X là biến ngẫu nhiên chỉ chi phí thời gian mà ta thuê một nhân viên mới. Ta có thể áp dụng định nghĩa giá trị kỳ vọng:
Nhưng cách tính toán này không được thuận tiện lắm. Vì vậy, thay vào đó ta sẽ sử dụng biến chỉ thị ngẫu nhiên để đơn giản hóa việc tính toán.
Thay vì tính E[X] bằng cách định nghĩa một biến chỉ chi phí về thời gian thuê một nhân viên mới, ta dùng n biến logic riêng biệt tương ứng với mỗi ứng cử viên được thuê hoặc không được thuê. Cụ thể, ta gọi Xi là biến chỉ thị ngẫu nhiên tương ứng với sự kiện ứng cử viên thứ i được thuê. Như vậy:
Xi=I{i được thuê}=
1 nếu i được thuê
0 nếu i không được thuê
(2)
Và
X = X1 + X2 + … + Xn (3)
Theo Bổ đề 1 ta có
E[Xi] = Pr{i được thuê}
Vì thế ta phải tính xác suất ở dòng 5-6 của thủ tục HIRE-ASSISTANT.
Ở dòng 5, ứng cử viên i được thuê khi ứng cử viên thứ i tốt hơn các ứng của viên từ 1 đến i-1. Bởi vì ta đã giả định rằng các ứng cử viên đến theo thứ tự ngẫu nhiên nên i ứng cử viên đầu tiên đã xuất hiện theo thứ tự ngẫu nhiên. Bất kỳ một ứng cử viên nào trong i ứng cử đầu tiên đều có thể được xem là tốt nhất. Ứng cử viên thứ i có xác suất là 1/i khả năng tốt hơn các ứng cử viên từ 1 đến i-1, và như vậy 1/i là xác suất được thuê. Theo Bổ đề 1 ta có được:
E[Xi] = 1/i (4)
Suy ra:
(Theo công thức (3)) (5)
(Theo tính chất tuyến tính của kỳ vọng)
(Theo công thức (4))
(6)
Mặc dù ta phỏng vấn n người nhưng thực tế trung bình ta chỉ thuê xấp xỉ ln n lần. Ta tóm tắt kết quả này trong bổ đề sau:
Bổ đề 2
Giả sử rằng các ứng cử viên đến theo thứ tự ngẫu nhiên, thì thuật toán HIRE – ASSISTANT có độ phức tạp là O(ch ln n).
Chứng minh: Hiển nhiên, ta có được từ định nghĩa về chi phí thuê và công thức (6).
Kỳ vọng của chi phí thuê là sự cải tiến dựa trên trường hợp xấu nhất có độ phức tạp O(nch).
3. PHƯƠNG PHÁP SỬ DỤNG THUẬT TOÁN NGẪU NHIÊN
3.1 Khái niệm thuật toán ngẫu nhiên
Để sử dụng phân tích xác suất, ta cần biết một vài điều về sự phân phối bộ dữ liệu vào. Trong nhiều trường hợp, ta biết rất ít về sự phân phối dữ liệu vào. Thậm chí nếu ta về sự phân phối này thì ta cũng không thể mô hình được điều mà ta biết.
Trong Bài toán thuê nhân viên, các ứng cử viên được đưa đến theo thứ tự ngẫu nhiên nhưng ta không có cách nào để biết được điều đó. Vì vậy, để phát triển thuật toán ngẫu nhiên đối với Bài toán thuê nhân viên này, ta điều khiển thứ tự các ứng cử viên khi vào phỏng vấn bằng cách chọn ngẫu nhiên các ứng cử viên để phỏng vấn. Mặc dù ta không biết gì về các ứng cử viên (ngoài tên của họ) nhưng ta đã tạo ra một sự thay đổi có ý nghĩa. Thay vì tin vào một phỏng đoán là các ứng cử viên đến theo thứ tự ngẫu nhiên thì ta đã điều khiển được tiến trình và buộc nó phải theo một thứ tự ngẫu nhiên.
Nói chung, ta gọi thuật toán ngẫu nhiên nếu hành vi của nó được xác định không chỉ bởi dữ liệu vào mà còn bằng các giá trị được tạo ra bởi bộ tạo số ngẫu nhiên (random-number generator). Giả sử ta có sẵn hàm sinh số ngẫu nhiên RANDOM. Một lời gọi RANDOM(a,b) trả về 1 số nguyên giữa a và b, với mỗi giá trị trả về như vậy có xác suất bằng nhau. Ví dụ, RANDOM(0,1) cho kết quả 0 với xác suất là ½ và cho kết quả 1 với xác suất ½. Một lời gọi RANDOM(3,7) trả về kết quả là 3, 4, 5, 6 hoặc 7 với xác suất là 1/5. Mỗi số nguyên được trả về bởi hàm RANDOM không phụ thuộc vào các số nguyên trả về ở các lời gọi trước đó. Thông thường, hầu hết các môi trường lập trình đều đề cập đến pseudo-random number generator - bộ tạo số giả ngẫu nhiên.
3.2 Ứng dụng thuật toán ngẫu nhiên trong phân tích bài toán
Trong phần trước, ta đã chỉ ra cách để phân phối dữ liệu vào để phân tích trường hợp trung bình của thuật toán. Nhiều khi, ta không hoặc không thể phân tích trường hợp trung bình của thuật toán. Như đã đề cập trong phần 1, ta có thể sử dụng thuật toán ngẫu nhiên. Thuật toán ngẫu nhiên là phương pháp đơn giản và hiệu quả nhất để giải quyết các bài toán.
Chẳng hạn như Bài toán thuê nhân viên ở trên, giả định rằng tất cả các hoán vị của dữ liệu vào đều như nhau thì việc phân tích xác suất sẽ hướng cho ta phát triển thành thuật toán ngẫu nhiên. Thay vì cho một bộ dữ liệu vào, ta tráo đổi bộ dữ liệu đó. Cụ thể là trước khi thực hiện thuật toán, ta hoán đổi các ứng cử viên một cách ngẫu nhiên để chứng tỏ rằng các hoán vị đều như nhau. Điều này không làm thay đổi kỳ vọng của chi phí thời gian để thuê một nhân viên mới (có giá trị xấp xỉ ln n).
Khi sử dụng phương pháp thuật toán ngẫu nhiên, đầu tiên chúng ta hoán đổi ngẫu nhiên danh sách các ứng cử viên, và sau đó tiến hành phỏng vấn để ghi nhận ứng cử viên tốt nhất. Trong trường hợp này, sự ngẫu nhiên nằm ở trong thuật toán chứ không ở trong việc phân phối dữ liệu vào. Cho 1 dữ liệu vào cụ thể, ví dụ như A3 ở trên, ta không biết được số lần tối đa phép toán được thực hiện là bao nhiêu bởi vì con số này thay đổi với mỗi lần thực hiện thuật toán. Lần đầu tiên, ta thực thi thuật toán trên A3, nó tạo ra 1 hoán vị A1 và thực hiện 10 lần cập nhật, trong khi thuật toán thực thi lần thứ 2, nó sẽ tạo ra 1 hoán vị A2 và thực hiện 1 lần cập nhật. Lần thực hiện thuật toán thứ 3, nó sẽ tạo ra 1 hoán vị ngẫu nhiên khác và sẽ thực hiện một số lần cập nhật nào đó. Cứ mỗi lần thực thi thuật toán, việc thực thi thuật toán tùy thuộc vào sự lựa chọn ngẫu nhiên được tạo ra ban đầu và lúc nào cũng khác với các lần thực thi ở trước. Đối với thuật toán này và nhiều thuật toán ngẫu nhiên khác, không có trường hợp dữ liệu vào cho ra trường hợp xấu nhất. Thuật toán ngẫu nhiên thực hiện chỉ xấu khi hàm sinh số ngẫu nhiên tạo ra một hoán vị không may mắn.
Nên đối với Bài toán thuê nhân viên, chỉ có một thay đổi là thêm vào phép hoán vị ngẫu nhiên dãy dữ liệu vào ở đầu thuật toán.
* Thủ tục RANDOMIZED-HIRE-ASSITANT
1. Thực hiện hoán đổi ngẫu nhiên danh sách các ứng cử viên
2. BEST:=0 {ứng cử viên bù nhìn thứ 0 có chất lượng tệ nhất}
3. For i:=1 to n do
4.
5. if then
6. BEST: = i
7.
Bổ đề 3
Kỳ vọng của độ phức tạp đối với thuật toán RANDOMIZED-HIRE-ASSITANT là O(ch ln n)
So sánh Bổ đề 2 và Bổ đề 3 ta thấy rõ sự khác biệt giữa phân tích xác suất và thuật toán ngẫu nhiên. Ở Bổ đề 2, ta gán một bộ dữ liệu vào, còn ở Bổ đề 3, ta không làm như vậy, mặc dù ta mất một lượng thời gian để hoán đổi ngẫu nhiên dữ liệu vào.
Dưới đây ta sẽ thảo luận một vài vấn đề liên quan đến việc hoán đổi ngẫu nhiên dữ liệu vào.
3.3 Các thuật toán hoán đổi ngẫu nhiên dữ liệu vào
Có nhiều thuật toán hoán đổi ngẫu nhiên dữ liệu vào (có nhiều cách hoán đổi). Ở đây ta sẽ thảo luận hai phương pháp. Giả sử rằng A là một dãy gồm các phần tử từ 1 đến n, mục đích của ta là tạo ra một hoán đổi ngẫu nhiên của dãy này.
Cả hai phương pháp dưới đây đều sử dụng hàm Random(a, b) dùng để sinh ra một số ngẫu nhiên nằm trong khoảng giữa a và b. Khi đưa các thuật toán này vào phần mềm R, trong R có rất nhiều hàm sinh số ngẫu nhiên theo các luật phân phối khác nhau. Ở đây ta chỉ cần sử dụng hàm runif(n, min=a, max=b) để tạo ra một dãy gồm n số ngẫu nhiên nằm trong khoảng min và max (ở đây tương ứng là min=a và max=b), dãy này tuân theo luật phân phối đều.
a. Thủ tục PERMUTE-BY-SORTING
Phương pháp thứ nhất là gán mỗi phần tử A[i] của dãy tương ứng với P[i] – thứ tự ưu tiên ngẫu nhiên và sau đó sắp xếp các phần tử của dãy A theo thứ tự ưu tiên này.
Ví dụ:
Nếu dãy ban đầu là A= (1, 2, 3, 4) và ta chọn thứ tự ưu tiên ngẫu nhiên là P= (36, 3, 97, 19) thì ta được mảng B =(2, 4, 1, 3) và ưu tiên của phần tử thứ 2 là nhỏ nhất, tiếp đến là phần tử thứ 4, phần tử thứ nhất và cuối cùng là phần tử thứ 3.
Ta gọi thủ tục này là PERMUTE-BY-SORTING.
PERMUTE-BY-SORTING (A)
1. n := length [A]
2. for i:= 1 to n do
3. P[i] := Random (1,n3)
4. Sắp xếp dãy A theo P
5. Return A
Trong đó thủ tục sắp xếp dãy A theo P thực hiện như sau:
For i:=1 to n-1 do
For j:=i+1 to n do
If P[i] > P[j] then
Hoán đổi A[i] với A[j];
Ở dòng 3 ta chọn những số ngẫu nhiên nằm trong khoảng từ 1 đến n3. Việc chọn giá trị n3 nhằm bảo đảm các giá trị ngẫu nhiên tạo ra sẽ gần như là duy nhất. Ở đây ta xem như các thứ tự ưu tiên là duy nhất. (Trong trường hợp có hai hay nhiều thứ tự ưu tiên P[i] bằng nhau do hàm Random(1,n3) cho cùng 1 kết quả thì dãy A vẫn được sắp xếp theo P, lúc này các phần tử có thứ tự ưu tiên bằng nhau đứng liên tiếp nhau. Vì dãy có n phần tử, nên ta luôn có n! hoán vị, và xác suất của mỗi hoán vị là 1/n! cho dù có hai hay nhiều thứ tự ưu tiên P[i] bằng nhau đi chăng nữa.)
Trong thuật toán này, bước đòi hỏi mất nhiều thời gian nhất là ở dòng 4. Ta biết rằng nếu sử dụng thuật toán sắp xếp so sánh thì mất thời gian Ω(nlgn). Sau khi sắp xếp, nếu P[i] có thứ tự ưu tiên nhỏ nhất là j, thì A[i] sẽ nằm ở vị trí j. Ở một khía cạnh nào đó ta có được một sự hoán vị. Chứng tỏ rằng thuật toán tạo ra một hoán vị ngẫu nhiên đều tức là mỗi hoán vị từ 1 đến n đều có khả năng như nhau.
Bổ đề 4
Giả sử tất cả các thứ tự ưu tiên đều khác nhau, thì thủ tục PERMUTE-BY-SORTING tạo ra một hoán vị ngẫu nhiên đều.
Chứng minh:
Ta xét một hoán vị cụ thể mà ở đó mỗi phần tử A[i] nhận i là thứ tự ưu tiên nhỏ nhất. Ta cần chứng minh rằng hoán vị này xuất hiện với xác suất chính xác 1/n!.
Cho i = 1, 2, 3, …, n, gọi Xi là sự kiện mà phần tử A[i] nhận i là thứ tự ưu tiên nhỏ nhất. Ta tính xác suất mà với mọi i, sự kiện Xi xuất hiện:
=
Ta đã có Pr{X1}=1/n, bởi vì xác suất để chọn ngẫu nhiên 1 phần tử trong tập gồm n phần tử là 1/n. Tiếp theo, ta còn lại n-1 phần tử, ta tính Pr{X2|X1}=1/(n-1) vì đã có phần tử A[1] có độ ưu tiên nhỏ nhất. Như vậy, Với i=2,3,…,n ta có Pr{Xi | Xi-1ÇXi-2Ç…ÇX1} = 1/(n-i+1) vì đã có các phần tử từ A[1] đến A[i-1] có i-1thứ tự ưu tiên nhỏ nhất, n-(i-1) phần tử còn lại có độ ưu tiên nhỏ nhất như nhau là i, Do vậy, ta có:
Vậy, xác suất của hoán vị là bằng 1/n!
Ta có thể mở rộng chứng minh cho bất kỳ một hoán vị ưu tiên nào. Xem xét bất kỳ một hoán vị cố định σ =(σ(1), σ(2), ….., σ(n)) của tập {1, 2, …, n}. Gọi ri là độ ưu tiên của A[i], với độ ưu tiên nhỏ nhất là j – xếp hạng thứ j. Nếu ta gọi Xi là sự kiện A[i] nhận σ(i) là độ ưu tiên nhỏ nhất hoặc ri = σ(i), thì giống chứng minh trên.
Vì vậy, nếu ta tính xác suất của một hoán vị bất kỳ nào đó thì thu được kết quả giống như trên. Như vậy xác suất của sự hoán vị này luôn luôn là 1/n!.
Có thể nói rằng để chứng minh một hoán vị là hoán vị ngẫu nhiên đều thì đủ để chứng tỏ rằng với mỗi phần tử A[i] xác suất mà A[i] nằm ở vị trí j là 1/n.
b. Thủ tục RANDOM-IN-PLACE
Một phương pháp tốt hơn tạo một hoán vị dựa trên thứ tự ưu tiên ngẫu nhiên là hoán vị ngẫu nhiên trực tiếp trên dãy số đã cho. Thuật toán RANDOM-IN-PLACE dưới đây có độ phức tạp là O(n).
RANDOM-IN-PLACE(A)
1. n:= length(A);
2. For i:= 1 to n do
3.
Trong lần lặp thứ i, phần tử A[i] được chọn ngẫu nhiên trong khoảng A[i] đến A[n]. Sau lần lặp thứ i, A[i] không bao giờ bị thay đổi. Đây là sự bất biến của vòng lặp. Ta sẽ sử dụng sự bất biến của vòng lặp để chứ