You are on page 1of 72

Gio n mn : Cu trc d liu v gii thut

GIO N MN : CU TRC D LIU V GII THUT


Ni Dung : Chng 1 : M u Chng 2 : Thit k v phn tch gii thut Chng 3 : Qui Chng 4 : Cu trc d liu tuyn tnh v cch ci t bng mng Chng 5 : Cu trc d liu tuyn tnh v cch ci t bng danh sch lin kt Chng 6 : Cy Chng 7 : Sp Xp Chng 8 : Tm Kim Ni Dung Chi Tit :

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.

2. Mi lin h gia cu trc d liu v gii thut


Gii thut chnh l php x l i tng ca gii thut chnh l d liu c t chc thnh cc cu trc CTDL & GT gn cht vi nhau. Niklaus Wirth (ngi sng lp ra ngn ng Pascal) tng kt : Cu trc d liu + Gii thut = Chng trnh Nu ta thay i cu trc d liu th gii thut cng s thay i theo

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

II. Cu trc d liu v cc vn lin quan


1. Khi nim d liu
D liu th gm cc phn t c s nh l : mt k hiu, mt s, -> gi l d liu nguyn t. Cc d liu nguyn t kt hp vi nhau theo cc cch khc nhau th cho ta cc cu trc khc nhau Th d : ta c mt bng thng tin nh sau H Tn Tui SBD Ton L Ha NG V A 18 1A 10 10 10 . - Nu gp cc d liu trn cng mt ct l thnh cng mt cu trc th ta c mng (Vi bng thng tin trn ta c 7 mng) - Nu gp cc d liu trn cng mt hng li thnh mt cu trc ta c cu trc bn ghi (Ton b bng l mt mng cc bn ghi) Vic chn mt cu trc d liu thch hp cho bi ton l mt vn ht sc quan trng Khi ta nh ra mt cu trc th ng thi ta cng xc nh ngay cc php ton tc ng trn n - To ra mt cu trc - Hy mt cu trc - Thm mt phn t vo cu trc - Tru tng ha d liu

2. nh ngha kiu d liu


nh ngha Kiu d liu T c xc nh bi mt b <V,O> , vi : V : Tp cc gi tr hp l m mt i tng kiu T c th lu tr O : Tp cc thao tc x l c th thi hnh trn i tng kiu T. V du: Gi s c kiu d liu mu t = <Vc ,Oc> vi Vc = { a-z,A-Z} Oc = { ly m ASCII ca k t, bin i k t thng thnh k t hoa} Gi s c kiu d liu s nguyn = <Vi ,Oi> vi Vi = { -32768..32767} 3 TRUNG KIN

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

3. Mt s kiu d liu a. Cc kiu d liu c bn


L cc loi d liu n gin khng c cu trc v thng l cc gi tr v hng, bao gm : - Kiu c th t ri rc : S nguyn, k t, logic, lit k, min con , - Kiu khng ri rc : s thc Cc kiu c s rt n gin v khng th hin r s t chc d liu trong mt cu trc => thng ch c s dng lm nn xy dng cc kiu d liu phc tp khc.

b. Mt s kiu d liu c cu trc c bn


- Kiu chui k t Khai bo : Ty tng ngn ng Thao tc - So snh hai chui - Sao chp hai chui - Kim tra mt chui nm trong chui kia - Ct mt t ra khi mt chui - i mt s ra chui - i mt chui ra s - - Kiu mng Khai bo : Mng mt chiu : <Kiu d liu> <Tn bin> [<S phn t>]; Mng hai hoc nhiu chiu : <Kiu d liu> <Tn bin> [<S phn t 1>] [<S phn t 2>].; Cc thao tc : S c xem xt k trong chng - Kiu mu tin (cu trc) Khai bo : 4 TRUNG KIN

Gio n mn : Cu trc d liu v gii thut Typedef struct <tn kiu struct> { <KDL> <tn trng>; <KDL> <tn trng>; }[<Name>];

Chng 2 : THIT K V PHN TCH GII THUT


