THINK JAVA: CÁCH SUY NGHĨ NHƯ NHÀ KHOA HỌC MÁY TÍNH - Trang 135

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

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.

ượ ắ

ế