Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 21 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
21
Dung lượng
1,33 MB
Nội dung
Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 15 1. Mc tiêu 2. Kin thc c bn cn có hc chng này 3. Tài liu tham kho có liên quan n chng 4. Ni dung: II.1 - Bài toán sp xp. II.2 - Các phng pháp sp xp n gin II.3 - Quicksort. II.4 - Heapsort. II.5 - Binsort. 5. Vn nghiên cu ca trang k tip Trong chng này chúng ta s nghiên cu các vn sau: · Bài toán sp xp. · Mt s gii thut sp xp n gin. · QuickSort · HeapSort · BinSort II.1- BÀI TOÁN SP XP II.1.1 Tm quan trng ca bài toán sp xp II.1.2 Sp xp trong và sp xp ngoài II.1.3 T chc d liu và ngôn ng cài t II.1.1 Tm quan trng ca bài toán sp xp Sp xp mt danh sách các i tng theo mt th t nào là mt bài toán thng c vn ng trong các ng dng tin hc. Ví d ta cn sp xp danh sách thí sinh theo tên vi th t Alphabet, hoc sp xp danh sách sinh viên theo m trung bình vi th t t cao n thp. Mt ví d khác là khi cn tìm kim mt i tng trong mt danh sách các i tng bng gii thut tìm kim nh phân thì danh sách các i tng này phi c sp xp trc ó. Tóm li sp xp là mt yêu cu không th thiu trong khi thit k các phn mm. II.1.2 Sp xp trong và sp xp ngoài Sp xp trong là s sp xp d liu c t chc trong b nh trong cu máy tính, ó ta có th s dng kh nng truy nhp ngu nhiên ca b nh và do vy s thc hin rt nhanh. Sp xp ngoài là s sp xp c s dng khi s lng i tng c sp xp ln không th u tr trong b nh trong mà phi lu trî trên b nh ngoài. C th là ta s sp xp d liu c lu tr trong các tp tin. Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 16 Chng này tp trung gii quyt vn sp xp trong còn sp xp ngoài sc nghiên cu trong chng IV. II.1.3 T chc d liu và ngôn ng cài t Các i tng cn c sp xp là các mu tin gm mt hoc nhiu trng. Mt trong các trng c gi là khóa (key), kiu ca nó là mt kiu có quan h th t (nh các kiu s nguyên, s thc, chui ký t .). Danh sách các i tng cn sp xp s là mt mng ca các mu tin va nói trên. Mc ích a vic sp xp là t chc li các mu tin sao cho các khóa ca chúng c sp th t tng ng vi quy lut sp xp. trình bày các ví d minh ha chúng ta s dùng PASCAL làm ngôn ng th hin và s dng khai báo sau: const N = 100; type KeyType = integer; OtherType = real; RecordType = Record Key : KeyType; OtherFields : OtherType; end; var a : array[1 N] of RecordType; procedure Swap(var x,y:RecordType); var temp : RecordType; begin temp := x; x := y; y := temp; end; n thy rng th tc Swap ly O(1) thi gian vì ch thc hin 3 lnh gán ni tip nhau. II.2- CÁC PHNG PHÁP SP XP N GIN II.2.1- Sp xp chn II.2.2- Sp xp xen II.2.3- Sp xp ni bt Các gii thut n gin thng ly O(n 2 ) thi gian sp xp n i tng và các gii thut này thng ch dùng sp các danh sách có ít i tng. Vi mi gii thut chúng ta s nghiên cu các phn: gii thut, ví d, chng trình và phân tích ánh giá. Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 17 II.2.1- Sp xp chn (Selection Sort) Gii thut ây là phng pháp sp xp n gin nht c tin hành nh sau: · u tiên chn phn t có khóa nh nht trong n phn t t a[1] n a[n] và hoán v nó i phn t a[1]. · Chn phn t có khóa nh nht trong n-1phn t t a[2] n a[n] và hoán v nó vi a[2]. · Tng quát bc th i, chn phn t có khoá nh nht trong n-i+1 phn t t a[i] n a[n] và hoán v nó vi a[i]. · Sau n-1 bc này thì mng ã c sp xp. Phng pháp này c gi là phng pháp chn bi vì nó lp li quá trình chn phn t nh nht trong s các phn t cha c sp. Ví d 2-1: Sp xp mng gm 10 mu tin có khóa là các s nguyên: 5, 6, 2, 2, 10, 12, 9, 10, 9 và 3 Khoá c a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] Ban u 5 6 2 2 10 12 9 10 9 3 c 1 2 6 5 2 10 12 9 10 9 3 c 2 2 5 6 10 12 9 10 9 3 c 3 3 6 10 12 9 10 9 5 c 4 5 10 12 9 10 9 6 c 5 6 12 9 10 9 10 c 6 9 12 10 9 10 c 7 9 10 12 10 c 8 10 12 10 c 9 10 12 t qu 2 2 3 5 6 9 9 10 10 12 Hình 2-1: Sp xp chn Chng trình: procedure SelectionSort; var i,j,LowIndex: integer; LowKey: KeyType; begin (1) for i := 1 to n-1 do begin (2) LowIndex := i; (3) LowKey := a[i].key; (4) for j := i+1 to n do (5) if a[j].key < LowKey then Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 18 begin (6) LowKey := a[j].key; (7) LowIndex := j; end; (8) Swap(a[i] , a[LowIndex]); end; end; ánh giá: Phng pháp sp xp chn ly O(n 2 ) sp xp n phn t. Trc ht ta có th tc Swap ly mt hng thi gian nhã nói mc II.1.3. Các lnh (2), (3) u ly O(1) thi gian. Vòng lp for (4) - (7) thc hin n-i ln, vì j chy t i+1 n n, mi ln ly O(1), nên ly O(n-i) thi gian. Do ó thi gian tng cng là: II.2.2- Sp xp xen (Insertion Sort) Gii thut Trc ht ta xem phn t a[1] là mt dãy ã có th t. · Bc 1, xen phn t a[2] vào danh sách ã có th t a[1] sao cho a[1], a[2] là mt danh sách có th t. · Bc 2, xen phn t a[3] vào danh sách ã có th t a[1], a[2] sao cho a[1], a[2], a[3] là t danh sách có th t. · Tng quát, bc i, xen phn t a[i+1] vào danh sách ã có th t a[1],a[2], a[i] sao cho a[1], a[2], a[i+1] là mt danh sách có th t. · Phn tang xét a[j] sc xen vào v trí thích hp trong danh sách các phn tã c sp trc ó a[1],a[2], a[j-1] bng cách so sánh khoá ca a[j] vi khoá ca a[j-1] ng ngay trc nó. Nu khoá ca a[j] nh hn khoá ca a[j-1] thì hoán i a[j-1] và a[j] cho nhau và tip tc so sánh khoá ca a[j-1] (lúc này a[j-1] cha ni dung ca a[j]) vi khoá ca a[j-2] ng ngay trc nó . Ví d 2-2: Sp xp mng gm 10 mu tin ã cho trong ví d 2-1. Khoá c a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] Ban u 5 6 2 2 10 12 9 10 9 3 c 1 5 6 c 2 2 5 6 c 3 2 2 5 6 c 4 2 2 5 6 10 c 5 2 2 5 6 10 12 Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 19 c 6 2 2 5 6 9 10 12 c 7 2 2 5 6 9 10 10 12 c 8 2 2 5 6 9 9 10 10 12 c 9 2 2 3 5 6 9 9 10 10 12 Hình 2-2: Sp xp xen Chng trình procedure InsertionSort; var i,j: integer; begin {1} for i := 2 to n do begin {2} J := i; {3} while (j>1) and (a[j].key < a[j-1].key) do begin {4} swap(a[j], a[j-1]); {5} j := j-1; end; end; end; ánh giá: Phng pháp sp xp chn ly O(n 2 ) sp xp n phn t. Ta thy các lnh (4) và (5) u ly O(1). Vòng lp (3) chy nhiu nht i-1 ln, mi ln tn O(1) nên (3) ly i-1 thi gian. Lnh (2) và (3) là hai lnh ni tip nhau, lnh (2) ly O(1) nên c hai nh này ly i-1. Vòng lp (1) có i chy t 2 n n nên nu gi T(n) là thi gian sp n phn t thì ta có II.2.3- Sp xp ni bt (Bubble Sort) Gii thut Chúng ta tng tng rng các mu tin c lu trong mt mng dc, qua quá trình sp, mu tin nào có khóa “nh” sc ni lên trên. Chúng ta duyt tòan mng, t di lên trên. Nu hai phn cnh nhau mà không úng th t tc là nu phn t “nh hn” li nm di thì phi cho nó “ni lên” bng cách i ch hai phn t này cho nhau. C th là: · Bc 1: Xét các phn t t a[n] n a[2], vi mi phn t a[j], so sánh khoá ca nó vi khoá ca phn t a[j-1] ng ngay trc nó. Nu khoá ca a[j] nh hn khoá ca a[j-1] thì hoán i a[j] và a[j-1] cho nhau. · Bc 2: Xét các phn t t a[n] n a[3], và làm tng t nh trên. · Tng quát bc th i, ta s xét các phn t t a[n] n a[i+1]. Sau n bc ta thu c mng có th t Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 20 Ví d 2-3: Sp xp mng gm 10 mu tin ã cho trong ví d 2-1. Khoá c a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] Ban u 5 6 2 2 10 12 9 10 9 3 c 1 2 5 6 2 3 10 12 9 10 9 c 2 2 5 6 3 9 10 12 9 10 c 3 3 5 6 9 9 10 12 10 c 4 5 6 9 9 10 10 12 c 5 6 9 9 10 10 12 c 6 9 9 10 10 12 c 7 9 10 10 12 c 8 10 10 12 c 9 10 12 t qu 2 2 3 5 6 9 9 10 10 12 Hình 2-3: Sp xp ni bt Chng trình procedure BubbleSort; var i,j: integer; begin (1) for i := 1 to n-1 do (2) for j := n downto i+1 do (3) if a[j].key < a[j-1].key then (4) Swap(a[j],a[j-1]); end; ánh giá: Phng pháp sp xp ni bt ly O(n 2 ) sp n phn t. Dòng lnh (3) ly mt hng thi gian. Vòng lp (2) thc hin (n-i) bc, mi bc ly O(1) nên ly O(n-i) thi gian. Nh vy i vi toàn b chng trình ta có: II.3- QUICKSORT II.3.1- Ý tng II.3.2- Thit k gii thut II.3.3- Cài t gii thut II.3.4- Thi gian thc hin ca QuickSort Trong phn này chúng ta s nghiên cu mt gii thut sp xp c dùng mt cách ph bin là Quick Sort do A.R. Hoare phát minh vào nm 1960. Quick Sort c ánh giá tt nh vào s phân tích toán hc và các khng nh v kh nng ca nó. Quick Sort ã c ci tin tr thành phng pháp c chn trong các ng dng sp xp thc t khác nhau. Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 21 II.3.1- Ý tng Chúng ta vn xét mng a các mu tin a[1] a[n]. Gi s v là 1 giá tr khóa mà ta gi là cht (pivot). Ta phân hoch dãy a[1] a[n] thành hai mng con "bên trái" và "bên phi". Mng con "bên trái" bao gm các phn t có khóa nh hn cht, mng con "bên phi" bao gm các phn t có khóa ln hn hoc bng cht. Sp xp mng con “bên trái” và mng con “bên phi” thì mng ã cho sc sp bi vì tt c các khóa trong mng con “bên trái “ u nh hn các khóa trong mng con “bên phi”. Vic sp xp các mng con “bên trái” và “bên phi” cng c tin hành bng phng pháp nói trên. Mt mng ch gm mt phn t hoc gm nhiu phn t có khóa bng nhau thì xem nhã có th t. II.3.2- Thit k gii thut n chn cht Chn khóa ln nht trong hai phn t có khóa khác nhau u tiên k t trái qua. Nu mng ch m mt phn t hay gm nhiu phn t có khóa bng nhau thì không có cht. n phn hoch phân hoch mng ta dùng 2 "con nháy" L và R trong ó L t bên trái và R t bên phi, ta cho L chy sang phi cho ti khi gp phn t có khóa cht và cho R chy sang trái cho ti khi gp phn t có khóa < cht. Ti ch dng ca L và R nu L<R thì hoán v a[L],a[R]. Lp li quá trình dch sang phi, sang trái ca 2 "con nháy" L và R cho n khi L>R. Khi ó L s là m phân hoch, c th là a[L] là phn tu tiên ca mng con “bên phi”. Gii thut QuickSort sp xp mng a[i] a[j] ta tin hành các bc sau: · Xác nh cht, · Phân hoch mng ã cho thành hai mng con a[i] a[k-1] và a[k] a[j]. · Sp xp mng a[i] a[k-1] ( quy). · Sp xp mng a[k] a[j] ( quy). Quá trình quy s dng khi không còn tìm thy cht. Ví d 2-4: Ta cn sp mt mng mà khóa là các s nguyên ã c trình bày trong ví d 2-1. Hai phn tu tiên có khóa khác nhau là 5 và 6, ta chn 6 làm cht và tin hành phân hoch mng ban u làm hai mng con và quy cho hai mng con này. Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 22 II.3.3- Cài t gii thut Hàm FindPivot Ta thit k hàm FindPivot xác nh trong dãy a[i] a[j] xem có hay không hai phn t có khóa khác nhau. Nu không tìm thy hai phn t có khóa khác nhau thì tr v giá tr 0 (không tìm thy cht), ngc li hàm tr v giá tr là ch s ca phn t có khóa ln hn trong hai phn t có khóa khác nhau u tiên. Khóa ln hn này s tr thành phn t cht mà ta s xác nh trong th tc QuickSort. tin so sánh ta s dng bin FirstKey lu gi khóa ca phn tu tiên trong mng a[i] a[j] (FirstKey chính là a[i].key). Ta s dùng mt ch s k dò tìm trong mng a[i] a[j], k t v trí i+1 n ht mng, mt phn a[k] mà a[k].key <> FirstKey. Nu không tìm thy mt a[k] nh th thì hoc là mng ch gm mt phn t hoc gm nhiu phn t có khóa bng nhau. Trong trng hp ó thì không tìm thy cht và hàm FindPivot s tr v 0. Ngc li ta s phi xét xem a[k].key có ln hn FirstKey hay không, nu úng nh th thì cht s là khóa ca a[k] và hàm FindPivot s tr v k, nu không thì hàm FindPivot s tr v i. Function FindPivot(i,j:integer): integer; var FirstKey : KeyType; k : integer; begin k := i+1; FirstKey := a[i].key; while (k<=j) and (a[k].key = FirstKey) do k:= k+1; if k > j then FindPivot := 0 else if a[k].key > FirstKey then FindPivot := k else FindPivot := i; end; Hàm Partition Hàm Partition nhn vào ba tham s i, j và Pivot thc hin vic phân hoch theo mng a[i] a[j] theo cht Pivot và tr v giá tr l là ch su tiên ca mng “bên phi”. Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 23 Hai con nháy L, R sc s dng thc hin vic phân hoch nhã trình bày trong phn II.3.2. Function Partition(i,j:integer; pivot :KeyType):integer ; var l,r : integer; begin l := i; {t con nháy L ì bên trái} r := j; {t con nháy R ì bên phi} while l <= r do begin {L tin sang phi} while a[l].key < pivot do l := l+1; {R tin sang trái} while a[r].key >= pivot do r := r-1; if l <r then Swap(a[l],a[r]); end; Partition :=l; end; QuickSort Bây gi chúng ta trình bày th tc cui cùng có tên là QuickSort và chú ý rng sp xp ng A các record gm n phn t ca kiu Recordtype ta ch cn gi QuickSort(1,n). Ta s s dng bin PivotIndex lu gi kt qu tr v ca hàm FindPivot, nu bin PivotIndex nhn c mt giá tr khác 0 thì mi tin hành phân hoch mng. Bin Pivot sc s ng lu gi giá tr cht và bin k lu gi giá tr ca m phân hoch do hàm Partition tr v. Sau khia ã phân hoch xong ta s gi quy QuickSort cho mng con “bên trái” a[i] a[k-1] và mng con “bên phi” a[k] a[j]. procedure Quicksort(i,j:integer); var Pivot : KeyType; PivotIndex, k : integer; begin (1) PivotIndex := FindPivot(i,j); (2) if PivotIndex <> 0 then begin (3) Pivot := a[PivotIndex].key; (4) k := Partition(i,j,Pivot); (5) QuickSort(i,k-1); (6) QuickSort(k,j); end; end; II.3.4- Thi gian thc hin ca QuickSort QuickSort ly O(nlogn) thi gian sp xp n phn t trong trng hp tt nht và O(n 2 ). trong trng hp xu nht. Hàm Partition ly thi gian t l vi s phn t ca mng. Nh vy nu mng có n phn t thì Partition ly P(n)= n n v thi gian. Collected by The_Wall (11/10/2005) Giáo trình môn Phân tích Gii Thut – I C CN TH Trang 24 Gi T(n) là thi gian thc hin ca QuickSort thì T(n) phi là tng ca P(n) và thi gian QuickSort quy cho hai mng con. Gi s các giá tr khóa ca mng khác nhau. Trong trng hp xu nht là ta luôn chn phi phn t có khóa ln nht làm cht, lúc by gi vic phân hoch b lch tc là mng bên phi ch gm t phn t cht, còn mng bên trái gm n-1 phn t còn li. Khi ó ta có th thành lp phng trình quy nh sau: Gii phng trình này bng phng pháp truy hi Ta có T(n) = T(n-1) + T(1) +n = T(n-1) + (n+1) = [T(n-2) + T(1) +(n-1)] + (n+1) = T(n-2) + n + (n+1) = [T(n-3) + T(1) +(n-2)] + n + (n+1) = T(n-3) +(n-1) + n + (n+1) . . . . . . . . . . . . . . . . . = T(n-i) + (n-i+2) + (n-i+3) + . + n + (n+1) = T(n-i) + Quá trình trên kt thúc khi i=n-1, khi ó ta có Trong trng hp tt nht khi ta chn c cht sao cho hai mng con có kích thc bng nhau và bng n/2. Lúc ó ta có phng trình quy nh sau: Gii phng trình quy này (xem I.4.2) ta c T(n) = O(nlogn). Ngi ta cng chng minh c rng trong trng hp trung bình QuickSort ly T(n) = O(nlogn). II.4- HEAPSORT II.4.1- Heap II.4.2- Ý tng II.4.3- Thit k và cài t gii thut II.4.4- Phân tích HeapSort