I. Thit k gii thut
Chia nh bi ton : Nu gi bi ton l mt modul chnh th ta chia modul chnh thnh cc modul con ri li chia cc modul con thnh cc modul con nh hn cho n khi ta c cc modul bit cch gii ri. -> Chin thut chia tr V d : Gii h phng trnh i s tuyn tnh n phng trnh n n

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;

II. Phn tch gii thut


1. Phn tch tnh ng n ca gii thut
Ta phi chng minh gii thut l ng Ngi ta thng lm : Cho chng trnh chy th vi mt b d liu bit kt qu Nu kt qu chng trnh khc vi kt qu bit th chc chn chng trnh sai; nu bng th cng cha c kt lun, do y ch l phng php tm ra ci sai m cha chng minh ci ng - Cho chy chng trnh ri xem kt qu c ph hp vi thc t khng, nu ph hp th hi vng ng, cn khng th chc chn sai - chng minh tnh chnh xc th phi dng ton hc hay dng qui np (rt kh)

2. Phn tch tnh n gin


Ty thuc bi ton c dng thng xuyn hay khng, nu chng trnh ch dng mt t ln ri b i th ta u tin tnh n gin Bi ton c s dng thng xuyn th ta u tin tnh hiu qu ca thut ton Tnh hiu qu th hin v hai mt - Khng gian (Chng trnh b chim t b nh) - Thi gian (Chng trnh chy nhanh)

6 TRUNG KIN

Gio n mn : Cu trc d liu v gii thut

III. nh gi thi gian thc hin ca gii thut


1. Thi gian thc hin ca gii thut
Thi gian thc hin ca gii thut ph thuc vo nhiu yu t - Trc ht ph thuc vo ln ca d liu u vo o Thi gian l mt hm ca n (kch thc d liu u vo) T = T(n) o V d : Tm kim tuyn tnh trong mt mng n phn t - Ngoi ra T cn ph thuc vo o My o Ngn ng o . Tuy nhin cc yu t ny l khng ng u do vy khng th da vo chng khi xc lp T(n) Vy n v ca T(n) tnh bng g ? Khng th tnh bng n v c th m tnh bng : S ln thc hin cc lnh ca gii thut Cch tnh ny c th hin c tnh nhanh hay chm ca gii thut hay khng ? Th d : GT1 c thi gian thc hin l t l vi n GT2 c thi gian thc hin l t l vi n2 Vi n kh ln th gii thut 1 nhanh hn gii thut 2 T m ta nh gi nh trn gi l phc tp tnh ton ca gii thut gii thut 1 ta ni GT c phc tp tnh ton cp n v k hiu T(n) = O(n) gii thut 2 th T = O(n2) nh ngha : Gi thut T c gi l c phc tp tnh ton cp g(n) nu nh tn ti hng s dng N0 v s nguyn dng C > 0 sao cho n N 0 ta lun c T(n) C. g(n) V ta k hiu l T(n) = O(g(n)) Hm g(n) thng chn l log n; n; n log n; n 2 ; n 3 ; 2 n ; n!; n n Hm a thc Hm m

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

Gio n mn : Cu trc d liu v gii thut

nh gi GT Cc lnh 1 2 3 4 5 6 7 8 T(n) = T(n) = 4n + 4 5n n 4 T(n) = O(n)

S ln thc hin 1 1 n n n n 1 1 4n + 4

2. Mt s qui tc c bn a. Qui tc loi b hng s


Nu ta c T(n) = O(C1.g(n)) th ta cng c T(n) = O(g(n)) Chng minh : T(n) C0.C1g(n) Cg(n) vi C = C0C1 T(n) = O(g(n)) V d

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

Chng 3 : QUI (RECURSSIVE ALGORITHM)


I. Khi nim qui
Mt i tng gi l qui nu nh mt b phn ca n l chnh n (hay ni cch khc n c nh ngha qua chnh n). Th d : Trong ton hoc ta hay gp cc nh ngha qui 1. S t nhin - 1 l s t nhin - x l s t nhin nu x-1 l s t nhin 2. hm tnh giai tha n=0 1 n!= n.(n 1)! n > 0 3. Dy Fibonaci 1, 1, 2, 3, 5, 8,.. 1 n2 Fib(n) = Fib(n 1) + Fib(n 2) n > 2

II. Gii thut qui v th tc qui


