Cách đ t bí danh này th
ng không ph i ý t
ng hay, b i nh ng thay đ i trong m t c bài con l i đ
c
ặ
ườ
ả
ưở
ở
ữ
ổ
ộ ỗ
ạ ượ
th hi n nh ng c khác; đây không ph i là đ ng thái mà b n trông đ i nh ng b bài th t. Song n u
ể ệ ở
ữ
ỗ
ả
ộ
ạ
ợ ở
ữ
ộ
ậ
ế
các lá bài là đ i t
ng không thay đ i đ
c, thì vi c đ t bí danh ít nguy hi m h n. Trong tr
ng h p
ố ượ
ổ ượ
ệ ặ
ể
ơ
ườ
ợ
này, có l ch ng có lý do nào đ thay đ i b c hay ch t c a lá bài. Thay vì v y, ta có th m i lúc l i t o ra
ẽ ẳ
ể
ổ ậ
ấ ủ
ậ
ể ỗ
ạ ạ
m t lá bài r i coi nó nh m t đ i t
ng không thay đ i đ
c. B i v y, đ i v i
ộ
ồ
ư ộ ố ượ
ổ ượ
ở ậ
ố ớ Card, vi c đ t bí danh là
ệ ặ
l a ch n h p lý.
ự
ọ
ợ
14.5 Tráo bài và chia bài
M c
Ở ụ 14.2, tôi đã vi t gi mã cho thu t toán tr n bài. Coi nh ta đã có m t ph ng
ế
ả
ậ
ộ
ư
ộ
ươ
th c
ứ shuffleDeck nh n tham s là m t c bài r i tr n nó lên, ta có th s d ng nó đ chia thành nhi u
ậ
ố
ộ ỗ
ồ ộ
ể ử ụ
ể
ề
ph n bài:
ầ
Deck deck =
new
Deck();
shuffleDeck(deck);
Deck hand1 = subdeck(deck, 0, 4);
Deck hand2 = subdeck(deck, 5, 9);
Deck pack = subdeck(deck, 10, 51);
Mã l nh này đ t 5 lá bài đ u tiên vào ph n th nh t, 5 lá bài k ti p vào ph n th hai, và ph n còn l i
ệ
ặ
ầ
ầ
ứ
ấ
ế ế
ầ
ứ
ầ
ạ
gi c .
ữ ở ỗ
Khi b n hình dung cách chia bài, b n có nghĩ r ng ta nên chia vòng tròn nh đánh bài th t không? Tôi
ạ
ạ
ằ
ư
ậ
cũng nghĩ v đi u này, song nh n th y r ng v i ch
ng trình máy tính thì nh v y không c n thi t. Quy
ề ề
ậ
ấ ằ
ớ
ươ
ư ậ
ầ
ế
t c chia vòng tròn ch đ gi m thi u kh năng tráo bài ch a kĩ và đ cho ng
i chia khó ch i ăn gian
ắ
ỉ ể ả
ể
ả
ư
ể
ườ
ơ
h n. Hai đi u này không thành v n đ đ i v i máy tính.
ơ
ề
ấ
ề ố ớ
Ví d này là l i nh c h h u ích v m t trong nh ng nguy hi m c a phép n d trong kĩ thu t: đôi khi ta
ụ
ờ
ắ ở ữ
ề ộ
ữ
ể
ủ
ẩ
ụ
ậ
quy đ nh nh ng h n ch không c n thi t lên máy tính, ho c trông ch nh ng tính năng không có s n,
ị
ữ
ạ
ế
ầ
ế
ặ
ờ
ữ
ẵ
b i ta đã không suy nghĩ khi m r ng m t hình nh n d v
t quá gi i h n c a nó r i.
ở
ở ộ
ộ
ả
ẩ
ụ ượ
ớ ạ ủ
ồ
14.6 S p x p tr n
ắ
ế
ộ
M c
Ở ụ 14.3, ta đã th y m t thu t toán s p x p đ n gi n nh ng hóa ra không hi u qu . Đ s p
ấ
ộ
ậ
ắ
ế
ơ
ả
ư
ệ
ả ể ắ
x p
ế n ph n t , nó ph i duy t m ng
ầ ử
ả
ệ
ả n l n, và m i l n duy t t n m t kho ng th i gian t l v i
ầ
ỗ ầ
ệ ố
ộ
ả
ờ
ỉ ệ ớ n. Do đó,
th i gian t ng c ng s t l v i
ờ
ổ
ộ
ẽ ỉ ệ ớ n
2
.
Trong m c này tôi phác th o m t thu t toán hi u qu h n, có tên g i
ụ
ả
ộ
ậ
ệ
ả ơ
ọ s p x p tr n
ắ
ế
ộ . Đ s p x p
ể ắ
ế n ph n
ầ
t , ph
ng pháp này t n m t th i gian t l v i
ử
ươ
ố
ộ
ờ
ỉ ệ ớ n logn. Nh v y có v ch a n t ng l m, song khi
ư ậ
ẻ ư ấ ượ
ắ
n l n
ớ
lên, hi u s gi a
ệ ố ữ n
2
và n logn có th s r t l n. Hãy th vài giá tr c a
ể ẽ ấ ớ
ử
ị ủ n xem sao.
Ý t
ng c b n phía sau phép s p x p tr n là th này: N u b n có 2 ph n bài, t ng ph n đã đ
c s p
ưở
ơ ả
ắ
ế
ộ
ế
ế
ạ
ầ
ừ
ầ
ượ ắ
x p r i, thì r t d (và nhanh chóng) đ tr n ghép chúng thành m t c bài duy nh t đ
c s p x p đúng.
ế ồ
ấ ễ
ể ộ
ộ ỗ
ấ ượ ắ
ế
Hãy th làm đi u này v i m t c bài xem sao:
ử
ề
ớ
ộ ỗ
1. Hình thành hai ph n bài v i m i ph n kho ng 10 lá r i s p x p chúng đ cho khi đ t ng a m t lên thì
ầ
ớ
ỗ
ầ
ả
ồ ắ
ế
ể
ặ
ử
ặ
các lá bài th p trên. Đ t hai ph n bài này tr
c m t b n.
ấ ở
ặ
ầ
ướ
ặ ạ
2. So sánh hai lá bài trên cùng c a m i ph n r i ch n lá bài th p h n. L t úp nó r i đ a nó vào ph n bài
ở
ủ
ỗ
ầ ồ
ọ
ấ
ơ
ậ
ồ ư
ầ
riêng đ
c s p x p.
ượ ắ
ế
3. L p l i b
c Hai đ n khi m t ph n bài đã h t. Sau đó l y nh ng lá bài còn l i r i thêm vào ph n bài
ặ ạ ướ
ế
ộ
ầ
ế
ấ
ữ
ạ ồ
ầ
đ
c s p x p.
ượ ắ
ế