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.

ượ ắ

ế

Liên Kết Chia Sẽ

** Đây là liên kết chia sẻ bới cộng đồng người dùng, chúng tôi không chịu trách nhiệm gì về nội dung của các thông tin này. Nếu có liên kết nào không phù hợp xin hãy báo cho admin.