Li gii T ca bi ton c biu din qua T ging T th li gii T c gi l li gii qui. Gii thut cho li gii qui gi l gii thut qui V d : Tm t trong quyn t in - Nu t in bng mt trang th tm tun t trong - Nu t in khc 1 trang th o Chia i t in, xem t cn tm thuc na u hay na cui o Lp li gii thut tm t trong trang ( ch cn 1/2) Tnh cht : 1) C mt trng hp c bit kt thc qui ( Suy bin, gi tr neo ) - t in cn mt trang 2) Lp i lp li vic tm t trong quyn t in nhng mi ln lp quyn t in ch cn mt na v n dn n trng hp suy bin Th tc qui l iu kin cn v cho gii thut qui 9 TRUNG KIN

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

Gio n mn : Cu trc d liu v gii thut

Chng 4 : CU TRC D LIU TUYN TNH V CCH CI T BNG MNG


I. Phn loi cu trc d liu
Ta c th phn loi cu trc d liu da trn mi quan h gia cc phn t. Cu trc d liu tuyn tnh c quan h 1:1 gia cc phn t; tc l, nu cu trc d liu tuyn tnh c cha phn t th n phi c phn t u tin v phn t cui cng, mi phn t (tr phn t u tin v phn t cui cng) c ng mt phn t tin bi (ng ngay trc) v mt phn t hu bi (ng ngay sau). Cu trc d liu phn cp c quan h 1:n gia cc phn t; tc l, mi phn t trong cu trc c nhiu hu bi, nhng ch c mt tin bi (Hnh 4-1b). (Cy) Cu trc th: Cc phn t c mi quan h n:n. Tc l, mi phn t c th c quan h vi mt hoc nhiu phn t khc (Hnh 4-1c). Cu trc tp hp. Trong mt tp hp, cc phn t khng c mi quan h trc tip vi nhau, gia chng ch c mt mi quan h l thnh vin ca tp hp, ta khng cn quan tm ti v tr chnh xc ca mt phn t no trong tp hp (Hnh 4-1d). Phn Phn
t u

