Sau đây là sơ lược về các chủ đề sẽ được đề cập trong phần này của chương trình:
+ Phần cơ sở: là các công cụ và phương pháp được dùng xuyên suốt cho tất cả các chương sau của phần này. Nó gồm một phần bàn luận ngắn về Pascal, theo sau là giới thiệu về các cấu trúc dữ liệu cơ bản gồm mảng, xâu liên kết, ngăn xếp, hàng đợi và cây. Chúng ta sẽ bàn luận về công dụng thực tiễn đệ quy và bắt đầu hướng tới việc phân tích và tiếp cận thực toán.
+ Sắp xếp: Các phương pháp sắp xếp sẽ được phát triển, được mô tả, được so sánh với nhau. Các thuật toán cho nhiều vấn đề có liên quan sẽ được xem xét gồm có hàng đợi ưu tiên, phép chọn và phép trộn. Một vài nền tảng trong số này được dùng như là nền tảng cho các thuật toán khác tiếp sau trong phần này.
+ Xử lý chuỗi: gồm một loạt các phương pháp để phân tích câu. Các ky thuật nén tập và mật mã cũng sẽ được khảo sát. Cũng vậy, một giới thiệu về các chủ đề nâng cao cùng được cung cấp qua việc xem xét một vài bài toán cơ bản quan trọng trong phạm vi của chúng.
+ Hình học: là một sự tập hợp có chọn lọc các phương pháp để giải quyết các bài toán liên quan đến điểm và đường ( và các đối tượng hình học đơn giản khác ). Chúng ta sẽ xem xét các thuật toán để tìm bao lồi của một tập điểm, phần giao của các đối tượng, để giải bài toán điểm gần nhất, tìm kiếm nhiều chiều .
+ Đồ thị: Một chiến lược tổng quát để tìm kiếm trên các đồ thị sẽ được phát triển và được áp dụng cho các bài toán liên thông cơ bản, gồm có đường đi ngắn nhất, cây liên thông tối thiểu, mạng và so khớp. Một sự xem xét thống nhất đối với các thuật toán này chứng tỏ rằng tất cả đều dựa vào một thủ tục và thủ tục này phụ thuộc vào một cấu trúc dữ liệu cơ bản đã phát triển trước đó.
+ Các thuật toán toán học: gồm các phương pháp cơ bản từ số học và các số nguyên, đa thức, và ma trận cũng như các thuật toán để giải quyết cac vấn đề toán học mà nó phát sinh trong nhiều ngữ cảnh : việc tạo số ngẫu nhiên, lỡi giải của các chương trình đồng thời, xấp xỉ dữ liệu, và lấy tích phân. Sự nhấn mạnh thiên về các khía cạnh thuật toán của phương pháp, chứ không phải trên nền tảng của toán học
+ Các chủ đề cao cấp: được thảo luận nhằm mục đích liên hệ các chủ đề trong tập sách này với nhiều lĩnh vực nghiên cứu cao cấp khác. Phần cứng chuyên dụng, quy hoạch động, quy hoạch tuyến tính, tìm kiếm- vét cạn .
20 trang |
Chia sẻ: tlsuongmuoi | Lượt xem: 3174 | Lượt tải: 2
Bạn đang xem nội dung tài liệu Đề tài Các thuật toán cơ bản về xử lý mảng trong Pascal, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
S¬ lîc vÒ c¸c chñ ®Ò
Sau ®©y lµ s¬ lîc vÒ c¸c chñ ®Ò sÏ ®îc ®Ò cËp trong phÇn nµy cña ch¬ng tr×nh:
+ PhÇn c¬ së: lµ c¸c c«ng cô vµ ph¬ng ph¸p ®îc dïng xuyªn suèt cho tÊt c¶ c¸c ch¬ng sau cña phÇn nµy. Nã gåm mét phÇn bµn luËn ng¾n vÒ Pascal, theo sau lµ giíi thiÖu vÒ c¸c cÊu tróc d÷ liÖu c¬ b¶n gåm m¶ng, x©u liªn kÕt, ng¨n xÕp, hµng ®îi vµ c©y. Chóng ta sÏ bµn luËn vÒ c«ng dông thùc tiÔn ®Ö quy vµ b¾t ®Çu híng tíi viÖc ph©n tÝch vµ tiÕp cËn thùc to¸n.
+ S¾p xÕp: C¸c ph¬ng ph¸p s¾p xÕp sÏ ®îc ph¸t triÓn, ®îc m« t¶, ®îc so s¸nh víi nhau. C¸c thuËt to¸n cho nhiÒu vÊn ®Ò cã liªn quan sÏ ®îc xem xÐt gåm cã hµng ®îi u tiªn, phÐp chän vµ phÐp trén. Mét vµi nÒn t¶ng trong sè nµy ®îc dïng nh lµ nÒn t¶ng cho c¸c thuËt to¸n kh¸c tiÕp sau trong phÇn nµy.
+ Xö lý chuçi: gåm mét lo¹t c¸c ph¬ng ph¸p ®Ó ph©n tÝch c©u. C¸c ky thuËt nÐn tËp vµ mËt m· còng sÏ ®îc kh¶o s¸t. Còng vËy, mét giíi thiÖu vÒ c¸c chñ ®Ò n©ng cao cïng ®îc cung cÊp qua viÖc xem xÐt mét vµi bµi to¸n c¬ b¶n quan träng trong ph¹m vi cña chóng.
+ H×nh häc: lµ mét sù tËp hîp cã chän läc c¸c ph¬ng ph¸p ®Ó gi¶i quyÕt c¸c bµi to¸n liªn quan ®Õn ®iÓm vµ ®êng ( vµ c¸c ®èi tîng h×nh häc ®¬n gi¶n kh¸c ). Chóng ta sÏ xem xÐt c¸c thuËt to¸n ®Ó t×m bao låi cña mét tËp ®iÓm, phÇn giao cña c¸c ®èi tîng, ®Ó gi¶i bµi to¸n ®iÓm gÇn nhÊt, t×m kiÕm nhiÒu chiÒu ...
+ §å thÞ: Mét chiÕn lîc tæng qu¸t ®Ó t×m kiÕm trªn c¸c ®å thÞ sÏ ®îc ph¸t triÓn vµ ®îc ¸p dông cho c¸c bµi to¸n liªn th«ng c¬ b¶n, gåm cã ®êng ®i ng¾n nhÊt, c©y liªn th«ng tèi thiÓu, m¹ng vµ so khíp. Mét sù xem xÐt thèng nhÊt ®èi víi c¸c thuËt to¸n nµy chøng tá r»ng tÊt c¶ ®Òu dùa vµo mét thñ tôc vµ thñ tôc nµy phô thuéc vµo mét cÊu tróc d÷ liÖu c¬ b¶n ®· ph¸t triÓn tríc ®ã.
+ C¸c thuËt to¸n to¸n häc: gåm c¸c ph¬ng ph¸p c¬ b¶n tõ sè häc vµ c¸c sè nguyªn, ®a thøc, vµ ma trËn còng nh c¸c thuËt to¸n ®Ó gi¶i quyÕt cac vÊn ®Ò to¸n häc mµ nã ph¸t sinh trong nhiÒu ng÷ c¶nh : viÖc t¹o sè ngÉu nhiªn, lìi gi¶i cña c¸c ch¬ng tr×nh ®ång thêi, xÊp xØ d÷ liÖu, vµ lÊy tÝch ph©n. Sù nhÊn m¹nh thiªn vÒ c¸c khÝa c¹nh thuËt to¸n cña ph¬ng ph¸p, chø kh«ng ph¶i trªn nÒn t¶ng cña to¸n häc
+ C¸c chñ ®Ò cao cÊp: ®îc th¶o luËn nh»m môc ®Ých liªn hÖ c¸c chñ ®Ò trong tËp s¸ch nµy víi nhiÒu lÜnh vùc nghiªn cøu cao cÊp kh¸c. PhÇn cøng chuyªn dông, quy ho¹ch ®éng, quy ho¹ch tuyÕn tÝnh, t×m kiÕm- vÐt c¹n ...
I. Sắp xếp:
1. Kh¸i niÖm:
a) S¾p xÕp lµ mét qu¸ tr×nh tæ chøc l¹i mét d·y c¸c d÷ liÖu theo mét trËt tù nhÊt ®Þnh.
b) Môc ®Ých cña viÖc s¾p xÕp lµ nh»m gióp cho viÖc t×m kiÕm d÷ liÖu mét c¸ch dÔ dµng vµ nhanh chãng. S¾p xÕp lµ mét viÖc lµm hÕt søc c¬ b¶n vµ ®îc dïng réng r·i trong c¸c kÜ thuËt lËp tr×nh nh»m sö lý d÷ liÖu.
c) C¸c gi¶i thuËt s¾p xÕp ®îc ph©n chia thµnh hai nhãm chÝnh lµ:
- S¾p xÕp trong (hay s¾p xÕp m¶ng).
Toµn bé c¬ së d÷ liÖu cÇn s¾p xÕp ph¶i ®îc ®a vµo bé nhí chÝnh cña m¸y tÝnh. Do ®ã nã thêng ®îc sö dông khi khèi lîng d÷ liÖu kh«ng vît qu¸ dung lîng bé nhí chÝnh.
Nhãm s¾p xÕp trong bao gåm c¸c ph¬ng ph¸p :
* Ph¬ng ph¸p ®Õm.
* Ph¬ng ph¸p chÌn.
* Ph¬ng ph¸p chän.
* Ph¬ng ph¸p ®æi chæ.
* Ph¬ng ph¸p trén.
- S¾p xÕp ngoµi (hay s¾p xÕp tËp tin).
VËn dông trong trêng hîp ta ph¶i s¾p xÕp c¸c tËp tin chøa nhiÒu mÉu tin vµ mçi mÉu tin cã chiÒu dµi t¬ng ®èi lín do ®ã ta kh«ng thÓ n¹p toµn bé vµo bé nhí chÝnh ®Ó s¾p xÕp thø tù. V× vËy ta ph¶i cã nh÷ng ph¬ng ph¸p thÝch hîp cho viÖc s¾p xÕp tËp tin.
2. S¾p xÕp trong:
a) Kh¸i niÖm:
CÊu tróc d÷ liÖu thÝch hîp cho c¸c phÇn tö cÇn s¾p xÕp thø tù lµ Record. Mçi phÇn tö cã hai vïng ®Æc tr¬ng lµ: Vïng Key ®Ó chøa kho¸ cña phÇn tö vµ ®îc sö dông trong c¸c gi¶i thuËt t×m kiÕm, vïng info dïng ®Ó chøa ®÷ liÖu c¸c phÇn tö.
Ta khai b¸o :
Type
Item = Record
key : Integer;
Info : Integer;
End;
Var
A : Array[1..n] of Item;
Kho¸ cña phÇn tö cã thÓ lµ ch÷ hoÆc sè.
Yªu cÇu gi¶i thÝch lµ dïng Ýt vïng nhí vµ thêi gian thùc hiÖn nhanh.
b) Ph¬ng ph¸p ®Õm (Counting sort)
* Gi¶i thÝch:
Néi dung cña ph¬ng ph¸p nµy lµ ®Õm c¸c phÇn tö cã kho¸ nhá h¬n hay b»ng kho¸ cña c¸c phÇn tö A[i]. NÕu cã j phÇn tö cã kho¸ nhá h¬n kho¸ cña phÇn tö A[i] th× phÇn tö A[i] sÏ cã vÞ trÝ theo thø tù (j+1) trong d·y ®· cã thø tù.
Trong gi¶i thuËt, ta dïng m¶ng Count[i] ( i = 1, 2, .. n ) víi Count[i] cho biÕt sè phÇn tö cã kho¸ nhá h¬n kho¸ cña phÇn tö A[i]. Nh vËy Count[i+1] lµ vÞ trÝ cña phÇn tö A[i] trong d·y ®· cã thø tù.
* VÝ dô:
S¾p xÕp d·y 2 3 1 5 2 7 6 9 4
i: 1 2 3 4 5 6 7 8
Count: 2 0 4 1 6 5 7 3
Nh vËy phÇn tö cã kho¸ 9 ë vÞ trÝ 8 v× Count[9]=7.
* ThÓ hiÖn b»ng Pascal:
Procedure Count_Sort;
Var
Count : Array[1..n] of Integer;
A : Array[1..n] of Item;
i,j : Integer;
Begin
For i := 1 to n do Count[i] := 0;
For i := n downto 2 do
For j := i-1 downto 1 do
If A[i].Key < A[j].Key Then
Count[j] := Count[j] + 1
Else Count[i] := Count[i] + 1;
For i := 1 to n do S[Count[i] + 1] := A[i];
For i := 1 to n do A[i] := S[i];
End;
c) Ph¬ng ph¸p chÌn (Insertion Sort)
* Gi¶i thÝch:
Néi dung cña ph¬ng ph¸p nµy lµ gi¶ sö ta cã d·y A[1]..A[i-1] ®· cã thø tù, cã ph¶i x¸c ®Þnh vÞ trÝ thÝch hîp cña phÇn tö A[i] trong d·y A[1]..A[i - 1] b»ng ph¬ng ph¸p t×m kiÕm tuÇn tù tõ A[i - 1] trë vÒ A[1] ®Ó t×m ra vÞ trÝ thÝch hîp cña A[i]. Ta chÌn A[i] vµo vÞ trÝ nµy vµ kÕt qu¶ lµ ®·y A[1] .. A[i] cã thø tù. Ta ¸p dông c¸ch lµm nµy víi i = 2, 3, ..., n.
* VÝ dô:
Ta ph¶i s¾p xÕp d·y sè:
39 50 7 37 89 13 1 62
i=2 39 50 7 37 89 13 1 62
i=3 39 50 7 37 89 13 1 62
i=4 7 39 50 37 89 13 1 62
i=5 7 37 39 50 89 13 1 62
i=6 7 37 39 50 89 13 1 62
i=7 7 13 37 39 50 89 1 62
i=8 1 7 13 37 39 50 89 62
1 7 13 37 39 50 89 62
* ThÓ hiÖn b»ng Pascal:
Procedure Insertion_Sort;
Var
x : Item;
i,j : Integer;
Begin
For i := 2 to n do
Begin
x := A[i];
A[0] := x;
j := j - 1;
While x.Key < A[j].Key do
Begin
A[j+1] := A[j];
j := j - 1;
End;
A[j+1] := x;
End;
End;
d) Ph¬ng ph¸p chän (Selection Sort)
* Gi¶i thÝch:
Néi dung cña ph¬ng ph¸p nµy lµ ë bíc thø i (i = 1, 2, 3, ..., n-1 ) ta lùa chän phÇn tö nhá nhÊt trong d·y A[i]..A[n] råi ®æi chæ phÇn tö nµy víi phÇn tö A[i]. Cuèi cïng ta sÏ cã d·y A[1]..A[n] cã thø tù.
* VÝ dô:
Ta ph¶i s¾p xÕp d·y sè :
39 50 7 37 89 13 1 62
i=1 39 50 7 37 89 13 1 62
i=2 1 50 7 37 89 13 39 62
i=3 1 7 50 37 89 13 39 62
i=4 1 7 13 37 89 50 39 62
i=5 1 7 13 37 89 50 39 62
i=6 1 7 13 37 50 50 39 62
i=7 1 7 13 37 39 50 89 62
1 7 13 37 39 50 89 62
* ThÓ hiÖn b»ng Pascal:
Procedure Selection_Sort;
Var
x : Item;
i,j ,k : Integer;
min : Integer;
Begin
For i := 2 to n-1 do
Begin
min := A[i].Key;
k := i;
For i := 1 to n-1 do
For j := i+1 to n do
If A[j].Key < min Then
Begin
min := A[j].Key;
k := j;
End;
x := A[k];
A[k] := A[i];
A[i] := x;
End;
End;
e) Ph¬ng ph¸p ®æi chç:
Cã rÊt nhiÒu ph¬ng ph¸p s¾p xÕp dùa trªn viÖc ®æi chç gi÷a 2 phÇn tö cña d·y. Sau ®©y chóng ta xÐt c¸c ph¬ng ph¸p:
- Bubble Sort.
- Shake Sort.
- Sell Sort.
- Quick Sort.
* Bubble Sort:
* Gi¶i thÝch:
Néi dung cña ph¬ng ph¸p nµy lµ duyÖt c¸c d·y A[1], ..., A[n]. NÕu A[i].Key > A[i+1].Key (i = 1, 2, 3, ..., n-1)#0 th× ta ®æi chç A[i].Key víi phÇn tö A[i+1].Key. LËp l¹i qu¸ tr×nh duyÖt d·y nµy cho ®Õn khi kh«ng cßn viÖc ®æi chæ cña hai phÇn tö.
Chó ý r»ng bÊt cø lóc nµo phÇn tö nhá nhÊt còng gÆp tríc tiªn. Nã nh nh÷ng bét khÝ nhÑ sÏ næi lªn trªn khi ®un níc. Sau ®ã ë thø hai phÇn tö nhá thø 2 sÏ ®îc ®Æ vµo ®óng mét vÞ trÝ. V× vËy s¾p xÕp næi bét thao t¸c nh mét kiÓu s¾p xÕp chän, mÆc dï nã kh«ng lµm nhiÒu viÖc h¬n ®Ó ®a tõng phÇn tö vµo ®óng vÞ trÝ.
* VÝ dô:
Ta ph¶i s¾p xÕp d·y sè:
39 50 7 37 89 13 1 62
Bíc 0 1 2 3 4 5 6 7
50 1 1 1 1 13 1 62
39 39 7 7 7 7 7 7
7 50 39 13 13 13 13 13
37 7 50 39 37 37 37 37
89 37 13 50 39 39 39 39
13 89 37 37 50 50 50 50
1 13 89 62 62 62 62 62
62 62 62 89 89 89 89 89
* ThÓ hiÖn b»ng Pascal:
Procedure Bubble_Sort;
Var
x : Item;
i,j : Integer;
Begin
For i := 2 to n do
For j := n downto i do
If A[j-1].Key > A[j].Key Then
Begin
x := A[j-1];
A[j-1] := A[j];
A[j-1] := x;
End;
End;
* C¶i tiÕn:
Ta nhËn thÊy r»ng nÕu ë mét lÇn duyÖt d·y nµo ®ã mµ kh«ng co s xÈy ra sù ®æi chæ gi÷a hai phÇn tö th× d·y dang s¾p ®· cã thø tù vµ gi¶i thuËt kÕt thóc.
Ta cã thÓ cµi ®Æt cê ®Ó ghi nhËn ®iÒu nµy vµ cã ch¬ng tr×nh sau:
Procedure Bubble_Sort2;
Var
x : Item;
i : Integer;
flag : Boolean;
Begin
flag := true;
While flag do
Begin
flag := False;
For i := 1 to n-1 do
If A[i].Key > A[i+1].Key Then
Begin
x := A[i];
A[i] := A[i+1];
A[i+1] := x;
End;
End;
End;
f* Shake Sort:
* Gi¶i thÝch:
Ph¬ng ph¸p nµy lµ mét c¶i tiÕn cña ph¬ng ph¸p Bubble Sort theo híng "Kh«ng nh÷ng phÇn tö nhÑ næi lªn trªn mµ c¶ phÇn tö nÆng còng xuèng díi" gièng nh khi ta rung"rung" mét c¸i nåi vµ thuËt to¸n s¾p xÕp ph¶i ®îc ®iÒu khiÓn c¶ hai qu¸ tr×nh "næi lªn" vµ "ch×m xuèng" nµy mét c¸ch tù gi¸c. Muèn vËy ta ph¶i ghi nhí lÇn ®æi chæ cuèi cïng khi duyÖt d·y tõ trªn lªn vµ khi duyÖt tõ trªn xuoãng ®Ó quyÕt ®Þnh chu tr×nh kÕ tiÕp sÏ duyÖt tõ ®©u ®Õn ®©u.
* VÝ dô:
S¾p xÕp d·y sè:
39 50 7 37 89 13 1 62
d = 2 3 3 4 4
c = 8 8 7 7 4
39 1 1 1 1
50 39 39 7 7
7 50 7 39 13
37 7 37 13 37
89 37 50 37 39
13 89 13 50 50
1 13 62 62 62
62 62 89 89 89
* ThÓ hiÖn b»ng Pascal:
Procedure Shake_Sort;
Var
x : Item;
i,k,d,c : Integer;
Begin
d := 2;
c := n;
k := n;
Repeat
For i := c downto d do
If A[i-1].Key > A[i].Key Then
Begin
x := A[i-1];
A[i-1] := A[i];
A[i-1] := x;
k := i;
End;
d := d + 1;
For i := d to c do
If A[i-1].Key > A[i].Key Then
Begin
x := A[i-1];
A[i-1] := A[i];
A[i-1] := x;
k := i;
End;
c := k-1;
Until d>c;
End;
g. * Shell Sort:
* Gi¶i thÝch:
C¸c ph¬ng ph¸p s¾p xÕp d· tr×nh bµy ë trªn nãi chung ®Òu di chuyÓn mçi phÇn tö ®i mét vÞ trÝ trong mçi bíc. Ph¬ng ph¸p Shell Sort dùa trªn ý tëng chÝnh lµ ho¸n c¸c phÇn tö ë xa nhau. §Ó lµm ®îc viÖc ®ã ta cÇn ph¶i s¾p c¸c tËp tin ®Ó nã cã tÝnh chÊt lµ viÖc lÊy mäi phÇn tö thø h (b¾t ®Çu tõ vÞ trÝ bÊt k× nµo) còng ®Òu cho ra tËp tin ®· s¾p. Mét tËp tin nh vËy ®îc gäi lµ s¾p theo ®é dµi bíc h. Mét c¸ch nãi kh¸c, mét tËp tin dîc s¾p theo ®é dµi bíc h lµ tËp tin ®îc s¾p ®éc lËp víi nhau, ®an xen vµo nhau. B»ng c¸ch s¾p xÕp theo ®é dµi bíc h øng víi vµi gi¸ trÞ h kh¸ lín, chóng ta cã thÓ di chuyÓn c¸c phÇn tö ë nh÷ng kho¶ng c¸ch xa nhau trong m¶ng vµ v× vËy dÔ dµng h¬n ®Ó s¾p xÕp ®é dµi bíc h c¸c gi¸ tri nhá h¬n. Dïng thñ tôc cho bÊt k× mét d·y c¸c gi¸ trÞ cña h tËn cïng lµ 1 sÏ cho ra mét tËp tin ®· s¾p xong: Dã chÝnh lµ Shell Sort.
* VÝ dô:
Ta ph¶i s¾p xÕp d·y sè:
39 50 7 39 89 13 1 62
Bíc 1: 4-Sort
39 50 7 39 89 13 1 62
39 13 1 37 89 50 7 62
Bíc 2: 2-Sort
39 13 1 37 89 50 7 62
1 13 7 37 39 50 89 62
Bíc 3: 1-Sort
1 13 7 37 39 50 89 62
1 7 13 37 39 50 89 62
* ThÓ hiÖn b»ng Pascal:
Chó ý:
- Ta dïng d·y phô chøa dé t¨ng h[i], ..., h[t] ®Ó ®iÒu khiÓn qu¸ tr×nh s¾p xÕp thø tù víi h[t]=1. ViÖc chén c¸c ®é t¨ng thÝch hîp sÏ lµm gi¶m thêi gian s¾p thø tù.
- DÆt h1 = h[1] ta ph¶i khai b¸o d·y a nh sau:
A : Array[1..n] of Item;
c¸c phÇn tö A[i] (i<=0) lµ c¸c lÝnh canh. Sau ®©y ta chän:
h[1] = 9, h[2] = 5, h[3] = 3, h[4] = 1
Procedure Shell_Sort;
Const
t = 4;
Var
x : Item;
i,j,k,s,m: Integer;
h : Array[1..t] of Integer;
Begin
h[1] = 9;
h[2] = 5;
h[3] = 3;
h[4] = 1;
For m := 1 to t do
Begin
k := h[m];
s := -k;
For i := k+1 to n do
Begin
x := A[i];
j := i - k;
If s = 0 Then s:=-k;
s := s + 1;
A[s] := x;
While x.Key<A[j].Key do
Begin
A[j+k] :=A[j];
j := j - k;
End;
A[j+k] := x;
End;
End;
End;
h. Quick Sort:
* Gi¶i thÝch:
Néi dung cña ph¬ng ph¸p nµy lµ chän phÇn tö x ë gi÷a cña d·y lµm chuÈn ®Ó so s¸nh. Ta ph©n ho¹ch d·y nµy thµnh 3 d·y con liªn tiÕp nhau:
- D·y con thø nhÊt gåm phÇn tö cã kho¸ nhá h¬n x.key.
- D·y con thø hai gåm c¸c phÇn tö cã kho¸ b»ng x.key.
- D·y con thø ba gåm c¸c phÇn tö cã kho¸ lín h¬n x.key.
Sau ®ã ¸p dông gi¶i thuËt ph©n ho¹ch nµy cho d·y con thø nhÊt nhÊt vµ d·y con thø ba, nÕu c¸c d·y con cã nhiÒu h¬n mét phÇn tö (§Ö qui).
Cô thÓ lµ xÐt mét do¹n cña d·y tõ thµnh phÇn L ®Õn thµnh phÇn thø R.
- LÊy gi¸ trÞ cña thµnh phÇn thø (L+R) Div 2 g¸n vµo biÕn X.
- Cho i ban ®Çu lµ L.
- Cho j ban ®Çu lµ R.
- LËp l¹i.
* Chõng nµo cßn A[i] < X th× t¨ng i.
* Chõng nµo cßn A[j] > X th× gi¶m j.
* i<=j th×
+ Ho¸n vÞ A[i] vµ A[j]
+ T¨ng i
+ Gi¶m j
Cho ®Õn khi i>j
+ S¾p xÕp ®o¹n tõ A[L] ®Õn A[j]
+ S¾p xÕp ®o¹n tõ A[i] ®Õn A[R]
* VÝ dô:
S¾p xÕp d·y sè:
39 50 7 37 89 13 1 62
X = 37
Sau 2 lÇn ®æi chæ ta ®îc d·y:
1 13 7 37 89 50 39 62
Xö lý d·y con:
1 13 7
Ta ®îc:
1 7 13
Sö lý d·y con:
89 50 39 62
Ta ®îc:
39 50 89 62
39 50 62 89
VËy d·y ®· s¾p xÕp lµ:
1 7 13 39 50 62 89
* ThÓ hiÖn b»ng Pascal:
§Ó ®¬n gi¶n ta viÕt thñ tôc s¾p mét m¶ng sè nguyªn ®îc truyÒn tham biÕn.
Procedure Quick_Sort(Var A : Array[1..n] of Integer);
Procedure Sort(L,R : Integer);
Var
i,j,Tg,X : Integer;
Begin
X := A[(L+R) Div 2];
i := L;
j := R;
Repeat
While (A[i] < X) do Inc(i);
While (A[j] > X) do Dec(j);
If i <= j Then
Begin
Tg := A[i];
A[i] := A[j];
A[j] := Tg;
Inc(i);
Dec(j);
End;
Until i>j;
If L < j Then Sort(L,j);
If i < R Then Sort(i,R);
End;
Begin
Sort(1,n);
End;
i. Ph¬ng ph¸p trän (Merging Sort)
* Gi¶i thÝch:
Néi dung cña ph¬ng ph¸p nµy lµ chia d·y sè cÇn s¾p thµnh c¸c d·y con ®· cã thø tù(goi lµ c¸c Run) vµ cã sè phÇn tö lµ luü thõa 2 sau ®ã t×m c¸ch trén dÇn chóng víi nhau thµnh c¸c Run cã thø tù chiÒu dµi t¨ng dÇn cho ®Õn khi chØ cßn mét Run th× qu¸ tr×nh s¾p xÕp kÕt thóc.
Ta cã gi¶i thuËt sau ®©y ®Ó trén 2 Run x vµ y cïng thø tù cã chiÒu dµi lÇn lît lµ m vµ n thµnh mét run z cã chiÒu dµi lµ m + n.
Procedure Merge;
Var
i,j,k : Integer;
Begin
i := 1;
j := 1;
k := 1;
While (i <= m) and (j <= n) do
Begin
If X[i] < Y[j] Then
Begin
Z[k] := X[j];
i := i + 1;
End
Else
Begin
Z[k] := Y[j]
j := j + 1;
End;
k := k + 1;
End;
While i<=m do
Begin
Z[k] := X[j];
k := k + 1;
i := i + 1;
End;
While j<=n do
Begin
Z[k] := X[j];
k := k + 1;
j := j + 1;
End;
End;
Cô thÓ lµ nÕu ta ph¶i s¾p xÕp d·y: A[1], A[2], ...,A[n].
Ta ph¶i sö dông 2*n phÇn tö ®îc chia thµnh 2 vïng. Vïng 1 gåm c¸c phÇn tö A[1] .. A[n], vïng 2 gåm c¸c phÇn tö A[n+1] .. A[2*n]. Ta trén c¸c Run tõ vïng nµy vµ ph©n phèi vµo vïng kia. Khi trén vµ ph©n phèi, ta trén c¸c Run ngîc chiÒu nhau cña vïng trén vµ ph©n phèi lu©n phiªn vµo 2 ®Çu cña vïng ph©n phèi bíc kÕ tiÕp dÔ trén h¬n. Qu¸ tr×nh s¾p xÕp sÏ kÕt thóc nÕu vïng ph©n phèi chØ cßn mét Run. Khi kÕt thóc, nÕu vïng ph©n phèi gåm c¸c phÇn tö A[n+1] .. A[2*n] th× ta chÐp d·y A[n+1] .. A[2*n] vµo d·y A[1] .. A[n]
ThÓ hiÖn b»ng Pascal
Procedure mergesort ( l , r : integer );
Var i , j , k , m: integer;
Begin
If r-l>0 then
Begin
m := (r+l) div 2;
mergesort (l,m); mergesort (m+1,r);
for i:=m downto l do b [i] := a [i];
for j:=m+1 to r do b [r+m+1-j] := a [j];
for k := l to r do
if b[i] < b [j] then
begin a [k] := b[i]; i:=i+1; end else
begin a [k] := b[j]; j:=j-1; end;
end;
End;
End;
II. Hình học:
- §iÓm lµ ®èi tîng c¬ së trong h×nh häc. Mçi ®iÓm mµ chóng ta xÐt sau ®©y ®îc biÓu diÔn b»ng mét cÆp sè nguyªn- to¹ ®é ®iÓm ®ã trong hÖ trôc Descart thêng dïng.
- Mét ®o¹n th¼ng lµ mét cÆp ®iÓm ®îc nèi víi nhau bëi 1 phÇn cña ®êng th¼ng.
- Mét ®a gi¸c lµ mét danh s¸ch c¸c ®iÓm, víi hai ®iÓm c¹nh nhau ®îc nèi bëi mét ®êng th¼ng vµ ®iÓm ®Çu nèi víi ®iÓm cuèi t¹o thµnh mét h×nh ®ãng.
Th«ng thêng chóng ta dïng mét m¶ng ®Ó biÓu diÔn mét ®a gi¸c, dï r»ng trong mét sè trêng hîp ta cã thÓ dïng danh s¸ch liªn kÕt hay c¸c kiÓu kh¸c. HÇu hÕt trong c¸c ch¬ng tr×nh chóng ta dïng kiÓu sau ®©y:
Type point = record x , y : integer; end;
line = record p1 , p2 : pointer; end;
Var polygon : array [0 .. nmax] of point;
Chó ý r»ng c¸c ®iÓm ®îc biÓu diÔn trªn to¹ ®é nguyªn, còng cã thÓ dïng sè thùc nhng dïng täa ®é nguyªn th× thuËt to¸n sÏ ®¬n gi¶n h¬n nhiÒu vµ phÐp tÝnh thùc hiÖn nhanh h¬n ®¸ng kÓ.
NhiÒu ®èi tîng h×nh häc phøc t¹p sÏ ®îc biÓu diÔn dùa trªn c¸c phÇn tö c¬ së nµy.
1/Giao c¸c ®o¹n th¼ng:
Trong bµi häc s¬ cÊp ®Çu tiªn, chóng ta sÏ xÐt xem 2 ®o¹n th¼ng cã giao nhau hay kh«ng. Mét ph¬ng ph¸p dÔ hiÓu ®Ó gi¶i quyÕt bµi to¸n nµy lµ t×m giao ®iÓm cña c¸c ®êng th¼ng x¸c ®Þnh bëi c¸c ®o¹n th¼ng ®ã råi kiÓm tra xem nã cã n»m gi÷a hai ®iÓm ®Çu cña hai ®o¹n th¼ng ®ã hay kh«ng. Mét c¸ch dÔ dµng kh¸c lµ xem thö xem ®êng ®i tõ ®iÓm thø nhÊt sang ®iÓm thø 2 råi sang ®iÓm thø 3 theo chiÒu kim ®ång hå hay ngîc chiÒu kim ®ång hå:
Function ccw ( p0 , p1 , p2 : pointer ) : integer;
Var dx1 , dx2 , dy1 , dy2 : integer;
Begin
dx1:=p1.x; dy1:=p1.y-p0.y;
dx2:=p2.x; dy2:=p2.y-p0.y;
If dx1*dy2>dy1*dx2 then ccw:=1;
If dx1*dy2<dy1*dx2 then ccw:=1;
If dx1*dy2=dy1*dx2 then
Begin
If (dx1*dx2<0) or (dy1*dy2<0) then ccw:=-1 else
If (dx1*dx1+dy1*dy1) >= (dx2*dx2+dy2*dy2) then
ccw := 0 else ccw := 1;
End;
End;
§Ó hiÓu ®îc ch¬ng tr×nh ho¹t ®éng nh thÕ nµo, ®Çu tiªn ta gi¶ sö tÊt c¶ c¸c gi¸ trÞ dx1 , dx2 , dy1 , dy2 ®Òu d¬ng. Sau ®ã nhËn xÐt r»ng ®é dèc cña ®êng nèi p0 víi p1 lµ dy1 / dx1, cña ®êng nèi p0 víi p2 lµ dy2 / dx2. Do ®ã, nÕu ®é dèc cña ®êng thø hai lín h¬n ®êng thø nhÊt th× ®êng ®i tõ p0 sang p1 , p2 lµ ngîc chiÒu kim ®ång hå vµ ngîc l¹i. So s¸nh ®é dèc h¬i bÊt tiÖn v× ®êng cã thể theo ph¬ng th¼ng ®øng ( dx1 hay dx2 = 0 ), chóng ta tÝnh tÝch dx1 * dx2 ®Ó tr¸nh trêng hîp nµy. Do ®ã ®é dèc kh«ng cÇn ph¶i d¬ng míi ®óng. Hµm ccw tr¶ l¹i gi¸ trÞ 0 cho trêng hîp p2 ë gi÷a p0 vµ p1, b»ng -1 nÕu p0 ë gi÷a p2 vµ p1 vµ nÕu p1 ë gi÷a p0 vµ p2 th× chóng ta g¸n ccw = 1.
Chóng ta cã thÓ dïng trùc tiÕp ccw ®Ó cµi ®Æt hµm intersect ( xÐt giao nhau ). NÕu c¶ hai ®Çu cña mét ®o¹n th¼ng ë hai bªn ®o¹n kia, nghÜa lµ cã gi¸ trÞ ccw kh¸c nhau th× chóng giao nhau:
Function intersect ( l1 , l2 : line ) : boolean;
Begin
intersect:=(( ccw(l1.p1,l1.p2,l2.p1)
* ccw(l1.p1,l1.p2,l2 .p2)) <= 0)
and (( ccw(l1.p1,l1.p2,l2 .p1)
* ccw(l1.p1,l1.p2,l2 .p2)) <= 0);
End;
Gi¶i ph¸p nµy cã vÏ ®· dïng mét sè lîng lín tÝnh to¸n ®Ó gi¶i quyÕt mét bµi to¸n ®¬n gi¶n. Ngêi ®äc h·y m¹nh d¹n thö t×m mét ph¬ng ph¸p ®¬n gi¶m h¬n nhng chó ý ph¶i ®Çy ®ñ c¸c trêng hîp.
2/ §êng khÐp kÝn ®¬n:
§Ó thÊy ®îc ®Æc ®iÓm riªng cña bµi to¸n øng víi tËp hîp c¸c ®iÓm, chóng ta xÐt bµi to¸n t×m mét ®êng ®i, qua mét tËp hîp n ®iÓm x¸c ®Þnh, qua tÊt c¶ c¸c ®iÓm, kh«ng giao nhau vµ cuèi cïng trë vÒ ®iÓm b¾t ®Çu. §êng ®i nh trªn gäi lµ ®êng khÐp kÝn ®¬n.
§Ó gi¸i quyÕt bµi to¸n nµy ta ph¶i chän mét ®iÓm lµm "®iÓm gèc". Sau ®ã tÝnh gãc t¹o b»ng c¸ch vÏ mét ®êng tõ mçi ®iÓm trong tËp hîp ®Õn gèc vÏ ra theo ph¬ng ngang. Sau ®ã, s¾p thø tù c¸c ®iÓm theo thø tù t¨ng dÇn cña gãc t¬ng øng, cuèi cïng nèi c¸c ®iÓm c¹nh nhau l¹i.
Gäi dx , dy lµ kho¶ng c¸ch tõ ®iÓm gèc ®Õn mét ®iÓm kh¸c theo trôc hoµnh vµ tung th× gãc cÇn tÝnh trong gi¶i thuËt nµy lµ cotan dy / dx. Nhng hµm nµy cã vÏ chËm, v× vËy ta cã thÓ thay b»ng mét hµm kh¸c t¬ng tù nhng dÔ tÝnh h¬n, ®ã lµ dy / ( dy + dx ). Ch¬ng tr×nh sau tr¶ l¹i gi¸ trÞ tõ 0 ®Õn 360, kh«ng ph¶i lµ gãc t¹o bëi p1 vµ p2 so víi ph¬ng ngang nhng cã cïng thuéc tÝnh nh gãc ®ã.
Function theta ( p1 , p2 : pointer ) : real;
Var dx , dy , ax , ay : integer;
Begin
dx:=p2.x - p1.x; ax:= abs(dx);
dy:=p2.y - p1.y; ay:= abs(dy);
If (dx=0) and (dy=0) then t:=0 else
t:=dy/(ax+ay);
If dx < 0 then t:=2-t else
If dy < 0 then t:=4+t;
theta := t*90;
End;
3/ §iÓm n»m trong ®a gi¸c:
TiÕp theo, chóng ta sÏ xÐt mét bµi to¸n rÊt tù nhiªn: cho mét ®iÓm vµ mét ®a gi¸c biÓu diÔn b»ng mét m¶ng c¸c ®iÓm, x¸c ®Þnh xem ®iÓm nµy n»m trong hay ngoµi ®a gi¸c. Mét gi¶i ph¸p dÔ hiÓu ®Ó gi¶i bµi to¸n nµy lµ vÏ mét ®äan th¼ng dµi b¾t ®Çu tõ ®iÓm ®ã theo mét híng bÊt kú vµ ®Õm sè lîng ®o¹n th¼ng t¹o ®îc do nã c¾t qua ®a gi¸c. NÕu lµ sè lÏ, ®iÓm ®ã n»m trong ®a gi¸c vµ ngîc l¹i. ®iÒu nµy dÔ thÊy nÕu chóng ta theo dâi nh÷ng g× x·y ra khi ®i tõ mét ®iÓm n»m ngoµi ®a gi¸c.
Tuy nhiªn, kh«ng ph¶i chØ nh thÕ, bëi v× mét sè giao ®iÓm cã thÓ trïng víi ®a gi¸c, hoÆc ®o¹n th¼ng dïng ®Ó kiÓm tra trïng víi mét c¹nh cña ®a gi¸c.
Nhu cÇu xö lý c¸c t×nh huèng khi c¸c ®Ønh c¶u ®a gi¸c r¬i trªn ®o¹n th¼ng kiÓm tra buéc chóng ta ph¶i lµm nhiÒu h¬n lµ chØ ®Õm sè giao ®iÓm cña c¸c c¹nh ®a gi¸c víi ®o¹n th¼ng kiÓm tra. Thùc chÊt, chóng ta muèn ®i vßng quanh ®a gi¸c, t¨ng mét biÕn ®Õm khi nµo ta di tõ mét bªn cña ®o¹n th¼ng kiÓm tra sang mét bªn kh¸c. Mét c¸ch ®Ó thùc hiÖn lµ ®¬n gi¶n bá qua c¸c ®iÓm r¬i trªn ®o¹n th¼ng kiÓm tra, nh trong ch¬ng tr×nh sau ®©y:
Function inside (t:point):boolean;
Var count,i,j:integer;
lt,lp:line;
Begin
count:=0; j:=0; p[0]:=p[N]; p[N+1]:=p[1];
lt.p1:=t; lt.p2:=t; lt.p2.x:=maxint;
For i:=1 to N do
Begin
lp.p1 := p [i]; lp.p2 := p [i];
If not intersect (lp,lt) then
Begin
lp . p2 := p [j]; j := i;
If intersect (lp,lt) then count := count + 1;
End;
End;
inside := ((count mod 2) = 1);
End;
Ch¬ng tr×nh nµy dïng ®êng th¼ng kiÓm tra theo ph¬ng ngang ®Ó dÔ tÝnh to¸n. BiÕn j ®îc dïng ®Ó lu tr÷ chØ sè cña ®iÓm cuèi cïng cña ®a gi¸c mµ kh«ng n»m trªn ®o¹n kiÓn tra. Ch¬ng tr×nh gi¶ sö r»ng p [ 1 ] lµ ®iÓm cã täa ®é x nhá nhÊt trong sè tÊt c¶ c¸c ®iÓm cã täa ®é y nhá nhÊt, v× vËy nÕu p [ 1 ] n»m trªn ®o¹n kiÓm tra th× p [ 0 ] kh«ng thÓ. Cïng mét ®a gi¸c cã thÓ biÓu diÔn b»ng N m¶ng kh¸c nhau, nhng ®iÒu nµy cho thÊy ¸p dông mét quy luËt chuÈn cho p [ 1 ] ®«i khi l¹i tiÖn lîi. NÕu ®iÓm kÕt tiÕp trªn ®a gi¸c mµ kh«ng n»m trªn ®o¹n kiÓm tra, ë cïng mét phÝa nh ®iÓm thø j ®èi víi ®o¹n kiÓm tra th× chóng ta kh«ng cÇn ph¶i t¨ng biÕn ®Õm giao ®iÓm ( count ). Ngîc l¹i, chóng ta cã ®îc mét giao ®iÓm.
NÕu ®a gi¸c chØ cã 3 hay 4 c¹nh, thêng gÆp trong nhiÒu øng dông th× mét ch¬ng tr×nh phøc t¹p nh vËy sÏ kh«ng ®îc sö dông, mét thñ tôc ®¬n gi¶n ®Æt c¬ së trªn viÖc gäi ccw sÏ thÝch hîp h¬n. Mét trêng hîp ®Æc biÖt quan träng kh¸c l¸ ®èi víi ®a gi¸c låi, ®îc xÐt trong ch¬ng kÕ, nã cã ®Æc ®iÓm lµ kh«ng cã ®o¹n kiÓm tra nµo cã h¬n 2 giao ®iÓm víi ®a gi¸c. Trong trêng hîp nµy, mét thñ tôc nh t×m nhÞ ph©n cã thÓ dïng ®Ó x¸c ®Þnh trong O ( log N ) bíc ®Ó biÕt ®îc ®iÓm cã ë bªn trong hay kh«ng.
III. Cặp ghép:
1. Giíi thiÖu chung:
XÐt hai t¹p h÷u h¹n X, Y gåm n phÇn tö:
X= { x1, x2, ... xn }
Y= { y1, y2, ... yn }
CÆp phÇn tö (x, y) víi x thuéc X, y thuéc Y ®îc gäi lµ mét cÆp ghép. Hai cÆp ghép (x , y) vµ (x1, y1) ®îc gäi lµ rêi nhau nÕu x # x1 vµ y # y1. TËp M gåm c¸c cÆp ghÐp rêi nhau ®îc gäi lµ mét tËp cÆp ghÐp.
Th«ng thêng bµi to¸n x©y dùng c¸c cÆp ghÐp ®îc tiÕp cËn theo 2 híng: HoÆc tho¶ m·n mét sè ®iÒu kiÖn ghÐp cÆp nµo ®Êy, khi ®ã ngêi ta quan t©m ®Õn kh¶ n¨ng ghÐp cÆp tèi ®a, hoÆc lîng ho¸ viÖc ghÐp cÆp, khi ®ã ngêi ta quan t©m ®Õn viÖc tèi u ho¸ theo c¸c gi¸ trÞ ®· lîng ho¸.
V× sè tËp cÆp ghÐp lµ h÷u h¹n, nªn cã mét ph¬ng ph¸p x©y dùng tÇm cì lµ thö tÊt c¶ c¸c kh¶ n¨ng. Tuy nhiªn, sè kh¶ n¨ng nh vËy rÊt lín (cì n!). V× thÕ, ngêi ta quan t©m ®Õn viÖc t×m kiÕm nh÷ng thuËt gi¶i h÷u hiÖu, dÔ cµi ®Æt ch¬ng tr×nh vµ cã tÝnh kh¶ thi cao. Bµi to¸n nµy nh»m giíi mét sè mô h×nh ghÐp cÆp nh vËy.
2. CÆp ghÐp ®Çy ®ñ tèi u
a. Giíi thiÖu bµi to¸n
Mét cÆp ghÐp, sao cho tÊt c¶ c¸c phÇn tö cña X vµ Y ®Òu ®îc ghÐp cÆp (nghÜa lµ cã ®ñ n cÆp víi n lµ sè phÇn tö cña X vµ Y), ®îc gäi lµ ghÐp cÆp ®Çy ®ñ.
Râ rµng mçi song ¸nh p: X -> Y x¸c ®Þnh mét tËp ghÐp cÆp ®Çy ®ñ, trong ®ã mçi cÆp ghÐp ®îc viÕt díi d¹ng (x , p(x)), x thuéc X. Tõ ®ã suy ra cã tÊt c¶ n! c¸ch x©y dùng tËp cÆp ghÐp ®Çy ®ñ kh¸c nhau.
Víi c¸c tËp cÆp ghÐp ®Çy ®ñ, mét c¸ch tù nhiªn, ngêi ta quan t©m ®Õn tËp cÆp ghÐp "tèt nhÊt" theo mét nghÜa nµo ®ã ®· ®îc lîng ho¸. TËp cÆp ghÐp nµy ®îc gäi lµ "TËp cÆp ghÐp ®Çy ®ñ vµ tèi u",
Bµi to¸n t×m cÆp ghÐp ®Çy ®ñ tèi u cã nhiÒu m« h×nh øng dông thùc tÕ. Mét trong nh÷ng m« h×nh nµy ngêi ta quan t©m dÕn viÖc ghÐp cÆp sao cho cã hiÖu qña nhÊt.
§Ó lîng ho¸ viÖc ghÐp cÆp mçi phÇn tö x thuéc X víi mét phÇn tö y thuéc Y, ngêi ta ®a vµo ma trËn träng sè Cij (i,j = 1, 2, .., n) víi ý nghÜa Cij m« t¶ hiÖu qu¶ cña viÖc ghÐp xi víi þ. Bµi to¸n ®îc ®Æt ra lµ: X©y dùng mét tËp cËp ghÐp ®Çy dñ cã tæng hiÖu qu¶ lín nhÊt.
Bµi to¸n võa nªu thêng ®îc ph¸t biÓu díi d¹ng mét m« h×nh thùc tÕ lµ bµi to¸n ph©n c«ng díi ®©y:
Bµi to¸n ph©n c«ng: Cã n ngêi vµ n c«ng viÖc. BiÕt Cij lµ sè tiÒn lµm ra nÕu giao c«ng viÖc j cho ngêi thø i thùc hiÖn. H·y t×m c¸ch ph©n c«ng mçi ngêi mçi viÖc ®Ó tæng sè tiÒn lµm ra lµ lín nhÊt.
b. Ph¬ng ph¸p tham lam
§©y lµ mét ph¬ng ph¸p gÇn ®óng, xuÊt ph¸t tõ viÖc chän tèi u trong tõng bíc v× thÕ nã kh«ng ®¶m b¶o ®îc tÝnh tèi u toµn côc. Tuy nhiªn, nã cho ngay mét ph¬ng ¸n, gÇn ®óng víi ph¬ng ¸n tèi u:
1. XuÊt ph¸t tõ b¶n Cij ®ãng vai trß b¶ng hiÖn hµnh. TËp cÆp ghÐp ®îc khëi g¸n b»ng rçng.
2. T×m dßng i cét j ra khái b¶ng hiÖn hµnh vµ lÆp l¹i bíc thø 2 cho ®Õn khi b¶ng rçng.
3. Xo¸ dßng i, cét j ra khái b¶ng hiÖn hµnh vµ lÆp l¹i bíc 2 cho ®Õn khi b¶ng rçng.
ThÝ dô, xÐt b¶ng träng sè víi n = 4:
2 5 1 6
8 7 6 4
6 9 3 5
5 1 2 7
c¸c cÆp ghÐp ®îc chän lÇn lît lµ (1 8 9 7)
(x3, y2), (x2, y1), (x4, y4), (x1, y3).
Víi ph¬ng ¸n trªn ta cã tæng träng sè lµ 25. Trêng hîp nµy c¸c c¸ch ghÐp t×m ®îc cha ph¶i lµ cÆp ghÐp ®Çy ®ñ vµ tèi u( xem l¹i vÝ dô nµy ë díi).
c. ĐÞnh lý c¬ së
ViÖc x©y dùng tËp cÆp ghÐp ®Çy ®ñ tèi u dùa vµo dÊu hiÖu nhËn biÕt mét tËp ghÐp ®Çy ®ñ khi nµo lµ tèi u. DÜ nhiªn viÖc thö dÊu hiÖu nµy kh«ng ph¶i lµ viÖc so s¸nh víi tÊt c¶ c¸c cÆp ghÐp, mµ ph¶i ®îc mang tÝnh kh¶ thi. §Ó lam ®iÒu nµy ngêi ta x©y dùng hµm sè F, x¸c ®Þnh trªn tËp cña c¸c phÇn tö Xi thuéc X , Yj thuéc Y , mµ ta sÏ gäi lµ nh·n cña c¸c phÇn tö . Nh·n F ®îc gäi lµ nh·n chÊp nhËn ®îc nÕu thâa m·n bÊt ®¼ng thøc F(Xi)+F(Yj)>=Cij víi mäi Xi thuéc X , Yj thuéc Y . TËp cÆp ghÐp M vµ nh·n F ®îc gäi lµ t¬ng thÝch víi nhau nÕu tho· m·n ®¼ng thøc F(Xi)+F(Yj)=Ci víi mäi (Xi,Yj)thuéc M , Noi riªng , tËp cÆp ghÐp rçng ®îc xem nh t¬ng thÝch víi mäi nh·n .
§Þnh lý: TËp cÆp ghÐp ®Çy ®ñ M* lµ tèi u khi tån t¹i nh·n F chÊp nhËn ®îc lµ t¬ng thÝch víi nã .
Dùa vµo ®Þnh lý võa chøng minh , ngêi ta cã 2 híng tiÕp cËn cÆp ghÐp ®Çy ®ñ tèi u :
* Mét lµ , xuÊt ph¸t tõ cÆp ghÐp ®Çy ®ñ M nµo ®ã , ngêi ta x©y dùng mét nh·n F t¬ng thÝch víi M . NÕu F chÊp nhËn ®îc , th× M tèi u . Tr¸i l¹i , ngêi ta ®iÒu chØnh M cho ®Õn khi F t¬ng thÝch lµ chÊp nhËn ®îc khi ®ã M lµ téi u .
* Hai lµ , xuÊt ph¸t tõ mét nh·n F chÊp nhËn ®îc vµ mét cÆp ghÐp M bÊt kú t¬ng øng víi F ( cã thÓ rçng ) , ngêi ta t¨ng dÇn sè cÆp ghÐp M sao cho vÉn ®¶m b¶o tim ®îc nh·n F t¬ng thÝch víi M chÊp nhËn ®îc . Qu¸ tr×nh t¨ng sÏ kÕt thóc khi M ®Çy ®ñ vµ khi ®ã M lµ tèi u .
Díi ®©y tr×nh bÇy mét thuËt to¸n tim cÆp ghÐp ®Çy ®ñ téi u theo híng thø hai .
d. ThuËt to¸n Kuhn-Munkes
Néi dung chñ yÕu cña ph¬ng ph¸p lµ xuÊt ph¸t tõ mét tËp cÆp ghÐp nµo ®ã cha ®©ú ®ñ (co thÓ lËp hîp rçng ) , ta t¨ng dÇn sè cÆp ghÐp sao cho khi trë thµnh ®Çy ®ñ , c¸c cÆp ghÐp thu ®îc còng ®ång thêi tho· m·n tÝnh tèi u . Cã nhiÒu h×nh thøc tr×nh bµy ph¬ng ph¸p nµy . Díi ®©y lµ c¸ch tr×nh bÇy trªn ng«n ng÷ ®å thÞ víi c¸c thao t¸c t×m kiÕm . C¸ch nµy cã nhiÒu u ®iÓm : trùc gi¸c , dÔ ph¸p biÓu , dÓ chøng minh vµ ®Æc biÖt , dÓ cµi ®Æt ch¬ng tr×nh v× viÖc t×m dêng trªn ®å thÞ lµ mét thao t¸c c¬ b¶n vµ quen thuéc .
Gi¶ sö F lµ mét nh·n chÊp nhËn ®îc vµ M mét tËp cÆp ghÐp t¬ng thÝch víi F . Xem c¸c phÇn tö cña X vµ Y nh nh÷ng ®Ønh cña ®å thÞ cã hai híng (mét phÝa X mét phÝa Y ). C¸c c¹nh cña ®å thÞ nµy ®îc x¸c ®Þnh tuú thuéc néi dung cña nh·n F vµ tËp cÆp ghÐp M nh sau :
- Mçi cÆp phÇn tö Xi thuéc X , Yj thuéc Y tho· m·n ®¼ng thøc F(Xi)+F(Yj)=Cij sÏ x¸c ®Þnh mét c¹nh cña ®å thÞ ,
- C¹nh nµy cã híng tõ X sang Y nÕu cÆp (Xi ,Yj) kh«ng thuéc M gäi (lµ c¹nh thuËn) vµ ngîc l¹i , cã xu híng tõ Y sang X nÕu cÆp (Xi ,Yj) thuéc M (gäi lµ c¹nh nghÞch).
§å thÞ x©y dùng theo quy t¾c võa nªu ®îc gäi lµ ®å thÞ c©n b»ng t¬ng øng víi F , M vµ ®îc ký hiÖu lµ G(F,M).
Bíc 1:
Khëi t¹o : X©y dùng ®îc nh·n F chÊp nhËn ®îc nh sau :
F( xi ) := Max {C[ i , j ] , yj thuéc Y }
F( yj ) := 0 yj thuéc Y
M lµ tËp cÆp ghÐp rçng .
Chó ý r»ng , cã thÓ xuÊt ph¸p tõ bÊt kú nh·n F nµo chÊp nhËn ®îc vµ bÊt ký mét tËp cÆp ghÐp M nµo t¬ng øng víi F.
Bíc 2:
T×m ®Ønh tù do thuéc X: T×m ®Ønh u thuéc X cha ®îc ghÐp cÆp. NÕu kh«ng cßn ®Ønh nµo cña X cha ghÐp cÆp th× kÕt thóc, tËp cÆp ghÐp M hiÖn hµnh lµ tËp cËp ghÐp tèi u. Tr¸i l¹i sang bíc tiÕp theo.
Bíc 3:
XuÊt ph¸t tõ u, thùc hiÖn viÖc t×m kiÕm trªn ®å thÞ G(F, M). KÕt qu¶ t×m ®îc cã hai trêng hîp sau:
- NÕu ®Õn ®îc mét ®Ønh z thuéc Y cha ghÐp cÆp th× ghi nhËn ®êng ®i tõ u -> z (gäi lµ ®êng t¨ng cÆp ghÐp) vµ chuyÓn sang bíc t¨ng cÆp ghÐp trªn ®êng ®i nµy.
- NÕu kh«ng tån t¹i mét ®êng ®Þ nh vËy th× chuyÓn sang bíc söa nh·n F.
Bíc 4:
T¨ng cÆp ghÐp: §iÒu chØnh M nh sau:
- Gi÷ nguyªn nh÷ng cÆp ghÐp cña M n»m ngoµi ®êng t¨ng cÆp ghÐp
- Trªn ®êng t¨ng cÆp ghÐp, thay ®æi nh÷ng cÆp ghÐp cña M (c¹nh ngîc) b¨ng nh÷ng cÆp ghÐp c¹nh thuËt (vÒ mÆt ®å thÞ nghÜa lµ ®æi chiÒu c¸c c¹nh trªn ®êng t¨ng cÆp ghÐp)
Sau bíc nµy, sè cÆp ghÐp thuéc M ®îc t¨ng them 1 vµ ®Ønh u trë thµnh ®· ghÐp cÆp, ngoµi ra, tÝnh t¬ng thÝch gi÷a F vµ M vÉn ®îc b¶o toµn. Sau ®ã quay l¹i bíc 2 ®Ó thùc hiÖn viÖc söa nh·n tù do kh¸c.
Bíc 5: Söa nh·n:
Gäi S lµ tËp c¸c ®Ønh thuéc X vµ T lµ tËp cÆp ghÐp thuéc Y ®· ®îc ®i trong qu¸ tr×nh t×m ®êng ®i ë bíc 3. ViÖc söa nh·n ®îc tiÕn hµnh nh sau:
- T×m lîng söa nh·n:
d := Min { F(xi) + F(yj) - C[i,j] , yj thuéc T}
- G¸n l¹i nh·n:
F(xi) := F(xi) - d víi xi thuéc S
F(yj) := F(yj) + d víi yj thuéc T
Sau ®ã, quay trë l¹i bíc 3 ®Ó lÆp l¹i t×m ®êng t¨ng cÆp ghÐp (víi ®Ønh xuÊt ph¸t u cò vµ nh·n F míi).
Chó ý r»ng, sau khi thay ®æi, nh·n F vÉn gi÷ nguyªn tÝnh chÊp nhËn ®îc vµ tÝnh t¬ng thÝch M. Ngoµi ra cã thªm Ýt nhÊt mét cÆp (xi, yj) tho¶ m·n F(xi) + F(yj) = C[i,j], v× thÕ, sau mét sè lÇn ®æi s÷a nh·n, ch¾c ch¾n sÏ t¨ng ®îc cÆp ghÐp.
Díi ®©y lµ s¬ ®å minh ho¹ c¸c bíc ®· nªu:
(S¬ ®å)
NhËn xÐt r»ng, khi t¨ng cÆp ghÐp, c¸c ®Ønh ®· ®îc tiÕn ghÐp cÆp råi kh«ng bao giê trë thµnh tù do, v× thÕ viÖc t×m ®Ønh tù do cã thÓ ®îc tiÕn hµnh tuÇn tù. Qu¸ tr×nh t×m tËp cÆp ghÐp ®Çy ®ñ tèi u cã thÓ ®îc m« pháng qua do¹n ch¬ng trinh sau:
FOR
IF THEN
BEGIN
WHILE NOT
DO
END;
e. VÝ dô
Quay trá l¹i thÝ dô tríc. Nh·n F chÊp nhËn ban ®Çu lµ:
F 0 0 0 0
6 2 5 1 6
8 8 7 6 4
9 6 9 3 5
7 5 1 2 7
XuÊt ph¸t tõ cÆp ghÐp M rçng, lÇn lît t¨ng cÆp ghÐp cho c¸c ®Ønh tù do x1, x2, x3, ta nhËn ®îc
M={ (x1, y4), (x2, y1), (x3, y2) } vµ ®å thÞ G(F,M) t¬ng øng:
ViÖc t×m ®êng t¨ng cÆp ghÐp t¬ng ®èi víi ®Ønh tù do x4 kh«ng t×m thÊy vµ cho ta c¸c tËp S = {x1, x4}, T ={y4). TiÕn hµnh s÷a nh·n trªn c¸c tËp cÆp ghÐp nµy, ta ®îc d=1 vµ nh·n F míi lµ
F 0 0 0 1
5 2 5 1 6
8 8 7 6 4
9 6 9 3 5
6 5 1 2 7
nh·n F nµy thªm ®îc c½p1, y2 tho¶ m·m F(x1) + F(x2) = C[1,2] vµ ta ®îc ®å thÞ G(F,M):
§êng t¨ng cÆp ghÐp ®èi víi x4 vÉn kh«ng tåm t¹i. Tuy nhiªn S vµ T ®· ®îc më réng thªm:
S ={x1, x3, x4} vµ T = {y2, y4} vµ lîng nh·n ®îc sña trªn c¸c tËp nµy lµ d = 1:
F 0 1 0 2
4 2 5 1 6
8 8 7 6 4
8 6 9 3 5
5 5 1 2 7
LÇn nµy F thªm ®îc cÆp x4, y1 tho¶ m·m F(x4) + F(y1) = C[4,1] vµ ®îc ®å thÞ G(F,M):
ViÖc t×m kiÕm vÉn cha kÕt thóc vµ cho S = {x1, x2, x3, x4}, T = {y1, y2, y4}. Lîng nh·n ®îc söa lÇn nµy lµ 2, vµ ta nhËn ®îc:
F 2 3 0 4
2 2 5 1 6
6 8 7 6 4
6 6 9 3 5
3 5 1 2 7
cïng víi ®å thÞ G(F,M) (thªm c¹nh x2, y3):
ViÖc t×m kiÕm trªn ®å thÞ nµy kÕt thóc t¹i y1 cho ta ®êng t¨ng cÆp ghÐp:
x4 -> y1 -> x2 -> y3
vµ trªn ®êng nµy, cÆp ghÐp cò (x2, y1) ®îc thay b»ng 2 cÆp ghÐp míi (x2, y3) vµ (x4, y1)
KÕt qu¶ cuèi cïng cho tËp cÆp ghÐp ®Çy ®ñ tèi u
M = {(x1, y4), (x2, y1), (x3, y2), (x4, y1)}
víi tæng träng sè lµ 6 + 6 + 9 + 5 = 26.
Các file đính kèm theo tài liệu này:
- Các thuật toán cơ bản về xử lý mảng trong Pascal.doc