Professional Documents
Culture Documents
Chng 1 : M U
I. Cu trc d liu v gii thut
1. Khi nim gii thut (thut gii, thut ton) a. nh ngha :
L tp hu hn c th t cc bc tc ng trn mt i tng d liu no sau mt s hu hn ln thc hin s cho ta kt qu Cc c trng ca gii thut - u vo (Input) : Gii thut nhn d liu vo t mt tp no - u ra (Output) : Vi mt tp cc d liu u vo, gii thut a ra cc d liu tng ng vi li gii ca bi ton. - Chnh xc (Precision) : Cc bc ca gii thut c m t chnh xc - Hu hn (Finiteness) : Gii thut phi a c u ra sau mt s hu hn (c th rt ln) bc vi mi u vo - n tr (Uniqueness) : Cc kt qu trung gian ca tng bc thc hin gii thut c xc nh mt cch n tr v ch ph thuc vo u vo v cc kt qu ca cc bc trc. - Tng qut (Generality) : Gii thut c th p dng gii mi bi ton c dng cho.
b. V d minh ha :
Bi ton : Cho 3 s nguyn a, b, c. M t gii thut tm s ln nht trong 3 s cho. Gii : Gii thut gm cc bc sau : 1 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut Bc 1 : t x := a; Bc 2 : Nu b > x th t x := b; Bc 3 : Nu c > x th t x := c. T tng ca gii thut l duyt ln lt gi tr ca tng s v gi li gi tr ln nht vo bin x. Kt thc gii thut x cho s nguyn ln nht trong 3 s cho. By gi ta theo di qu trnh thc hin ca gii thut vi nhng gi tr c th ca a, b, c. Trc ht gi s a = 1; b = 5 ; c = 3. Ti bc 1, ta gn gi tr ca x l a (1). Ti bc 2, do b > x (5> 1), nn x c gn bng b (5). Ti bc 3, do iu kin c > x (3 > 5) khng c thc hin, nn ta khng phi lm ng tc gn. Kt thc gii thut, x c gi tr 5 l gi tr ln nht trong 3 s a, b, c. By gi ta s thy rng gii thut va m t c cc tnh cht nu trn : Gii thut nhn u vo l 3 s a, b, c v a kt qu u ra l x Cc bc ca gii thut c m t chnh xc n mc ta c th vit ngay chng trnh theo gii thut trn ngn ng lp trnh v thc hin trn my tnh Nu u vo l xc nh, kt qu ti mi bc ca gii thut c xc nh duy nht. Chng hn vi u vo nh v d trn, ti bc 2 ca gii thut, x lun c t bng 5 khng ph thuc vo vic gii thut c chy bng tay hay bi my tnh Gii thut kt thc sau 3 bc v a ra li gii ca bi ton, v vy gii thut l hu hn Gii thut trnh by trong v d lun a ra gi tr ca s ln nht trong 3 s bt k, nh vy gii thut c tnh tng qut.
Th d : Danh b in thoi H tn S in thoi - Nu danh b khng c t chc g c th dn n gii thut l tm tun t t u n cui (Cho h tn v tm s in thoi) - Nu danh b (H tn) t chc theo th t a,b,c th ta c th tm kim theo gii thut tm kim nh phn - Nu danh b va xp th t va c mt bng mc lc - A Trang 10 2 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut - B Trang 40 - C Trang 100 Th : Tm trong bng mc lc trc Nu thy th ch cn tm trong mt vn
Gio n mn : Cu trc d liu v gii thut Oi = { +, -, *, /, %} Nh vy, mun s dng mt kiu d liu cn nm vng c ni dung d liu c php lu tr v cc x l tc ng trn . Cc thuc tnh ca 1 KDL bao gm: - Tn KDL - Min gi tr - Kch thc lu tr - Tp cc ton t tc ng ln KDL
Gio n mn : Cu trc d liu v gii thut Typedef struct <tn kiu struct> { <KDL> <tn trng>; <KDL> <tn trng>; }[<Name>];
thc hin chin thut ny ngi ta thng dng cch thit k - T trn xung (Top-Down Design) (i t tng qut n chi tit) - Tinh chnh tng bc o Biu din tng bng ngn ng t nhin o C th tng phn, thay i bng ngn ng chng trnh o Cui cng ta c chng trnh Th d : Bi ton sp xp mt dy s - Chn s b nht trong n s vo v tr th 1 - Chn s b nht trong n-1 s cn li vo v tr th 2 - - Chn s b nht trong 2 s cn li vo v tr th n-1 => For i := 1 to n-1 do Begin 5 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut + Chn s b nht trong cc s xi , xi +1 ,....., x n + i ch cho xi End. => For i := 1 to n-1 do Begin Bn := x[i] So snh Bn vi cc s t xi+1 -> xn . Nu x[i] > cc s th li ly s lm s Bn End. => For i := 1 to n-1 do For j := i+1 to n do If (x[i] > x[j]) then Begin Tg := x[i] X[i] := x[i+1] X[i+1] := tg End;
6 TRUNG KIN
Cc gii thut c phc tp tnh ton l cp cc hm a thc th chp nhn c. V d : T(n) = 60n2 + 9n + 9 = O(?) Mt s v d nh gi phc tp tnh ton ca GT V d 1 : Tnh TBC ca mt dy s c vo t bn phm 1. Nhp vo s n 2. Cho T = 0; d = 1 3. Lp While d <= n do Begin 4. - c vo s n 5. - Cng thm vo T 6. - Tng m ln 1 End; 7. Tnh TBC = T/n; 8. a ra TBC 7 TRUNG KIN
S ln thc hin 1 1 n n n n 1 1 4n + 4
b. Qui tc ly max
Nu ta c T(n) = O(f(n) + g(n)) th ta cng c T(n) = O(max(f(n),g(n))) Chng minh : T(n) C1.f(n) + C2.g(n) 2C. Max(f(n),g(n)) T(n) = O(max(f(n),g(n))) V d
c. Qui tc cng
T1(n) v T2(n) l thi gian thc hin ca 2 on chng trnh P1 v P2 v T1(n) = O(g(n)); T2(n)= O(g(n)) th thi gian thc hin 2 on chng trnh ni tip nhau l T(n) = T1(n) + T2(n) Hay T(n) = O(max(f(n),g(n)))
d. Qui tc nhn
Thi gian thc hin hai on chng trnh lng nhau l T(n) = O(f(n).g(n)) T cc qui tc trn => vic nh gi phc tp thut ton ta ch cn ch n cc lnh tch cc cn cc lnh khc c th b qua. 8 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut Lnh tch cc l lnh c s ln thc hin s ln thc hin cc lnh khc V d : Bi ton tnh gi tr gn ng ca ex
Gio n mn : Cu trc d liu v gii thut C hai loi th tc qui : 1) Th tc qui trc tip : Th tc cha li gi n chnh n 2) Th tc qui gin tip : Th tc cha li gi n th tc khc m th tc ny li cha li gi n chnh n (V d hm A gi hm B, hm B gi hm C v hm C li gi n hm A chng trnh dch) Tnh cht ca th tc qui trc tip: 1) Mt th tc qui n cha li gi n chnh th tc trong thn th tc 2) C mt trng hp suy bin kt thc li gi qui 3) Mi ln gi th li dn n trng hp suy bin V d 1: Vit hm qui tnh n! Cch tnh 3! t nh ngha 3! = 3 * 2! = 3 * 2 = 6 2! = 2 * 1! = 2 * 1 = 2 1! = 1 * 0! = 1 * 1 = 1 0! = 1 Ta c chng trnh Funtion Giai_Thua ( n : Integer ) : Integer; Begin If ( n = 0) then Giai_Thua := 1 Else Giai_Thua := n* Giai_Thua(n-1) End; BEGIN Clrscr; Writeln(3! = ; Giai_Thua(3)); Readln END. Th tc khng qui : V d 2 : Vit chng trnh tnh s Fibonaci th n Th tc khng qui : T chng trnh chnh gi th tc qui qui mc 1 T th tc qui gi n ln 2 qui mc 2 10 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut Khi vo mc th i th N thc hin mt phn mc th i ri kim tra iu kin suy bin. - Nu cha suy bin th n gi cc thng tin o Cc tham s m mc i truyn cho mc i + 1 o Cc bin cc b mc i v a ch li v vo ngn xp ri vo mc i +1 - Nu suy bin th n tnh nt phn cn li ca mc th i, ri ly thng tin ra t ngn xp quay v mc i 1; mc i 1 li tnh nt phn cn li ca mc i 1 ri quay ra mc i 2. (hiu c on trn c hai ngha chy CT qui cho ra kt qu ng v c nhng tng qui gii quyt bi ton ) V d 2 : Procedure aaa(n : interger); Begin If n < 3 then aaa(n+1); Writeln(n) End; BEGIN aaa(1); Readln END. Kt qu : 3 2 1 V d 3 : Procedure aaa(n : interger); Begin n := n +1; Writeln(n); If n < 10 then aaa(n+1); Writeln(n) End; BEGIN aaa(1); Readln END. Kt qu : 2, 4, 6 , 8, 10, 10, 8, 6, 4, 2 11 TRUNG KIN
b. Cu trc phn cp
12 TRUNG KIN
Nhiu tin bi
Nhiu hu bi
c. Cu trc th
Khng c tin bi
a. Cu trc tp hp
Khng c hu bi
II. Mng
1. Khi nim
L mt tp hp c th t cc phn t c cng mt kiu v s phn t l c nh Trn mng thng xc nh cc php tnh - To lp mng - Ly ni dung ca mt phn t mng - Ghi vo mt phn t mng mt ni dung no Khng c php tnh thm vo mt phn t Khng c php tnh bt mt phn t ca mng
2. Lu tr mng
Mng c lu tr trong my bi mt vng nh lin tc.
a. Mng mt chiu (c mt ch s)
Khai bo Example : Array [LowerBound..UpperBound] of ElementType Nu mi phn t trong mng c kiu ElementType chim s t my, th b nh dnh ra mt vng nh l s*(UpperBound-LowerBound+1) t my lin tc cha
mng.
a ch ca phn t Example[i] s l :
Cng thc tng qut xc nh a ch ca phn t ti hng i ct j l Loc(A[i,j]) = Loc(A[1,1]) + [(i-1)*n + (j-1)]*s Lu theo ct (Lu tr ht ct n ti ct kia) A11 A21 Ct 1 A31 A12 A22 Ct 2 A32
Cng thc tng qut xc nh a ch ca phn t ti hng i ct j l Loc(A[i,j]) = Loc(A[1,1]) + [(j-1)*m + (i-1)]*s
III. Stack
1. nh ngha hnh thc
Stack l cu trc d liu vo sau / ra trc tuyn tnh ( Last In / First Out - LIFO) m php thm v bt c thc hin mt u gi l nh (Top) nh
y Cc thao tc trn ngn xp Khi to Create(S) To ra Stack S mi, rng Bin i Push(E, S) y phn t c gi tr E vo nh Stack S Pop(E, S) Lu phn t nh ngn xp S vo E ri xa khi ngn xp Kim tra Empty(S) Kim tra Stack c rng khng Full(S) Kim tra Stack c trn khng
14 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut Else With Stack Do Begin Error := None; Top := Top + 1; Element[Top] := Item; Endif End;
IV. Queue
1. nh ngha hnh thc
Queue l cu trc d liu vo trc ra trc tuyn tnh (First In First Out - FIFO) m thm mt u cn bt u kia 6 5 4 3 2 1 X X X X C (Rear) D ( Front)
Cc thao tc trn hng i Khi to Create(Q) To ra hng i mi, rng Bin i AddQueue(E, Q) Chn phn t c gi tr E vo cui hng i Q DeQueue(E, Q) Lu phn t u hng i Q vo E ri xa khi hng i Kim tra 16 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut Empty(Q) Kim tra hng i c rng khng Full(Q) Kim tra hng i c y khng
Nhn xt : Nu hng hot ng mt thi gian th s chy khp b nh, khc phc ngi ta t chc hng vng trn Khi tng : Front := (Front + 1) mod max Rear := (Rear + 1) mod max Nu hng rng th Front = Rear Nu hng y th : Front = Rear (Trng vi du hiu hng rng) Khc phc bng cch qui nh hng cn mt ch coi nh l y : (Rear + 1 ) mod Max = Front
(* Module ny ci t kiu d liu tru tng Queue s dng mng mt chiu vng *) Const MaxQueue = 50;
17 TRUNG KIN
Type QueueElementType; QueueType = Record Queue : Array[0..MaxQueue] Of QueueElementType; Front, Rear : 0 .. MaxQueue; End; Procedure Create(Var Queue : QueueType); Begin Error := None; Queue.Front:=0; Queue.Rear:=0; End Create; Procedure Empty(Queue: QueueType): Boolean; Begin Error := None; Return Queue.Front := Queue.Rear; End Empty; Procedure Full(Queue: QueueType):Boolean; Begin Error := None;
With Queue do Full := ((Rear + 1 ) mod MaxQueue = Front)
End Full; Procedure AddQueue(Item: QueueElementType,Var Queue: QueueType); Begin If Full(Queue) Then Error:=QueueOverFlow; Else Error:=None; With Queue do Begin Queue[Rear] := Item; Queue.Rear := (Queue.Rear + 1) mod MaxQueue end Endif End Enqueue; Procedure Dequeue(Item :QueueElementType;Var Queue: QueueType); Begin If Empty(Queue) Then
18 TRUNG KIN
Error := QueueUnderFlow; Else Error := None; With Queue do begin Item := Queue[Front] Front := (Front + 1) mod max end Endif End Dequeue; End Queuepackage.
Mt s kiu hng i - DeQueue : Thm v bt c th c thc hin c hai u - Hng i u tin (Priority Queue) : o C mt s u tin c gn cho mi mc o Nhng mc c u tin nht gn u hng i o Nhng mc c cng mc u tin th c sp xp nh hng i
19 TRUNG KIN
Chng 5 : Cu trc d liu tuyn tnh v cch ci t bng danh sch lin kt
Ni dung :
I. Danh sch tuyn tnh 1. nh ngha danh sch tuyn tnh 2. Cch lu tr danh sch 3. Cc thao tc trn danh sch tuyn tnh 4. Ci t tun t ca danh sch trn c s mng 5. ng dng II. Danh sch lin kt 1. Gii thiu v danh sch lin kt 2. Ci t danh sch lin kt trn c s mng 3. Ci t danh sch lin kt trn c s con tr 4. ng dng III. Nghin cu thm v danh sch 1. Ngn xp v hng i lin kt 2. Danh sch vi nt u 3. Danh sch lin kt vng 4. Danh sch lin kt kp 5. ng dng
20 TRUNG KIN
a. Lu tr kt tip
Ton b danh sch chim mt vng nh lin tc, cc phn t ca danh sch nm L lin tip nhau.
Gi s L l a ch u ca vng nh th a ch ca phn t th i s l : L + (i-1)* di mt phn t. u im : - n gin - Tc truy cp ti phn t nhanh v u nhau Nhc im : - Nu php tnh thm bt c thc hin thng xuyn th rt mt cng
b. Lu tr mc ni
Mt phn t cn gi l mt nt ca danh sch. Cc nt khc nhau nm ti cc v tr bt k khng theo mt qui lut no c nn khng tnh c a ch ca tng nt. Do vy bn cnh trng cha thng tin (Info) cn c trng cha a ch ca nt tip theo (Link). Info Next
Trng Next ca nt 1 cha a ch ca nt 2 Trng Next ca nt 2 cha a ch ca nt 3 Trng Next ca nt n cha mt gi tr c bit gi l Null(Nil). a ch ca nt th nht cha trong mt con tr L v gi l danh sch L. L Nil
d. Mt s thao tc khc
First(L) : Di chuyn con tr ti phn t u tin trong danh sch (Head), nu L rng th tr v Null. Last(L) : Di chuyn con tr ti phn t cui cng trong danh sch (Head), nu L rng th tr v Null. Next(L) : Di chuyn con tr ti phn t k tip trong danh sch InsertAfter(I,L) : chn nt I vo ngay sau nt hin thi InsertFirst(I,L) : Chn nt I v u danh sch v gn P tr v nt va b sung
B sung mt nt c gi tr I vo cui danh sch L Xo phn t u tin ca danh sch L Ghp hai danh sch (ging nh ghp hai String ) Sp xp L theo th t Tch L thnh 2 danh sch v tr N. L1 cha N phn t u tin ca L v L2 cha phn cn li.
Procedure Insert(Var List : ListType; Item : ElementType; Pos : Integer); {Th tc chn Item vo sau phn t v tr Pos trong danh sch List, Pos = 0 ch ra rng Item s c chn vo u danh sch. } Var I: Integer; Begin If Full(List) Then Error := ListOverFlow Else With List do Begin {Dch cc phn t sang pha phi to ch cho Item} For i := Size downto Pos + 1 do Element[i+1] := Element[i] {Chn Item vo v tr Pos v tng ln ca danh sch} Element[Pos + 1] := Item; Size := Size + 1 end End; Procedure Delete(Var List : ListType; Pos : Integer); {Th tc xa Item v tr Pos t danh sch List} var i : Integer; {Ch s ca mng} begin If Empty(List) Then Error := ListUnderFlow Else With List do Begin {*Gim chiu di danh sch i 1 v lp ch trng*} Size := Size 1 ; For I := Pos to Size do Element[i] := Element[i+1] End; end;
23 TRUNG KIN
5. ng dng
Bi ton : Cng hai a thc Nhn xt : Chn v xa i hi dch chuyn nhiu phn t mng, mt tng i nhiu thi gian => Dng danh sch lin kt.
Cc thao tc c bn trn danh sch lin kt -Khi to : Create () List = 0, Nill - Kim tra danh sch rng : Empty (List) Empty := (List = 0) - Th tc i qua mt danh sch lin kt List Data Brown CurrPtr Dng thm mt con tr ph CurrPtr duyt danh sch (u tin c tr ti List) Procedure LinkTraverse (List) { i qua mt danh sch lin kt vi nt u tin c tr bi List, x l mi phn t ng mt ln } 1. Khi ng CurrPtr ti List 2. While CurrPtr <> Nill do a. X l Data (CurrPtr) 24 TRUNG KIN Next Data Brown Next Data Brown Next
Gio n mn : Cu trc d liu v gii thut b. t CurrPtr bng Next(CurrPtr) - Chn mt phn t vo trong danh sch lin kt C hai trng hp + Chn vo u danh sch lin kt + Chn vo sau mt phn t cho trc trong danh sch Trng hp 1 : Chn nt TempPtr vo u danh sch (cc thao tc phi c thc hin theo th t sau ) 1. t Next(TempPtr) = List TempPtr List
Gio n mn : Cu trc d liu v gii thut => Thut ton chn mt phn t vo danh sch lin kt Procedure LinkInsert ( Var List ; Item; PrePtr) {Th tc ny chn Item vo mt danh sch lin kt vi nt u tin c ch bi List. PrePtr ch ti nt ng trc nt cn chn hay l con tr rng (c gi tr 0 )nu n chn vo u danh sch hoc danh sch rng } 1. GetNode(TempPtr) {Ly mt nt mi} 2. t Data(TempPtr) := Item 3. If PrePtr = Nill lm cc bc sau {Chn Item vo u danh sch} a. t Next(TempPtr) bng List b. t List bng TempPtr Else Lm cc bc sau {c phn t ng trc} a. t Next(TempPtr) bng Next(PrePtr) b. t Next(PrePtr) bng TempPtr Kim tra xem th tc c ng vi trng hp + Chn vo mt danh sch rng hay khng + Chn vo cui danh sch khng rng - Xa mt phn t : Gi s Temp ch ti nt cn c xa. C hai trng hp xy ra. + Xa phn t u tin trong danh sch + Xa mt phn t c nt ng trc n Trng hp 1 : t List bng Next(TempPtr)
List TempPtr Trong trng hp c bit danh sch ch c mt nt th vn ng Trng hp 2 : Nu nt PrePtr ch ti nt dng trc nt cn xa PrePtr t
Procedure LinkedDelete( Var List; PrePtr) {Xa mt nt t danh sch lin kt vi nt u c ch bi List; PrePtr ch vo nt ng trc nt cn xa hay l con tr rng nu nt u tin cn c xa} If (Danh sch rng) Then Error := ListUnderFlow Else lm cc bc sau 1. If PrePtr = Nill Then {Xa nt u} a. t TempPtr := List b. t List bng Next(TempPtr) Else lm cc bc sau {Xa nt c phn t ng trc} a. t TempPtr := Next(PrePtr) b. t Next(PrePtr) bng Next(TempPtr) 2. ReleaseNode (TempPtr) => xa cn nh v con tr PrePtr = > Th tc tm kim trong danh sch lin kt Procedure LinkedSearch(List, Item; Var PrePtr; Var Found : boolean); {Tm mt nt cha Item trongdanh sch lin kt c nt u tin c ch bi List. Nu tm ra , gi tr Found c t bng ng, CurrPtr ch n nt y, v PrePtr ch n nt ng trc n hay l nill nu khng c. Found c t bng gi tr False nu khng tm ra} 1. Khi ng CurrPtr ti List, PrePtr ti Nil, v Found ti False 2. While not Found and CurrPtr <> Nil lm cc bc sau : If Data(CurrPtr) = Item Then Found = True Else Lm cc bc sau a. t PrePtr := CurrPtr b. t CurrPtr := Next(CurrPtr). - Thut ton tm kim trong mt danh sch c sp th t Procedure LinkedOrderSearch (List; Item ; Var PrePtr , Var Found)
27 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut {Tm mt nt cha Item trong mt danh sch lin kt c sp th t c nt u c ch bi List. Nu tm ra gi tr Found s t bng True, CurrPtr ch n nt y hay tm v tr ch ti v tr cn chn , PrePtr ch ti nt ng trc mt nt nh th v Nill nu Item ng trc tt c cc phn t trong danh sch. Thut ton gi s cc phn t c sp theo th t tng dn} 1. Khi ng CurrPtr ti List, PrePtr ti Nil, Found ti False, DoneSearching ti False 2. While not DoneSearching and CurrPtr <> Nil lm cc bc sau : If Data(CurrPtr) >= Item Then a. t DoneSearching bng gi tr ng b. t Found bng gi tr ng nu Data(CurrPtr) = Item Else a. t PrePtr bng CurrPtr b. t CurrPtr bng Next(CurrPtr)
Khai bo Const MaxSize = .; { di ln nht cho php ca danh sch} Type ElementType = ; {Kiu mt phn t trong DS} PointType = 0..MaxSize; {Kiu con tr, 0 l gi tr Nill } NodeType = Record 28 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut Data : ElementType; Next : PointType End; ArrayOfNode = array[1..maxSize] of NodeType; Var Node : ArrayOfNode; {mng ton cc cc nt} Free : PointerType; {Con tr ton cc ch ti nt t do u tin} List : PointerType; {Con tr ch n nt u tin trong danh sch} Procedure Create(Var List : PointerType); List := 0; Function Empty(List : PointerType) : Boolean; Empty := (List = 0) * Th tc khi ng vng lu tr cc nt t do Procedure IntializeStorage; Var i : i..MaxSize; Begin For i := 1 to MaxSize 1 do Node[i].Next := i +1; Node[maxSize] := 0; Free := 1; End; * Th tc ly mt nt mi Procedure GetNode (Var P : PointerType); {Th tc ny tr con tr P ch n mt nt t do, ny khng cn, P c tr gi tr 0} Begin P := Free; If Free <> 0 Then Free := Node[Free].Next; Else Writeln(** Vung luu tru rong **); End; Procedure LinkedTraverse( List : PointerType); Var CurrPtr : PointerType; Begin 29 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut CurrPtr := List; While CurrPtr <> 0 Do Begin Write(Node[CurrPtr].Data) CurrPtr := Node[CurrPtr].Next End End; Procedure Var TempPtr : PointerType; {Con tr ch n nt mi cn c chn vo} Begin GetNode(TempPtr); Node[TempPtr].Data = Item If PrePtr = 0 Then {Chn vo u danh sch} Begin Node[TempPtr].Next := List; List := TempPtr End Else {Chn vo sau mt nt} Begin Node[TempPtr].Next := Node[PrePtr].Next Node[PrePtr].Next := TempPtr end End; Procedure Remove( P : Pointer); {Gii phng mt nt c ch bi P bng cch t n tr li vng lu tr} Begin Node[P].Next := Free; Free := P End; Procedure LinkdeDelete( var List : PointerType; PrePtr : PointerType); Var TempPtr : PointerType; 30 TRUNG KIN LinkedInsert (Var List : PointerType; Item : ElementType; PrePtr : PointerType);
Gio n mn : Cu trc d liu v gii thut Begin If Empty(List) Then Error := ListUnderFlow Else begin If PrePtr = 0 Then Begin TempPtr := Node[PrePtr].Next; Node[PrePtr].Next := Node[TempPtr].Next End Else Begin TempPtr := Node[PrePtr].Next; Node[PrePtr].Next := Node[TempPtr].Next End; Remove(TempPtr) End End; Procedure LinkOrderSearch(List : PointerType; Item : ElementType; Var PrePtr : PointerType; Var Found : Boolean)
Var CurrPtr : PointerType; DoneSeaching : Boolean; {Bo hiu kt thc vic tm kim} Begin CurrPtr := List; PrePtr := 0; Found := False; DoneSeaching := False; While Not DoneSeaching and (CurrPtr <> 0) Do If Node[CurrPtr].Data >= Item Then Begin DoneSeaching := True; Found := (Node[CurrPtr].Data = Item) End Else 31 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut Begin PrePtr := CurrPtr; CurrPtr := Node[CurrPtr].Next End End; ng dng : Bng t vn bn
3. Ci t danh sch lin kt trn c s con tr a. Con tr v vic cp pht/thu hi b nh ng trong Pascal
nh ngha DS l s phn t c th thay i, khng b gioi hn Mng => khng trung thc => Cch ci t chnh xc i hi kh nng cp pht/thu hi cc vng nh cho cc nt. New : Cp pht ; Dispose : Gii phng Khai bo : PointerName : ^nh-danh-kiu; {hoc nh-danh-kiu} V d : Var StringPtr : ^String; Begin New(StringPtr) => Sau khi thc hin n gn mt a ch vng nh vo StringPtr; l a ch vng nh c th lu tr mt xu k t
Con tr c bit Nil (Con tr rng) c th c gn cho mt con tr kiu bt k Pointer := Nil; Cc php ton vi con tr : Php gn v so snh hai con tr cng kiu + Php gn : Pointer1 := Pointer2; C hai con tr ch n cng mt vng nh. + Cc php ton quan h = v <> c dng so snh hai con tr cng kiu c ch n cng mt vng nh hay khng hay c hai u rng. 32 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut Truy cp thng tin con tr : Pointer Hoc Pointer^ V d : StringPtr^ = COMPUTER; TempPtr^ = StringPtr^ (Khng tng ng vi TempPtr = StringPtr)
b. Ci t DSLK
Type ElementType = ..; PointerType = ^NodeType; {Kiu con tr ch n cc nt trong DS} NodeType = Record Data : ElementType; Next : PointerType End; Var List : PointerType; {Con tr ch ti nt u tin trong DSLK} Procedure Create(Var List : PointerType); Begin List := Nil; End; Function Empty(List: PointerType) : Boolean; Begin Empty := (List = Nil) End;
Procedure LinkTraverse(List : PointerType); Var CurrPtr : PointerType; Begin CurrPtr := List; While CurrPtr <> Nil do Begin X l CurrPtr^.Data; CurrPtr := CurrPtr^.Next end End; 33 TRUNG KIN
4. ng dng
b. Hng i
Type ElementType = .; PointerType = ^QueueNode; QueueNode = Record Data : ElementType; Next : PointerType End; QueueType = Record Front, Rear : PointType End; Var Queue : QueueType; Hc sinh t vit
34 TRUNG KIN
2. Danh sch vi nt u
Nhn thy vic chn v xa trong mt DSLK phi xt hai trng hp. => n gin hn thm vo mt nt u, khng cha d liu g c V d : => Cc phn t trong danh sch lun c nt ng trc => ch cn xt mt trng hp trong thao tc thm v xa Khi to (Create) New(List); List^.Next = Nil Kim tra rng : Empty := (List^.Next = Nil) Thm 1. 2. 3. 4. GetNode(TempPtr) Data(TempPtr) = Item Next(TempPtr) := Next(PrePtr) Next(PrePtr) = TempPtr
Xa 1. If Empty(List) Then Error := ListUnderFlow 2. Else begin TempPtr := Next(PrePtr) Next(PrePtr) := Next(TempPtr) end Duyt 1. Khi ng CurrPtr ti Next(List) 2. While CurrPtr <> Nil
: 35 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut + Ta c th duyt t bt k nt no. + Khi thm mt nt th khng cn phn bit thm trc nt u hay sau nt u Nhng phi ch ng tc Duyt : T php duyt tng qut ta c th vit rt nhanh mt th tc 1. CurrPtr := Clist 2. While CurrPtr <> Clist a. X l Data(CurrPtr) b. CurrPtr := Next(CurrPtr)
Sai, s khng lp ln no
Do nu ta bit chc DS khng rng ta dng Repeat thay cho While If CurrPtr <> Nil Then Begin CurPtr := Clist Repeat X l Data(CurPtr) CurrPtr := Next(CurrPtr) End Cch khc : Dng DSLK vi nt u. Chn vo mt danh sch lin kt vng : Khng cn xt trng hp nt khng c phn t ng trc, nhng phi xt trng hp chn vo mt danh sch rng Hnh v :
Procedure CListInsert (Var Clist; Item; PrePtr) {* Chn Item vo mt danh sch lin kt vng vi nt u tin c ch bi CLIST. PrePtr ch n nt ng trc nt cn chn (nu c)*} 1. GetNode(TempPtr) 2. Data(TempPtr) 3. If DS l rng lm cc bc sau : a. Next(TempPtr) := TempPtr b. Clist := TempPtr Else Lm cc bc sau : a. Next(TempPtr) := Next(PrePtr) b. Next(PrePtr) := TempPtr Xa t mt danh sch lin kt vng : 36 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut Procedure CListDelete( Var Clist; PrePtr) {Xa mt nt t mt danh sch lin kt vng vi nt u tin c ch bi Clist; PrePtr ch vo nt ng trc nt cn xa } If Empty(CList) Then Error := ClistUnderFlow Else Lm cc bc sau 1. TempPtr := Next(PrePtr) 2. If TempPtr = PrePtr then (*DS ch c mt nt*) Clist := Nil Else Next(PrePtr) := Next(TempPtr) 3. Remove(TempPtr)
DSLK kp n gin
DSLK kp ni vng
DSLK kp va ni vng va c nt u
Xt cc thao tc vi DSLK va ni vng va c nt u Khai bo Type DataType = .; Kiu ca cc phn t trong danh sch 37 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut PointerType = ^NodeType; NodeType = Record Data : DataType; Blink, Flink : PointerType; End; Var List : PointerType; Khi to New(List); List^.Blink := List; List^.Flink := List; Kim tra rng : s dng mt trong hai biu thc logic List^.Blink := List hoc List^.Flink := List Chn : Khng phi xt trng hp nhng lu phi thc hin theo ng th t Hnh v
SymmLinkedInsert(Var List : PointerType; Item : DataType; PrePtr : PointerType) ; TempPtr : PointerType; New(TempPtr); TempPtr^.Data := Item; TempPtr^.Blink := PrePtr; TempPtr^.Flink := PrePtr^.Flink; PrePtr^.Flink := TempPtr; TempPtr^.Flink^.Blink := Temp
End; Xa mt nt Hnh v Procedure SymmLinkedDelete(Var List : PointerType; CurrPtr : PointerType); Begin CurrPtr^.Blink^.Flink := CurrPtr^.Flink; CurrPtr^.Flink^.Blink := CurrPtr^.Blink; End; 38 TRUNG KIN
Chng 6 : CY (TREE)
I. nh ngha v khi nim
1. nh ngha cy
Cy l mt tp hu hn cc nt sao cho - C mt nt c bit gi l gc - Cc nt khc thuc vo n tp khng giao nhau v n tp ny cng l cc cy con V d : Mc lc ca chng 6 ny Chng 6 : cy nh ngha v khi nim nh ngha cy Cc khi nim Cy nh phn nh ngha v tnh cht Biu din cy nh phn Php duyt cy nh phn Cy biu din biu thc s hc Cy nh phn ni vng Cy tng qut 6.3.1 Biu din cy tng qut 6.3.2 Php duyt cy tng qut
b. Mc ca mt nt (level)
e. Rng
L tp hp n cy ring bit. Th d mt cy b gc th thnh rng.
II. Cy nh phn
1. Khi nim cy nh phn
Cy nh phn l cy c th t m mi nt c khng qu hai con. V d : A B B Cy y A C C Cy lch tri Cy zizzac C A B A
C Cy hon chnh
Cy hon chnh : L cy mi nt tr nt cui cng u c s nt l ti a. Ring nt cui cng c thiu th ch thiu con phi. Cy y : L cy mi nt (k c nt cui cng) u c s nt l ti a. B 1 : S nt mc th i th khng qu 2i-1 B 2 : S nt ca mt cy c cao l h th khng qu 2h -1
Gio n mn : Cu trc d liu v gii thut Vi mt cy c cao l h th ta biu din trong mt mng c 2h - 1 phn t. Mi nt th biu din trong mt phn t. Nt th i th biu din trong phn t th i ca mng. Vi cch biu din ny th nu nt cha phn t th i ca mng th con tri v tr 2i, con phi v tr 2i + 1. Nu con nm phn t th j th nt cha nm j div 2.
b. Lu tr mc ni
Mi nt nm ti cc v tr bt k, do ta phi lu li a ch ca con tri v con phi ca n. => Mi nt bn cnh trng cha thng tin ca nt cn thm 2 trng cha a ch ca con tri v a ch ca con phi. LChild Info RChild
a ch nt gc nm trong mt con tr T, ta gi l cy T.
Khai bo Type DataType = ..; Kiu d liu TreePointer = ^TreeNode TreeNode = Record Data : DataType; Lchild, Rchild : TreePointer; End;
3. Php duyt cy
L php x l (thm - Visit) cc nt trn cy theo mt th t no sao cho mi nt c x l ng mt ln. Ngi ta thng s dng 3 php duyt sau :
=> Th tc Procedure PreOrder ( T : TreePointer ); Begin If ( T <> Nil ) then Begin Writeln(T^.Info) PreOrder(T^.LChild); PreOrder(T^.RChild); End; End;
Th1
Th2
Th
Trong biu thc php tnh no thc hin cui cng s l gc; biu thc nm bn tri php tnh l cy con tri; php tnh nm bn phi biu thc l cy con phi. Sau biu din tip theo php tnh bn tri v bn phi php tnh cho n khi ton b biu thc c biu din thnh cy. V d :
Nu duyt cy biu thc theo th t trc c biu thc tin t Gia trung t Sau hu t V d :
Gio n mn : Cu trc d liu v gii thut 2: Writeln(T^.Data); 3: InOrder(T^.RChild) end End; Mi ln xong th phi tm li : - a ch nt hin ti (NodePos) - Li v (Back) Type PointerTree = ^TreeNode TreeNode = Record Data : DataType; Lchild, Rchild : PointerTree; End; PT = Record NodePos : PointerTree; Back : 2..3; End; {Stack l mt mng cc phn t} Procedure InOrder( T : PointerTree); Label : 1,2,3; Var St : Array[1..100] of pt; D : integer; P : PointerTree; B : 2..3; Begin D := 0; {Khi to Stack} P := T; 1: If P <> Nil Then begin d := d+1; St[d].NodePos := P; St[d].Back := 2; P := P^.Lchild; Goto(1); 2: Writeln(P^.Data); inc(d); St[d].NodePos := P; St[d].Back := 3; P := P^.Rchild; Goto 1; end; 44 TRUNG KIN
3: If (d <> 0) Then begin P := St[d].NodePos; B := St[d].Back; D := d - 1; Case B Of 2 : Goto 2; 3 : Goto 3; End Case end End; Nhn xt : Khi ta ly ra t Stack ra cp (a ch nt v li v = 3) th khng c tc dng => ta b i, ch cn mt li v l li v 2 cho nn khng cn lu. Do ta c => ST : Array[1..100] Of PointerTree; V 3 : If d <> 0 Then Begin P := ST[d]; Dec(d) End; Vit li th tc : Type PointerTree = ^TreeNode; TreeNode = Record Data : DataType; Lchild, Rchild : PointerTree; End; Procedure InOrder2 (T : PointerTree); Label 1,2; Var St : array[1..100] of PointerTree; D : integer; P : PointerTree; { duyt cy} Begin P := T; d := 0; 1 : If P <> Nil Then begin 45 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut inc(d); St[d] := P; P := P^.Lchild; Goto 1; 2: Writeln(P^.Data); P := P^.Rchild; Go to 1 end; If d <> 0 then Begin P := St[d]; Dec[d]; Go to 2 End End; Vit li th tc c cu trc hn : Procedure InOrder3 ( T : PointerTree); Var St : Array[1..100] of PointerTree; D : Integer; P : PointerTree; Done : Boolean; Begin P := T; d := 0; Done := false; Repeat While (P <> Nil) do Begin Inc(d); St[d] := P; P := P^.Lchild; End; If d <> 0 Then Begin P := St[d]; dec(d); Writeln(P^.Data); P := P^.Rchild; End Else Done := True; Until Done; End; Vit hm so snh hai s : Function Compare1(x,y : Integer) : Char; Begin 46 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut If x > y then ss := '>' Else if x < y then ss := '<' Else ss := '=' End; Procedure Compare2(x,y,z : Integer); {Gi thit x > y v ng z l ng tht} Begin If x > z then Writeln(x, ' : nang '); Else Writeln(y,' : nhe'); End; Var a, b, c, d, e, f, g, h : integer; Begin Write(' Cho trong luong 8 dong xu '); Readln(a, b, c, d, e, f, g, h); Case Compare1(a+b+c,d+e+f) Of '>' : Case Compare1(a+d,b+e) Of '>' : Compare2(a,e,h); '=' : Compare2(c,f,h); '<' : Compare2(b,d,h); '=' : If g > h Then Compare2(g,h,a) Else Compare2(h,g,a) '<' : Case Compare2(a+d,b+e) Of '>' : Compare2(d,b,h); '=' : Compare2(f,c,h); '<' : Compare2(e,a,h) End End;
47 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut Qui tc tnh o hm : D(c) = 0; D(x) = 1; D(lnx) = 1/x; D(u.v) = d(u).v + d(v).u D(u/v) = (vdu - udv)/v2 D(u v) = d(u) d(v) Gi thit trong biu thc khng c php ly tha nhng trong o hm vn c php ly tha. Cy biu thc gm cc nt c cc trng sau : - Lchild : Con tri; - Rchild : Con phi - Op : Cha ton hng - Type : Cha kiu ton hng o Hng : Type = 1 o Bin : Type = 2 o Du + , -, *, /: Type tng ng = 3 , 4, 5, 6 o Php tr mt ngi ! : Type = 7 o ^ : Type = 8 o Ln : Type = 9 Vit hm Copy mt cy Type St = string[5]; PointerTree = ^TreeNode TreeNode = Record Lchild, Rchild : PointerTree; Op : St5; Type : 1..9; End; Function Copy( T : PointerTree) : PointerTree; Var P : PointerTree; Begin If T = Nil Then Copy := Nil Else Begin New(P); P^.Op := T^.Op; 48 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut P^.Type := T^.Type; P^.Lchild := Copy(T^.LChild) R^.Rchild := Copy(T^.Rchild); Copy := p; End; End; Function MakeNode ( Oper : St5); {Dng xu Ops := '+ - * / ^ ! ln' Digits := '_ . 0 1 2 ..9' l bin tng th} Var P : PointerTree; Begin New(P); P^.Op := Oper; P^.Lchild := Nil; P^.Rchild := Nil; If Pos(Oper,Ops) <> 0 Then P^.Type := Pos(Oper, Ops) + 2 Else If Pos(Oper[1],Digits) <> 0 then P^.Type := 1 Else P^.Type := 2 MakeNode := P End; {Chng trnh ghp hai con L, R vo thnh cy} Function Create2( N1, N2, N3 : PointerTree) : PointerTree; {Ni N2, n3 thnh cy con tri, con phi ca N v tr v Create2 l N1} Begin N1^.Lchild := N2; N1^.Rchild := N3; Create2 := N1 End; { Ni con phi vo mt nt } Function Create1(N1, N2 : PointerTree) : PointerTree; { Ni N2 thnh con phi ca N1 v tr v gi tr ca hm Create1 = N1} Begin N1^.Rchild := N2; Create1 := N1 49 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut End; Function DaoHam(T : PointerTree; x : St5) : PointerTree; {Tnh o hm ca cy T theo x} Var Ops, Digits : String[20]; Dht, dhp, ts, ms, tg1, tg2, tg3 : PointerTree; Begin Ops := '+-*/^!ln'; Digits := '-.0123456789'; If T = Nil Then DaoHam := Nil Else If T^.Type = 1 then Daoham := MakeNode('0'); Else if T^.Type = 2 then If T^.Op = x then DaoHam := makeNode('1'); Else Daoham := MakeNode('0'); Else
Begin Dht := daoham(T^.Lchild,x); Dhp:= daoham(T^.Rchild,x); Case T^.Type of 3: Daoham := Create2(MakeNode('+'),dht,dhp) 4: Daoham := Create2(MakeNode('-'),dht,dhp) 5: begin tg1 := Create2(MakeNode(*),dht,Copy(T^.Rchild)) tg2 := Create2(MakeNode(*),Copy(T^.Lchild), dhp) DaoHam := Create2(MakeNode('+'),tg1,tg2); End; 6: begin tg3 := Copy(T^.Rchild); ms := Create2(MakeNode('^'),tg3,MakeNode('2')); tg1 := Create2(MakeNode('*'),dht,tg3); tg2:= Create2(MakeNode('*'),dhp,Copy(T^.Lchild)); Ts := Create2(MakeNode('-',tg1,tg2)); Daoham := Create2(makeNode('/',ts,ms)); end; 7: Daoham := Create1(MakeNode(!),dhp); 9: {lnn}
50 TRUNG KIN
DaoHam:=Create2(MakeNode('/'),dhp,Copy(T^.RChild)); Else Begin Writeln('Loi'); end End{End Of Case} End {End Of Else} DaoHam := Nil;
51 TRUNG KIN
Trc nt u tin v sau nt cui cng cha tr vo u v vy ngi ta thm mt nt u ( nt khng c thng tin) - Rchild tr n chnh n - Lchild tr n gc cy tht ca n. Nu cy rng th ch c mt nt u
Khai bo : Type DataType = .; PointerTree = ^TreeNode TreeNode = Record Data : DataType; Lchild, Rchild : PointerTree; Lcircle, Rcircle : Boolean; End;
Gio n mn : Cu trc d liu v gii thut While (Not TempPtr^.LCircle) Do TempPtr := TempPtr^.Lchild; Pos := TempPtr; End; Duyt theo th t gia : Procedure InOrder ( T : PointerTree); Var P : PointerTree; Begin If ( Not T^.Lcircle ) then {Cy khc rng} Begin P := Pos(T); While ( P <> T) DO Begin Writeln(P^.Data); P := Pos(P) end End End;
Gio n mn : Cu trc d liu v gii thut + Copy mi ni tri ca P sang Q Q^.Lchild = P^. Lchild; Q^.Lcircle = P^.Lcircle + Ni phi ca Q Q^.Rchild := P; Q^.Rcircle = true; + Sa mi ni tri ca P P^.Lchild = Q; P^.Lcircle := False 3) Sa nt trc Q ( trc kia nt ny trc P cn by gi nt ny trc Q) If (Q^.Lcircle = false) then Begin { Q c con tri} TempPtr := Pre(Q); TempPtr^.Rchild := Q; TempPtr^.Rcircle := True; End; => Ci t th tc
Gio n mn : Cu trc d liu v gii thut Ngi ta cng nh ngha 3 php duyt ging nhau nh php duyt cy nh phn - Duyt theo th t trc o Nu cy khc rng th Thm gc Duyt theo th t trc cy T1 Duyt theo th t trc cy T1, T2, .Tn. - Duyt theo th t gia - Duyt theo th t sau NGi ta cng xut pht t vn l nu ta vng theo cc nt ca cy th mi nt gp ng 3 ln - Gp ln 1 th a ra ta c duyt theo th t trc - Gp ln 2 th a ra ta c duyt theo th t gia ( => N khng tng ng vi ci no nn b) - Gp ln 3 th a ra ta c duyt theo th t sau
Chng 7 : Sp xp
I. Cc phng php sp xp n gin
1. Phng php la chn trc tip
Chn s b nht trong n s v tr th 1 Chn s b nht trong n - 1 s v tr th 2 Chn s b nht trong 2 s v tr th n - 1 For i := 1 to n-1 do Begin 1. Chn s b nht trong cc s t xi , xn 2. i ch cho xi End; => Ci t Type Mg = Array[1..100] of integer; Procedure SelectionSort( Var x : Mg; n : integer); Var i, j, m : integer; Tg : integer; Begin 55 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut For i := 1 to n-1 do Begin m := i; { tm v tr ca s nh nht } For j := i+1 to n do If x[m] > x[j] then m := j; {i ch} if ( i <> m ) then begin tg := x[m]; x[m] := x[i]; x[i] := tg end End End;
2. Phng php ni bt
x1, x2, .. xn-1, xn So snh hai s lin tip - Nu ng th t th nguyn - Nu ngc th t th i ch => Sau vng 1 th s b nht ni ln v tr 1 Sau vng 2 th s b nht trong n-1 s cn li ni ln v tr th 2 . Sau vng n-1 th s b nht trong 2 s cn li ni ln v tr th n-1 => Th tc sp xp Procedure BullbleSort( Var x : Mg; n : integer); Var i, j, tg : integer; Begin For i := 1 to n-1 do For j := n downto i+1 do If x[j] < x[j-1] then Begin Tg := x[j-1]; x[j-1] := x[j]; 56 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut x[j] := tg end End; Nhn xt : Nu dy c sp xp, ta vn phi so snh s ln lp -> lp phn t. => Khc phc khuyt im trn ta thm vo mt c . Nu mi cp u ng th t th c := true
Gio n mn : Cu trc d liu v gii thut y xj sang phi (j+1) Gim j End X[j+1] := k; 2/ x[1] x[2] x[3] x[4] 9 10 12 80 j = 3; k = 12; j = 2; x[0] := 12 x[0] 12 3/ x[0] 80 4/ x[0] 42 x[1] x[2] 9 10 x5 = 80; x4 = 80; 9 10 x[3] 12 x[4] 80 x[5] 42 x[1] x[2] 9 10 x4 = 80; x[3] 12 x[4] 80 x[5] 42 x[1] x[2] 9 10 x3 = 12; x[3] 12 x[4] 80 x[5] 42
x[5] 42
12
42
80
Gii thut Type Mg = Array[0..500] of integer; Procedure InsertionSort( Var X : Mg; Var i, j, k : integer; Begin For i := 2 to n do Begin k := x[i]; j := i-1; x[0] := k; While x[j] > k do Begin 58 TRUNG KIN
n : integer );
Gio n mn : Cu trc d liu v gii thut X[j+1] := x[j]; j := j -1 end x[j+1] := k End End;
Gio n mn : Cu trc d liu v gii thut var k, i, j, tg : integer; begin i := d; j := c; k := x[(i+j) div 2]; Repeat {tm t u dy xi >= k} While x[i] < k do inc(i) {Tm t cui dy xj <= k} While x[j] > k do dec(j) If (i <= j) then Begin i ch x[i], x[j] Inc(i), dec(j) End Until j < i; If d < j -1 then QuickSort(d,j) If i+1 < c then QuickSort(i,c) end; Gii thut sp xp nhanh khng qui - n on t 1 -> n vo Stack - Ly mt on ra t stack ri phn hoch o Nu di on 1 ln hn 1 th y vo Stack o Nu i di on 2 ln hn 1 th y vo Stack - Cho n khi Stack rng Gii thut Type pt = record d,c : integer; end; Mg = Array[1..500] of integer; Procedure SXNhanh(Var X : Mg; n : integer); Var Stack : array[1..100] of pt; Sp : Integer; {nh Stack} D, c, i, j, k, tg : integer; 60 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut Begin {y on 1,n vo Stack} Sp := 1; Stack[sp].d := 1; Stack[sp].c := n; Repeat {Ly mt on t Stack} d := Stack[sp].d; c:= Stack[sp].c; Dec(sp); {Phn hoch on va ly ra} i := d; j := c; Repeat While (x[i] < k) do inc(i) While (x[j] > k) do dec(j) If (i <= j) then Begin i ch x[i], x[j] Inc(i); Dec(j) End; Until i > j; If d < j then {y on d, j vo Stack} Begin Inc(Sp); Stack[sp].d := d; Stack[sp].c := j End; If c > i then {y on i, c vo Stack} Until sp = 0 {Stack rng} End;
Gio n mn : Cu trc d liu v gii thut T dy s ban u : 40 10 2 6 8 16 Ta lun c th coi l biu din k tip ca mt cy nh phn hon chnh theo nguyn tc. phn t th i ca dy th biu din nt th i ca cy. 1 2 10 4 6 5 8 16 6 40 3 2
Qu trnh sp xp chia lm hai bc : - Bc 1 : Vun cy ban u thnh ng - Bc 2 : Sp xp Bc 1 : Vun cy ban u thnh ng nh ngha ng : l mt cy nh phn hon chnh m mi nt cha u c trng kha ln hn kha ca hai nt con. Gii thut iu chnh Adjust(r,n) : iu chnh cy c gc l r, gm n nt thnh ng, gi thit hai cy con l ng. Th d iu chnh cy c gc l 1 ( cha gi tr 16 ) gm 6 nt thnh ng 1 16 2 3 10 4 6 5 8 2 6 40
So snh hai con tm con ln hn 10 < 40 : Con phi ln hn - So snh gc vi con ln o Nu gc ln hn con ln th xong o Nu gc b hn con th y con ln. Procedure Adjust(r,n: Integer); {iu chnh cy c gc r, gm n nt thnh ng, gi thit hai cy con l ng } Var c : integer; k : integer; {Cha kha gc} Done : Boolean; 62 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut Begin Done := False; C:= 2 * r; While ((c <=n) and not done) do Begin {Tm con ln} If (c < n) then {c con phi} If (x[c] < x[c+1] ) then c := c+1; {So snh con ln vi gc} If x[r] > x[c] then Done := true; Else Begin {y con ln} x[r] <=> x[c]; {Xung cy c gc l c c} r := c; c := 2 * c End; End End; T cy ban u iu chnh thnh cy 1 2 10 4 6 n = 6; 5 8 1, 2, 3 l gc 7 6 16 3 2 Dng Adjust iu chnh t di ln. Ch ch c cc nt 1, 2, . n div 2 ; mi l nt gc
3 7
TRUNG KIN
2/ iu chnh cy c gc i = 2 10 ==> 6 8 6 8 10
3/ iu chnh cy c gc i =1 1 16 2 10 4 6 5 8 2 6
1 3 7 ==> 4 6 2 10 5 8
16 3 7 6
Vy qu trnh iu chnh : For i := n div 2 to 1 do Adjust(i,n) Bc 2 : Sp xp + i ch x[1] cho x[n] ==> Dy sp xp l xn 1 2 10 4 6 + Vun ng 2 10 7 ==> 2 64 6 8 6 8 6 TRUNG KIN 2 10 ==> 7 8 10 7 5 8 2 6 16 3 7 Dy sp xp : 16
==> 7 6
8 7
7 2
i ch x[1] v x[2] c dy c sp xp : 2, 6, 7, 8, 10, 16 => For i := n-1 downto 1 do Begin 1. i ch x[1] <->x[i] 2. Adjust(1,i) End; Procedure Heap-Sort( var A : mg; n : integer); Var i : integer; tg : integer; Begin For i:= n div 2 downto 1 do {vun ng} 65 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut Adjust(i,n) {Sp xp} For i := n downto 2 do Begin {i ch a[1] <-> a[i]} a[1] <-Tg-> a[i] {Vun cy c gc l 1 v c i-1 nt thnh ng} Adjust(1,i-1); End; End;
Gio n mn : Cu trc d liu v gii thut Procedure mergesort(T[1..n]); Begin If n =1 then Return T Else Begin Array U[1..1+ n / 2 ], V[1..1+ n / 2 ; U[1.. n / 2 ]:= T[1.. n / 2 ]; V[1.. n / 2 ]:= T[1+ n / 2 ..n]; mergesort(U[1.. n / 2 ]); mergesort(V[1.. n / 2 ]); merge(U,V,T) End; Hnh sau ch ra cc bc ca mergesort.
MS(40, 12)
12 40
MS(16, 18)
16 18
MS ( 27, 21)
21 27
MS ( 50, 4)
4 50
MS(40)
40
MS(12) MS(16)
12 16
MS(18) MS(27)
18 27
MS(21) MS(50)
21 50
MS(4)
4
67 TRUNG KIN
Chng 8 : Tm kim
Bi ton : Cho n bn ghi c cc kha k1, k2, , kn. Hy tm mt bn ghi c kha l X. Nu tm thy th php tm kim l tha mn Ngc li th php tm kim l khng tha mn
Gio n mn : Cu trc d liu v gii thut While not Found and (d <= c) do Begin G := (d+c) div 2 If k[g] = X then Found := true Else if x > k[g] then D := g + 1 Else c := g -1 End If found then Loc := g Else Loc := 0 End; -> PT : O(Logn) Vit li thnh gii thut qui Trng hp suy bin khi x[g] := X; hoc d > c => Gii thut Function Loc( Var K : Mg; X, d, c : integer) : integer; Var g : integer; Begin If (d > c) then Loc := 0 Else Begin G := (d+c) div 2 If k[g] = x then Loc := g; Else if ( k[g] > x) then Loc := Loc(k,x,d,g-1) Else Loc := Loc(k,x,g+1,c) End; End; Thng th - Nu thy th thi - Nu khng thy th b xung vo dy theo ng th t Nu lu tr theo kiu k tip -> b xung mt cng -> Khc phc bng cch xy dng cy nh phn th vic b xung d dng hn.
69 TRUNG KIN
10
31
86
99
Nhn xt : Nu duyt theo th t gia ta c mt dy sp xp Gii thut tm kim trn cy nh phn tm kim Nu cy T khc rng th So snh vi gc Nu X = K[gc] th thy Nu X > K[gc] th xung cy con phi X < K[gc] th xung cy con tri Gi thit mi nt ch c mt trng cha thng tin l kha Lc Key Rc
V tm kim c b xung nn ta dng hai con tr P := T; Cho n tr vo gc cy T PreP := Nil; Vng lp While ((p <> Nil) and not found) do Begin If (x = p^.Key) then Found := True Else Begin PreP := P; If (x > P^.Key) then P := P^.Rc Else P := P^.Lc 70 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut End End; {B sung} If (not found) then Begin {To ra mt nt cha kha mi} New(Temp); Temp^.Key := X; Temp^.Lc := Nil; Temp^.Rc := Nil; {Ni vo cy} If (T = Nil) then T := Temp Else {Thnh con ca PreP} If (x < PreP^.Key) then PreP^.Lc := temp Else PreP^.Rc := Temp End; => Ci t gii thut procedure BST(var T, P: ptr; Var found : boolean; x : integer); {Tm nt c kha = x trn cy T, nu thy th found = true v p cha a ch ca nt c kha = x, nu khng thy th found=false, chn nt c kha = X vo cy, P cha a ch ca kha b sung } Var TrP : ptr; Begin {1. Tm} P := T; TrP := Nil; Found := false; While (not found) and (p <> nil) do begin if p^.Key = X then Found := true else begin trp := P; if (p^.Key < X) Then p := p^.Rc; else p := p^.Lc end end ; {B sung } 71 TRUNG KIN
Gio n mn : Cu trc d liu v gii thut If not found then Begin {To ra nt cha x} new(p); p^.Key :=X; p^.Lc := Nil; p^.Rc := Nil; {Ni vo cy T} If (T = Nil) then T := p; else If Trp^.Key > X then Trp^.Lc := P else Trp^.Rc := p End End; Th d : Vo mt dng kha 10, -2, -6, 9, 16 Tm kim v b sung vo cy T (rng) u tin T = Nil + Tm X = 10, v T = Nil nn b sung nt c kha 10 vo thnh cy T 10 + Tm 2; 2 10; v 2 < 10 sang cy cong tri, nhng con tri ca 10 l Nil vy b sung 2 thnh con tri ca 10. T 10
72 TRUNG KIN