C duy nht mt tin bi (ngay

C duy nht mt hu bi (ngay

a. Cu trc tuyn tnh


Phn t nh (T ) Duy nht mt tin bi C th nhiu hu bi

b. Cu trc phn cp

12 TRUNG KIN

Gio n mn : Cu trc d liu v gii thut

Nhiu tin bi

Nhiu hu bi

c. Cu trc th
Khng c tin bi

a. Cu trc tp hp

Khng c hu bi

Hnh 4-1: Phn loi cu trc d liu

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 :

loc(A[i])=loc(A[LowerBound]) +s* (i LowerBound)


13 TRUNG KIN

Gio n mn : Cu trc d liu v gii thut

b. Mng hai chiu


Khai bo A : Array [1..m, 1..n] of ElementType {m hng; n ct} A : array [1..3,1..2] of real; {Ginh ra 6 x 6 = 36 Byte} C hai cch lu tr - Lu theo hng (lu ht hng ny n hng kia) Hg3 Hg2 Hg1 A11 A12 A13 A14 A15 A16

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

2. Ci t Stack bng mng


(* Module ci t kiu d liu tru tng Stack bng mng mt chiu *) StackElementType = ..; (* Kiu d liu cu phn t trong Stack*) Const MaxStack = 50; Type StackType = Record Element : Array[1..MaxStack] Of StackElementType; Top: 0.. MaxStack; End; Procedure Create(Var Stack: StackType); (* Th tc ny to ra mt Stack mi, rng *) Var Begin Stack.top := 0; End; Procedure Empty(Stack: StackType): Boolean; Begin Empty := (Stack.Top = 0); (*Stack rng nu top = 0*) End; Procedure Full(Stack: StackType): Boolean; Begin Full := (Stack.Top = MaxStack); (*Stack y nu cc v tr trong mng *) End; Procedure Pop(Var Stack: StackType, Var Item : StackElementType); (* Pop() xo phn t u tin ra khi Stack *) Begin If Empty(Stack) Then half; Else With Stack Do Begin E := Element[Top] Top := Top 1; End; Endif End Pop; Procedure Push(Item:StackElementType, Var Stack: StackType); (* Push() y phn t vo nh Stack *) Begin If Full(Stack) Then half; 15 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;

3. Cc ng dng trn Stack


Bi ton : Bin i mt s t h thp phn sang h c s hai v biu din ln mn hnh. Write(Dua vao so nguyen duong de chuyen doi : ); Readln(Number); Creat(Stack) While Number <> 0 Do Begin Sdu := Number mod 2; Push(Sdu, Stack) Number := Number div 2 End; Write (Bieu dien co so hai : ) ; While not Empty(Stack) Do Begin Pop(sdu, Stack); Write(sdu : 2) 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

2. Ci t Queue bng mng


Thm mt phn t thng thm vo cui hng Queue [Rear] := Item Rear := Rear + 1; Ly i mt phn t Item := Queue [front] Front := Front + 1; Xt mt v d DeQueue(Q); EnQueue(d,Q); EnQueue(e,Q); EnQueue(f,Q); Gi s Queue ban u c dng : a => b Front b c Front c Rear d e f Rear

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

Gio n mn : Cu trc d liu v gii thut

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

Gio n mn : Cu trc d liu v gii thut

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

3. ng dng trn Queue


i mt s l t h 10 sang h 2 0,4510 => 0,01110012 Chng trnh BEGIN Clrscr; Creat(q); Write(Nhap mot so le : ); Readln(Sole); d := 1; While ((Sole <>0) and d < 10) do Begin EnQueue(Trunc(Sole*2),Q); Sole := Frac(Sole*2); Inc(d) End; Write(Bieu dien co so 2 : ); While not Empty(Q) do Begin DeQueue(Item,Q); Write(Item); End; Readln END.

19 TRUNG KIN

Gio n mn : Cu trc d liu v gii thut

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

I. Danh sch tuyn tnh


1. nh ngha danh sch tuyn tnh
Nhn xt : - Stack ch b sung/ xo phn t mt u - Queue b sung phn t vo ui v xo phn t u Queue - Deque c th b sung/ xo c hai u nhng khng th b sung/xo gia => Danh sch tuyn tnh Danh sch (cu trc d liu tuyn tnh) : Danh sch l mt tp c th t cc phn t c cng kiu v s phn t l lun thay i Danh sch hoc l rng hoc c dng a1, a2, , an. a1 : Phn t u tin khng c phn t i trc an : Phn t cui khng c phn t i sau ai (1 < i < n) lun c mt phn t i trc l ai-1v mt phn t i sau ai+1.

20 TRUNG KIN

Gio n mn : Cu trc d liu v gii thut

2. Cch lu tr danh sch


Ta c hai cch lu danh sch trong b nh

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

3. Cc thao tc trn danh sch tuyn tnh a. Cc thao tc to v hy


L:= Creat() : Tr v mt danh sch rng.

Destroy(L) : Kt thc s tn ti ca danh sch L b. Cc thao tc kim tra


Empty(L) : Boolean; Tr v True nu danh sch rng; v False nu ngc li Full(L) : Boolean; Tr v True nu danh sch y; v False nu ngc li Size(L) : Tr v s phn t hin c trong danh sch. Nu danh sch rng th hm tr v gi tr 0 21 TRUNG KIN

Gio n mn : Cu trc d liu v gii thut

c. Cc thao tc b sung v loi b


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. } Delete(Var List : ListType; Pos : Integer); {Th tc xa Item v tr Pos t danh sch List}

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

InsertAtEnd(L,I) DeleteFirst(L) Concatenate(L1,L2) Sort(L) Split(L,N,L1,L2)

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.

4. Ci t tun t ca danh sch trn c s mng


Const MaxSize = ; { di cc i ca danh sch} Type ElementType = ..; {Kiu ca cc phn t trong danh sch} ListArray = array[1..MaxSize] of ElementType; LisType = Record Element : ListArray; Size : 0..MaxSize; Var List : ListType; Creat(Var List : ListType) List.Size := 0 Empty(List : ListType) : Boolean; Empty := (List.Size = 0); Full(List : ListType) : Boolean; Full := (List.Size = MaxSize) 22 TRUNG KIN

Gio n mn : Cu trc d liu v gii thut

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

Gio n mn : Cu trc d liu v gii thut

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.

II. Danh sch lin kt


1. Gii thiu v danh sch lin kt
Danh sch => dng mt phng php th hin th t Mng => th t c th hin di dng n => kh khn trong thm v bt mt phn t. Xt mt cch ci t khc m th t cc phn t c biu din di dng hin => danh sch lin kt. N gm mt tp cc phn t gi l nt (Node). Mi nt cha hai mc tin : (1) phn t ca danh sch v (2) con tr ch v tr ca nt cha phn t tip theo trong danh sch. V d : Data Next Data Next Data Next List Brown Brown Brown

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

2. t List := TempPtr List TempPtr

Nu t theo th t ngc li : List TempPtr

Trng hp 2 : Chn vo sau mt nt c tr bi PrePtr (Phi theo th t) 1. t Next(TempPtr) = Next(PrePtr) PrePtr

TempPtr 2. t Next(PrePtr) = TempPtr 25 TRUNG KIN

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

TempPtr 26 TRUNG KIN

Gio n mn : Cu trc d liu v gii thut

= > th tc xa mt phn t khi danh sch

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)

2. Ci t danh sch lin kt trn c s mng


Nhc li : Mi nt trong mt DSLK gm 2 phn : Phn d liu lu tr mt phn t ca danh sch v phn lin kt ch n mt nt cha phn t tip theo trong danh sch, hoc l Nill nu phn t ang xt l phn t cui cng ca danh sch. => Mt nt biu din nh mt bn ghi, v DSLK l mt mng cc bn ghi. Mi bn ghi gm 2 trng : trng DL v trng LK. Trng DL lu mt phn t trong DS cn trng LK lu ch n phn t ng sau n bng cch lu tr ch s ca n trong mng. Ngoi ra c mt bin List lu tr ch s ca phn t u tin trong mng V d :

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

Gio n mn : Cu trc d liu v gii thut

Ch l cch vit li => Tng t vi cc thao tc khc

4. ng dng

III. Nghin cu thm v danh sch


1. Ngn xp v hng i lin kt a. Ngn xp
Type ElementType = .; PointerType = ^StackNode; StackNode = Record Data : ElementType; Next : PointerType End; StackType = PointerType; Var Stack : StackType; Procedure Create(Var Stack : StackType); Function Empty(Stack : StackType): Boolean; Procedure Pop(Var Stack : StackType; var Item : ElementType); {Tng ng vi th tc xa mt phn t u DS} Procedure Push(Var Stack : StackType; Item); {Tng ng vi th tc chn mt phn t vo u DS}

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

Gio n mn : Cu trc d liu v gii thut

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

3. Danh sch lin kt vng


danh sch ni n duyt danh sch ta phi xut pht t u danh sch v khng th i ngc c. c th duyt t bt k nt no trong danh sch th ta cho con tr Nil cui danh sch tr v u danh sch v nh vy ta c mt danh sch ni vng

: 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)

4. Danh sch lin kt kp


Trong DSLK trc, tm mt nt ng trc n ta phi bt u t nt u tin trong danh sch. => tm hiu cch thit k v x l danh sch hai chiu. Mi nt gm cc trng : Hnh v Cc trng cha thng tin ca nt Trng cha a ch ca nt trc (BLink Backward Link) v nt sau (FLink Forward Link) ca nt

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

Procedure Var Begin

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

Gio n mn : Cu trc d liu v gii thut

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

2. Cc khi nim a. Cp (degee)


Cp ca mt nt trn cy l s con ca nt Cp ca mt cy l cp cao nht ca mt nt trn cy Nt c cp l 0 c gi l nt l (nt tn cng ) Nt c cp khc 0 c gi l nhnh (cnh) Gc cy c mc l 1 Con ca gc c mc l 2 L mc cao nht ca cc nt trn cy

b. Mc ca mt nt (level)

c. Chiu cao ca cy (Chiu su) d. Cy c th t v cy khng th t


Nu trong mt cy m ta phn bit th t ca cc cy con th l cy c th t (Ordered Tree) ngc li l cy khng c th t (UnOrdered Tree). 39 TRUNG KIN

Gio n mn : Cu trc d liu v gii thut

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

2. Biu din cy nh phn


Ta c hai cch biu din

a. Biu din k tip


Vi mt cy nh phn ta d dng nh s cc nt t trn xung di, t tri qua phi. 1 A h=3 2 3 B 4 D 40 TRUNG KIN C A B C D 0 0 0

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 :

a. Duyt cy theo th t trc (PreOrder)


Nu cy khc rng th : - Thm gc - Duyt cy con tri theo th t trc - Duyt cy con phi theo th t trc 41 TRUNG KIN

Gio n mn : Cu trc d liu v gii thut

=> Th tc Procedure PreOrder ( T : TreePointer ); Begin If ( T <> Nil ) then Begin Writeln(T^.Info) PreOrder(T^.LChild); PreOrder(T^.RChild); End; End;

b. Duyt cy theo th t gia (InOrder)


Nu cy khc rng th - Duyt cy con tri theo th t gia - Thm gc - Duyt cy con phi theo th t gia = > Th tc

c. Duyt cy theo th t sau (PosOrder)


Nu cy khc rng th - Duyt cy con tri theo th t sau - Duyt cy con phi theo th t sau - Thm gc T = > Th tc V d minh ha : 1 A 2 B 4 D Nhn xt : Nu nh ta men theo cc nt ca cy xut pht t bn tri th mi nt ta gp ng 3 ln - Nu gp ln 1 m a ra th ta c duyt theo th t trc - Nu gp ln 2 m a ra th ta c duyt theo th t gia - Nu gp ln 3 m a ra th ta c duyt theo th t sau 42 TRUNG KIN 3 C Trc : A B D C Gia : D B A C Sau : DB C A

Gio n mn : Cu trc d liu v gii thut

4. Cy biu din biu thc s hc


Pt th1(Ton hng 1) PT(Php tnh) 5 * th2(Ton hng 2) x Pt Php ton mt ngi Pt th ( -b )

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 :

Kh qui trong php lit k


Th d th tc duyt theo th t gia. Procedure InOrder( T : PointerTree); Begin If T <> Nil Then Begin InOrder ( T^.LChild); 43 TRUNG KIN

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

Gio n mn : Cu trc d liu v gii thut

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;

Tnh o hm ca mt biu thc


Biu thc cn tnh o hm l mt cy. o hm ca biu thc ny cng l mt cy. V d :

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

Gio n mn : Cu trc d liu v gii thut

DaoHam:=Create2(MakeNode('/'),dhp,Copy(T^.RChild)); Else Begin Writeln('Loi'); end End{End Of Case} End {End Of Else} DaoHam := Nil;

End; {End Of Function}

III. Cy nh phn ni vng


Vi mt cy c n nt th ta c ti n + 1 mi ni khng. tn dng cc mi ni khng ngi ta cho n tr n mt nt no trong mt th t duyt no . Chng hn : th t gia th ngi ta cho con tr phi tr ti nt ng sau nt hin ti; con tr tri r ti nt ng trc n. D nhm ln gia mi ni n con tr tht v mi ni n nt ng trc hay sau trong mi ni vng. Do vy m ta phi thm 2 trng : + Trng th 1 : LVong nh du trng con tri Nu Lvng = True th l mi ni vng Nu Lvng = false th l mi ni n con tr tri ca n + Trng th 2 : RVong nh du con tr phi; nh ngha tng t Do vy mi nt ti thiu gm 5 trng : - LChild : Tr n con tri ca n - LCircle : Boolean ( = True th Lchild l ni vng; False th Lchild tr ti con tri ca n) - Rchild : Tr n con phi ca n - RCircle : Boolean ( = True th Rchild l ni vng; False th Rchild tr ti con phi ca n) - Info : Cha thng tin ca nt. V d :

51 TRUNG KIN

Gio n mn : Cu trc d liu v gii thut

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;

Gii thut tm nt i sau nt P


T tng : TempPtr : = P^.RChild; Nu P^.Rcircle = True th TempPtr l nt i sau Nu P^.Rcircle = false th TempPtr l con phi thc s ca P. tm nt i sau P th i xung nt tn cng bn tri. While TempPtr^.LCircle = false Do TempPtr = TempPtr^.LChild (Kt thc lp th TempPtr l nt i sau) Ci t : Function Pos( P : PointerTree) : PointerTree; Var TempPtr : PointerTree; Begin TempPtr := P^.Rcircle; If ( Not P^.RCircle) then Ta tm n nt tn cng tri ca TempPtr 52 TRUNG KIN

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;

Tm nt i trc P trong th t gia


TempPtr := P^.Lchild Nu P^.Lcircle = true th TempPtr l nt i trc Nu P^.Lcircle = False th P TempPtr l con tri ca P, Khi ta i xung tn cng bn phi While TempPtr^.Rcircle = False do TempPtr := TempPtr^.Rchild

Thm mt nt thnh con tri ca nt P, nt thm c d liu = Item


1) To ra mt nt cha Item : New(Q); Q^.Data := Item;

2) Sa li cc mi ni trong P v Q 53 TRUNG KIN

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

IV. Cy tng qut


C th thm m trng mc ni vo mi nt tr n m con ca n. Nu mt cy c n nt th n s c (n.m) mi ni; trong n(m-1) + 1 nt mi ni khng => lng ph. C th ty theo s con ca mi nt m t chc mi nt c s mi ni khc nhau => qu phc tp Vy c th biu din cy tng qut bng cy nh phn khng ? lm c Vi mi nt ca cy tng qut nu c th - C duy nht mt con cc tri - C mt em cn phi Vy ta biu din con cc tri l con tri ca nt Em cc phi l con phi ca nt . V d : Php duyt cy tng qut Phi nh ngha sao cho - Nu duyt cy tng qut theo php duyt tng qut th cng cho kt qu nh l duyt cy nh phn tng ng theo php duyt cy nh phn - .. 54 TRUNG KIN

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

3. Phng php chn trc tip


Tm kim cc gi tr ng gc Tm y trong dy s xi Vi mi xi ta phi lm hai ng tc kim tra 1. i <= n 2. y = x[i] Ci tin t s y cui mi dy x, ta b i kim tra iu kin i <= n ch cn While (x[i] <> y) do inc(i) . Phn t y c gi l phn t ng gc. => Th tc i := 1 x[n+1] := y {phn t ng gc} While (x[i] <> y) do inc(i); If (i = n+1) then Khng thy Else thy Cho dy x1, x2, ..xn-1, xn Chia dy thnh hai phn - Phn u : x1 sp xp - Phn hai : x2, ..xn-1, xn cha sp xp Ly tng s ca phn 2 chn vo phn 1 theo ng th t Th d : Cho dy 10 9 12 80 42 1/ x[0] x[1] x[2] x[3] x[4] x[5] 9 10 / 9 12 80 42 i := 2 k = x2 = 9 j = i -1 =1 x[0] := k {phn t ng canh} Tm v tr chn While xj > k do Begin 57 TRUNG KIN

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;

II. Cc phng php sp xp phc tp


1. Phng php sp xp nhanh (Quick - Sort)
Ci tin ca phng php ni bt phng php ni bt ta i ch hai phn t lin tip gn nhau y ta s tm cch i ch hai phn t xa nhau Cch lm Chn mt s bt k trong dy ( thng chn x[i] hoc x[1+n] div 2 ) lm kha cht. Cho dy x1, x2, ..xn-1, xn Tm t u dy xi >= k Tm t cui dy xj <= k Nu i < j then - i ch xj cho xi - Tng i gim j Ri li tip tc tm vo trong cho n khi j < i V d : 10 8 7 80 42 k = 7; i = 1; j = 5 j = 3 => i ch 7, 10 7 8 10 80 42 i = 2; j = 2; k = 8; Sau mt vng chia dy thnh 2 on - on u <= k - on sau >= k Sau ta li phn hoch tip cc on c di ln hn 1 cho n khi mi on u c di = 1 coi nh xong. Gii thut : Type Mg = Array[1..500] of integer; Procedure QuickSort(d,c); {Sp xp cc on t xd ti xc} 59 TRUNG KIN

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;

2. Sp xp vun ng (Heap - Sort)


Tm s ln nht trong x1, x2, .. xn-1, xn ri i ch cho xn, khi xn c sp xp. Sau tm s ln nht trong n-1 s x1, x2, ..xn-1 ri i ch cho xn-1, khi xn-1, xn c sp xp. Nu tm s ln nht bng cch chn trc tip th ta c gii thut SelectionSort Tm hiu cch mi : Tm s ln nht bng cch vun thnh ng 61 TRUNG KIN

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

1/ iu chnh cy c gc i = n div 2 = 3 3 2 ==> 7 6 6 2 63

3 7

TRUNG KIN

Gio n mn : Cu trc d liu v gii thut

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

Gio n mn : Cu trc d liu v gii thut

+ i ch x[1] cho x[5] -> dy sp xp 10, 16 + Vun ng 2 ==> 8 7 2

==> 7 6

8 7

6 6 + i ch x[1] cho x[4] -> dy sp xp 8, 10, 16 + Vun ng 2 6 7 ==> 6

7 2

+ i ch x[1] cho x[3] -> dy sp xp : 7, 8, 10, 16 + Vun ng 2 6 ==> 2 6

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;

3. Sp xp theo kiu ha nhp


Tch mng T thnh hai phn m kch thc ca chng sai khc nhau cng t cng tt, sp xp cc phn ny bng cch gi qui v sau trn chng li (ch duy tr tnh th t). lm c iu ny chng ta cn mt gii thut hiu qu cho vic trn hai mng c sp U v V thnh mt mng mi T m kch thc ca mng T bng tng kch thc ca hai mng U v V. Vn ny c th thc hin tt hn nu ta thm vo cc nh c sn cui ca mng U v V cc gi tr ng canh (gi tr ln hn tt c cc gi tr trong U v V) . Procedure merge(U[1..m+1],V[1..n+1],T[1..m+n]); (*Trn 2 mng U[1..m+1] v V[1..n+1] thnh mng T[1..m+n]); U[m+1],V[n+1] c dng cha cc gi tr cm canh*) Begin i:=1;j:=1; U[m+1]:=; V[n+1]:=; For k:=1 to n+m do If U[i]<V[j] then Begin T[k]:=U[i]; i:=i+1 End Else Begin T[k]:=V[j]; j:=j+1 End End; Gii thut sp xp trn sau y c th tt hn nu cc mng U v V l cc bin ton cc v xem vic sp xp chn Insert(T) nh l gii thut c bn 66 TRUNG KIN

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.

MergeSort(40, 12, 16, 18, 27, 21, 50, 4) - MS()


4 12 16 18 21 27 40 50

MS(40, 12, 16, 18)


12 16 18 40

MS ( 27, 21, 50, 4)


4 21 27 50

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

Gio n mn : Cu trc d liu v gii thut

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

I. Tm kim tun t c phn t ng canh


t phn t ng canh cui dy kn+1 = X; I := 1; While (x <> k[i]) do inc(i); If i = n+1 then Khng thy Else Thy Vit di dng hm - Nu tm thy th gi tr ca hm = ch s ca phn t - Nu khng tm thy th gi tr ca hm = 0 Type Mg = Array[1..1000] of integer; Function Loc(Var k : Mg; X,n : integer) : integer; Var i : integer; Begin i := 1; k[n+1] := x; While (k[i] <> x) do inc(i) If i = n+1 then loc := 0 Else loc := i End;

II. Tm kim nh phn


Cho dy kha k1, k2, , kn c sp xp theo th t ( gi s th t tng) Hy tm v tr ca bn ghi c gi tr X Dng gii thut tm kim nh phn Function Loc( Var k : Mg; X, n : integer) : integer; Var d, c, g : integer; Found : Boolean; Begin D := 1; c := n; Found := false; 68 TRUNG KIN

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

Gio n mn : Cu trc d liu v gii thut

III. Cy tm kim nh phn - Gii thut BST


nh ngha : Cy tm kim nh phn L mt cy nh phn m mi nt u c tnh cht Kha ca nt th ln hn mi kha ca cc nt thuc cy con tri v nh hn mi kha ca cc nt thuc cy con phi. 40 30 90

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

2 + Tm 6; 6 10; v 6 < 10 nn sang cy con tri

72 TRUNG KIN

You might also like