You are on page 1of 164

CU TRC D LIU & GII THUT

NI DUNG MN HC
Cc khi nim c bn v cu trc d liu
Cc thut ton sp xp v tm kim Danh sch lin kt

Ngn xp
Hng i Cy v cy nh phn

CHNG I CC KHI NIM C BN

I. Vai tr ca cu trc d liu


Xy dng mt n tin hc thc cht l

chuyn mt bi ton thc t thnh mt bi ton gii quyt c bng my tnh => Xy dng mt bi ton cn m t:
i

tng d liu dng trong bi ton Cc yu cu x l trn i tng

CTDL + Thut gii = chng trnh

II. Cc tiu chun nh gi CTDL


Phn nh ng thc t

Ph hp vi cc thao tc x l
Tit kim ti nguyn h thng

III. Khi nim kiu d liu


My tnh ch lu tr d liu dng nh phn

=> m t cc loi d liu my hiu phi a ra khi nim v mt hnh thc lu tr v c gi l Kiu d liu

1. nh ngha kiu d liu


Kiu d liu T c xc nh bi mt b

<V,O> vi: V: l tp cc gi tr hp l i tng kiu T c th lu tr O: l tp cc thao tc x l c th thc hin trn cc i tng kiu T V d Kiu s nguyn SN=<Vi,Oi> vi Vi = {-3276832767} Oi = {+, -, *, , mod, div}

2. Cc yu t xc nh kiu d liu
Tn kiu d liu

Min gi tr
Kch thc lu tr Tp cc ton t(thao tc) thc hin trn kiu

DL

3. Cc kiu d liu c bn
l cc kiu nh sn v c

sn trong mi trng Cc kiu d liu c bn trong C: char - long - float int - double unsign int

4. Kiu d liu cu trc


L kiu to ra t cc thnh phn c s khc

nhau bng cch kt hp theo nguyn tc no n struct. C php khai bo struct struct tn_cu_trc { //m t cc thnh phn }; struct date { int ngay; int thang; int nam; };

IV: nh gi phc tp
phc tp thut ton c th hin

qua khi lng thi gian v khng gian thc hin thut ton.

Khng gian: yu cu b nh, thit b lu tr, Thi gian: tng thi gian cn thit hon thnh thut ton

* phc tp thi gian


c nh gi da vo s lng cc

thao tc c s dng trong thut ton trn b d liu u vo c gi l phc tp tnh ton Cc thao tc c xem xt: so snh hai i lng cng, tr, nhn, chia

*Phn loi phc tp


Trng hp tt nht: l thi gian nh

nht cn thc hin thut ton k hiu: T(n) Trng hp xu nht: l thi gian ln nht cn thc hin K hiu: t(n) Trng hp trung bnh: tnh cho trng hp tng qut

*K hiu O
Thng thng khng quan tm n con s chnh xc

thi gian thc hin ca thut ton. M quan tm n khi tng kch c ca d liu u vo th thi gian thc hin tng nh th no? V d: t(n) = 20n2+5n+1 T(n) = n2+10n+1 nh ngha Cho hai hm s thc f v g c min xc nh trong tp N. Ta vit f(n) O(g(n)) v ni f(n) c cp cao nht l g(n) hay f(n) thuc lp O(g(n)), khi c mt hng s C sao cho: | f(n) | C. | g(n) |

V d: t(n) = 20n2 + 5n+1 v T(n)=n2+10n+1 th t(n) v T(n) c cp cao nht l n2 t(n) O(n2) v T(n) O(n2)

*Cc lp phc tp c bn

phc tp hng: O(1) phc tp logarit: O(log2 n) phc tp tuyn tnh: O(n) phc tp nlogn: O(n log2 n) phc tp a thc: O(nb) phc tp ly tha: O(bn) phc tp giai tha: O(n!)

Trong : n l kch c d liu u vo

CHNG II CC THUT TON TM KIM


Tm kim tuyn tnh Tm kim nh phn

1. Pht biu bi ton


Cho n i tng (phn t) v mt gi tr x bt

k. Yu cu tm kim x trong dy n i tng trn.

2. Thut ton tm kim tuyn tnh


a. tng: Ln lt so snh phn t x vi

phn t th nht, th hai, th ba, ca dy s cho n khi hoc tm thy phn t x hoc so snh n phn t cui cng ca dy m k tm thy

b.Thut ton
u vo:

x l ga tr cn tm n s phn t mng a mng cha cc phn t u ra: v tr cha phn t x (nu c) Bc 1: i = 0 Bc 2: so snh a[i] vi x, c 2 kh nng; nu a[i]=x => tm thy x v dng nu a[i]x => chuyn sang bc 3 Bc 3: i = i+1 //xt phn t k tip C 2 kh nng: i>=n: ht mng, ko tm thy => Dng i<n: chuyn sang bc 2

c. Ci t

Kt qu hm tr li v tr u tin tm thy

phn t x hoc tr li gi tr -1 nu khng tm thy.

int LineSearch(int a[ ], int n, int x) { int i=0; while((i<n)&&(a[i]!=x) i++; if (i==n) return 1; else return i; }

d. phc tp thut gii l:


=> phc tp ca thut ton l O(n)

e. V d minh ha
Cho dy s a:

a=4 3 2 6 7 3 5 4 tm xem phn t x = 2 c trong dy khng?

i=0

x=2

4
i=1

3
x=2

4
i=2

2
x=2

4
=> Dng

3. Thut ton tm kim nh phn


tng: Xt dy tng c th t( tng hoc gim). Gi s dy tng dn ai-1aiai+1 a1a2a3 ai-1aiai+1 an-1an Khi vi mt phn t ai bt k, ta c: + Nu x>ai x ch c th nm trong khong [ai+1an] + Nu x<ai x ch c th nm trong khong [a1ai-1] Gii thut tm kim nh phn da vo nguyn tc: So snh gi tr x vi phn t gia ca dy tm kim hin hnh. da vo gi tr ny s quyt nh gii hn dy tm kim bc k tip l na trc hay na sau.
a.

b.Thut ton
u vo:

x l ga tr cn tm n s phn t mng a mng cha cc phn t c sp xp tng dn left, right l ch s u v cui ca mng thc hin tm middle ch s phn t gia ca an cn tm u ra: v tr cha phn t x (nu c)

Bc 1: Khi u tm kim trn tt c cc phn t ca dy left = 0 v right = n - 1 Bc 2: Tnh middle = (left + right)/2. So snh a[middle] vi x. C 3 kh nng: a[middle] = x Tm thy => Dng a[middle] > x tip tc tm x trong dy con mi vi right = middle - 1 a[middle] < x tip tc tm x trong dy con mi vi left = middle + 1 Bc 3: Nu left right dy cn phn t tip tc quay li bc 2 tm kim tip Ngc li Dy hin hnh ht phn t v dng thut ton

c. Ci t
int BinarySearch(int a[ ], int n, int x) { int left=0, right=n-1; int middle; do { middle=(left+right)/2; if (x==a[middle]) break; else if (x<a[middle]) right=middle-1; else left=middle+1; } while (left<=right); if (left<=right) return middle; else return 1; //ko tm thy phn t x }

d. phc tp thut gii l:


Trng hp
Tt nht

S ln so snh
1

Gii thch
phn t gia ca mng vi phn t x Phn t cn tm nm cui mng hoc khng tm thy Xc xut cc phn t trong a nhn gi tr x l nh nhau

Xu nht Trung bnh

log2n

log2(n/2)

=> phc tp ca thut ton l O(log2n)

e. V d minh ha
Cho dy s a:

a=2 3 4 5 6 7 8 tm xem phn t x = 8 c trong dy khng?

x=8

left = 0; right = 6 => middle = 3 2 3 4 5 6


x=8

left = 4; right = 6 => middle = 5 2 3 4 5 6

8
x=8

left = 6; right = 6 => middle = 6 2 3 4 5 6 7

tm thy phn t x trong dy

CHNG III CC THUT TON SP XP NI

CHNG III CC THUT TON SP XP NI


sp xp chn trc tip Selection Sort

sp xp chn trc tip Insertion Sort


sp xp ni bt Bubble Sort sp xp phn hoch Quick Sort sp xp vi s bc gim dn Shell Sort sp xp vun ng Heap Sort

I. Pht biu bi ton


Cho tp n i tng (phn t).

Hy sp xp n i tng trn theo th t tng (gim)

II. T chc d liu


int n S phn t cn sp xp

int A[n] Lu tr tp hp n phn t

III. Sp xp chn trc tip


1. tng Chn phn t nh nht trong n phn t u, a phn t ny v v tr u ca dy. Tip tc qu trnh vi n-1 phn t cn li v bt u t v tr th 2, lp li qu trnh trn cho dy gm n-1 phn t cn li. Thut ton thc hin n-1 ln ln lt a phn t nh nht trong dy hin hnh v v tr dn u

2. Thut ton
u vo:

n s phn t mng a mng cha cc phn t bt k u ra: a- mng c sp xp tng dn Bc 1: i = 0 Bc 2: tm phn t a[min] nh nht trong dy hin hnh t a[i] n a[n-1] Bc 3: Hon v a[i] vi a[min] Bc 4: nu i<n-1 th i = i+1 v lp li bc 2 ngc li th n-1 phn t c sp xp => Dng thut ton

3. Ci t
void SelectionSort(int a[ ], int n) { int vtmin, i, j, tg; for(i=0;i<n-1;i++) { vtmin=i; for(j=i+1; j<n; j++) if (a[j]<a[vtmin]) vtmin=j; if(vtmin!=i) //Hon i phn t a[vtmin] vi a[i] { tg=a[vtmin]; a[vtmin]=a[i]; a[i]=tg; } } }

4. nh gi thut ton
Trng hp Tt nht Xu nht Trung bnh S ln so snh n(n-1)/2 n(n-1)/2 n(n-1)/2 S ln hon v 0 n(n-1)/2 n(n-1)/4

phc tp ca thut ton l O(n2)

5. V d minh ha
Cho dy s a:

a = 12 2 8 5 1 6 4 15 Sp xp dy s tng dn. M t cc bc chy khi thc hin thut ton vi dy trn

i=0 => j = 1 7 v vtmin = 4 => Hon i a[0] v a[4]

i=1 => j = 2 7 v vtmin = 1 => Khng hon i

i=2 => j = 3 7 v vtmin = 6 => Hon i a[2] & a[6]

i=3 => j = 4 7 v vtmin = 3 => Ko hon i

i=4 => j = 5 7 v vtmin = 5 => Hon i a[4] & a[5]

i=5 => j = 6 7 v vtmin = 6 => Hon i a[5] & a[6]

i=6 => j = 7 7 v vtmin = 6 => Khng hon i

=> dng thut ton Vy dy sp xp l

a=1

12

15

IV. Sp xp chn trc tip


1. tng

Gi s c dy a0, a1,,ai-1 c sp xp. tng ca thut ton l chn thm phn t mi ai vo v tr thch hp ca on a1ai-1 sao cho c dy mi a1ai c sp xp
Nguyn tc sp xp nh sau: on gm phn t a0 c sp xp, thm a1 vo c a0,a1 c sp xp, tip tc thm a2 vo c a0, a1, a2 sp xptip tc thm an vo c a0,a1,,an sp xp.

2.Thut ton
u vo: n s phn t mng u ra:

a mng cha cc phn t bt k a- mng c sp xp tng dn

Bc 1: i=1 //gi s a[0] c sp xp Bc 2: tm v tr pos thch hp trong on t a[0] n a[i-1] chn a[i] vo Bc 3: i ch cc phn t t a[pos] n a[i-1] sang phi mt v tr c v tr chn a[i] vo Bc 4: chn a[i] vo v tr pos tm c bng cch gn a[pos]=a[i] Bc 5: i=i+1 Nu i<n => lp li bc 2 Ngc li => Dng thut ton

void InsertionSort(int a[ ], int n) { int pos,i,x; for(i=1;i<n;i++) { x=a[i]; pos=i-1; while((pos>=0)&&(a[pos]>x)) //tm v tr chn a[i] { a[pos+1]=a[pos]; pos--; } a[pos+1]=x; //chn x vo dy } }

3. Ci t

4. nh gi thut ton
Trng hp
Tt nht Xu nht

S ln so snh

S ln hon v

n-1 n2 + n 2

2(n-1) n2 + n 4 2 n2 +9n 10 4

-1

Trung bnh

n2 + n - 2 4

=> phc tp ca thut ton l O(n2)

5. V d minh ha
Cho dy s a:

a = 12 2 8 5 1 6 4 15 Sp xp dy tng dn M t cc bc chy khi thc hin thut ton vi dy trn

i=1 => Cn chn phn t a[1] vo dy a[0] => pos=-1


Vi tri so pos=pos+1

i=2 => Cn chn phn t a[2] vo dy a[0],a[1] => pos=1

i=3 => Cn chn phn t a[3] vo dy a[0],a[1],a[2] => pos = 1

i=4 => Cn chn phn t a[4] vo dy a[0],a[1],a[2],a[3]


=> pos = 0

i=5 => Cn chn phn t a[5] vo dy a[0],a[1],a[2],a[3],a[4] => pos = 3

i=6 => Cn chn phn t a[6] vo dy a[0],a[1],a[2],a[3],a[4],a[5] => vi tri 2

i=7 => Cn chn phn t a[7] vo dy


a[0],a[1],a[2],a[3],a[4],a[5],a[6] => pos = 7

=> dng Vy dy sp xp l a=1 2 4 5 6 8 12 15

V. Sp xp ni bt
1. tng

Xut pht t u dy hay cui dy v tin hnh i ch cp phn t k cn nhau a phn t nh hn hoc ln hn v v tr cao nht hay thp nht trong dy. Sau khi chuyn v tr ny khng xt na => Lp li qu trnh ny khi dy ko cn phn t no na

2. Thut ton
Bc 1: i = 0 Bc 2: j = n-1 //duyt t cui n pt th i Trong khi j>i thc hin nu a[j] < a[j-1] th hon i hai phn t j=j-1 Bc 3: i=i+1 Nu i>=n-1 => Ht dy v dng thut ton Ngc li lp li bc 2

3. Ci t
void BubbleSort(int a[ ], int n) { int i,j,tg; for(i=0;i<n-1;i++) for(j=n-1;j>i;j--) if ( a[ j ] < a[ j-1] ) { tg = a[ j ]; a[ j ] = a[ j-1]; a[ j-1 ] = tg; }

4. nh gi thut ton
Trng hp S ln so snh n(n-1) S ln hon v

Tt nht Xu nht

0
n(n-1) 2

2
n(n-1) 2

=> phc tp ca thut ton l O(n2)

5. V d minh ha
Cho dy s a:

a=2 12 8 5 15 Sp xp dy tng dn

2 i=0

12 j=6

i=0

j=4

i=0

j=3

i=0

j=2

i=0

j=1

i=1

j=5

i=1

j=4

i=1

j=3

i=2

j=5

i=2

j=4

i=3

j=6

i=3

j=5

i=4

j=6

i=5

VI. Sp xp vi di bc gim dn
1. tng
2. Gii thut 3. Ci t

4. V d
5. Nhn xt

VI. Sp xp vi di bc gim dn
1. tng: Da trn tng sp xp theo PP

chn

Phn chia dy ban u thnh nhng dy con cc phn t cch nhau h v tr Dy ban u : a1 a2 an c xem nh s xen k cc dy con sau :

Dy con th nht : a1 ah+1 a2h+1 Dy con th hai : a2 ah+2 a2h+2 . Dy con th h : ah a2h a3h

VI. Sp xp vi di bc gim dn
2. Gii thut:

Bc 1 : Chn k khong cch h[1], h[2],,h[k] v i=1. Bc 2 : Phn chia dy ban u thnh cc dy con cch nhau h[i] khong cch. Sp xp tng dy con bng phng php chn trc tip. Bc 3 : i=i+1; Nu i>k : dng. Nu i<=k : lp li bc 2.

VI. Sp xp vi di bc gim dn
3. Ci t: Gi s chn c dy di h[1], h[2],,h[k], void ShellSort (int a[], int N, int h[], int k) { int step,i,j; int x,len; for (step=0;step<k, step++) { len=h[step]; for (i=len;i<N; i++) { x=a[i]; j=i-len; while (x<a[j])&&(j>-1) { a[j+len]=a[j]; j=j-len; } a[j+len]=x; } } }

4. V d minh ha
Cho dy s a:

1 8 3 2 7 6 5 Cng vic sp xp dy trn bng thut ton shell sort vi di bc l 5, 3, 1 c tin hnh nh sau:

5. Nhn xt
Hiu qu ca thut ton con ph thuc vo

dy cc di c chn. Trong trng hp chn dy di theo cng thc hi = ( hi-1 -1)/2 v hk =1, k= log2n -1 Th gii thut c phc tp n1,2 << n2.

VII. Sp xp da trn phn hoch Quick Sort


1. tng

2. Gii thut
3. Ci t 4. V d 5. Nhn xt

1. tng
Phn hoch dy a1 a2 an thnh 3 thnh phn :

- Dy con 1 : Gm cc phn t a1 ai c gi tr khng ln hn x.(<x) - Dy con 2 : Gm cc phn t aj an c gi tr khng nh hn x.(>x) -day con thu 3: ai,..aj=x Vi x l gi tr ca mt phn t tu trong dy ban u. Sau khi phn hoch, dy ban u c chia lm 3 phn : ak < x, vI k=1..i ak = x, vI k=i..j ak > x, vI k=j..N

2. Gii thut
Gii thut sp xp mt dy alar

Bc 1 : Phn hoch dy alar thnh cc

dy con :

Dy con 1 : alaj < x Dy con 2 : aj+1ai-1 = x Dy con 3 : aiar > x

Bc 2 :

Nu (l<j) Phn hoch dy alaj Nu (i<r) Phn hoch dy aiar

2. Gii thut
Gii thut phn hoch mt dy alar thnh 2

dy con: Bc 1 : Chn tu a[k] lm gi tr mc l<=k<=r X = a[k]; i=l, j=r Bc 2 : Pht hin v hiu chnh cp phn t a[i], a[j] nm sai ch: Bc 2a : Trong khi a[i] <x i++; Bc 2b : Trong khi a[j]>x j--; Bc 2c : Nu i<j Hon v (a[i],a[j]) Bc 3 : Nu i<j : Lp li bc 2. Nu i>=j : dng.

3. Ci t

4. V d

void QuickSort (int a[], int l, int r) Cho dy s a: { int i,j,x; 4 9 3 7 5 3 8 x=a[(l+r)/2]; i=l; j=r; j i ji i j do 4 9 3 7 5 3 8 { while (a[i]<x) i++; while (a[j]>x) j--; x r if (i<=j) l { HoanVi(a[i],a[j]); on l = 0, r =3, x = a[1] = 3 i++; 4 3 3 5 j--; on l = 4, r =6, x = a[5] = 9 } } while (i<j); 7 9 8 if (l<j) QuickSort(a,l,j); Kt qu if (i<r) QuickSort(a,i,r); 3 3 4 5 7 8 9 }

5. Nhn xt
Hiu qu ca gii thut Quick Sort ph thuc

vo vic chn gi tr mc.


Trng hp Trung bnh phc tp n*log(n)

Xu nht

n2

VIII. Heap Sort


1. nh ngha cu trc d liu Heap

2. Gii thut
3. Ci t 4. V d 5. Nhn xt

1. nh ngha cu trc d liu Heap


Gi s sp xp gim dn, khi Heap c nh

ngha l mt dy cc phn t a1, a2, ..., an tha cc quan h : ai <= a2i. ai <= a2i+1 {(ai, a2i), (ai, a2i+1) l cc cp phn t lin i} V c cc tnh cht sau : Tnh cht 1: Phn t a1 (u Heap) lun l phn t nh nht trong Heap Tnh cht 2: Ct b mt s phn t v pha phi ca Heap th dy con cn li vn l mt Heap.

V d Heap:
A[7]=(2,3,5,6,4,1,7) A[7]=(1,3,2,6,4,5,7)

Khng l Heap

L Heap

2. Gii thut HeapSort


Gii thut Heapsort tri qua 2 giai on: Giai on 1:Hiu chnh dy s ban u thnh heap; Giai on 2:Sp xp dy s da trn heap:

Bc 1: a phn t nh nht v v tr ng cui dy. Hon v(a1,aN); Bc 2:Loi b phn t nh nht ra khi dy: N = N-1; Hiu chnh phn cn li ca dy t a1, a2,, an thnh mt heap. Bc 3: Nu N > 1 (heap cn phn t ): lp li bc 1. Ngc li: Dng

V d: A[7]=(2,3,5,6,4,1,7)
Giai on 1:Hiu chnh dy s ban u thnh heap;

A[7]=(1,3,2,6,4,5,7)
3 6 4

1 2 5 7

Giai on 2:Sp xp dy s da trn heap:


7 3 2 3 3

2
2 5

4 5

Bc 1:Hon v A[1] v A[N] A[7]=(7,3,2,6,4,5,1)

Bc 2:Loi b A[N], hiu chnh li Heap A[7]=(2,3,5,6,4,7,1); N=6

V d: A[7]=(2,3,5,6,4,1,7)
Bc 3: N=6 > 1 (heap cn phn t ): lp li bc 1. 2 7

Bc 1:Hon v A[1] v A[N]


A[7]=(7,3,5,6,4,2,1); N=6 3 4 6 7 A[7]=(7,4,5,6,3,2,1); N=5 5

Bc 2:Loi b A[N], hiu chnh li Heap

A[7]=(3,4,5,6,7,2,1); N=5 Bc 3: N=6 > 1 (heap cn phn t ): lp li bc 1.


7 4 6 5

Bc 1:Hon v A[1] v A[N]

Bc 2:Loi b A[N], hiu chnh li Heap A[7]=(4,6,5,7,3,2,1); N=4

V d: A[7]=(2,3,5,6,4,1,7)
Bc 3: N=4 > 1 (heap cn phn t ): lp li bc 1. 4 6 7 5 6 5 7

Bc 1:Hon v A[1] v A[N]


A[7]=(7,6,5,4,3,2,1); N=4

Bc 2:Loi b A[N], hiu chnh li Heap

A[7]=(5,6,7,4,3,2,1); N=3 Bc 3: N=3 > 1 (heap cn phn t ): lp li bc 1.


5 7 7 6

Bc 1:Hon v A[1] v A[N]


A[7]=(7,6,5,4,3,2,1); N=3

Bc 2:Loi b A[N], hiu chnh li Heap A[7]=(6,7,5,4,3,2,1); N=2

V d: A[7]=(2,3,5,6,4,1,7)
Bc 3: N=2 > 1 (heap cn phn t ): lp li bc 1. 6 7 7

Bc 1:Hon v A[1] v A[N]


A[7]=(7,6,5,4,3,2,1); N=4 Bc 3: N=1Kt thc.

Bc 2:Loi b A[N], hiu chnh li Heap A[7]=(7,6,5,4,3,2,1); N=1

A[7]=(7,6,5,4,3,2,1)

3. Ci t
Hiu chnh dy a1,..., aN thnh heap:

Sp xp dy a1,,aN bng Heap


Th tc h tr:

Th tc hiu chnh dy al,.., ar thnh heap:

Th tc h tr
void Shift(int a [ ],int l, int r) { int x, i, j, cont; i = l; j = 2*i+1; cont = 1; //(ai,aj),(ai,aj+1)l cc phn t lin i x = a[i ]; while ((j<=r) and (cont)) { if (j <r) //nu c 2 phn t lin i if (a[j]>a[j+1) //xc nh phn t lin i nh nht a[j] j=j+1; //tha quan h lin i ,dng hiu chnh if (a[j]>x) cont = 0; else { honv(a[i],a[j]); i = j; //xt tip kh nng hiu chnh lan truyn j=2*i+1; } } }

Hiu chnh dy ban u a1,..., aN thnh heap:


void CreateHeap(float a[ ],int N) { int i; i = N/2; while (i > 0) { i--; Shift(a,i,N-1); }

Sp xp dy a1,,aN bng Heap


void Heapsort(float a[ ],int N) { int r; r = N-1; while (r > 0) { doicho(&a[0],&a[r]); r--; Shift(a,0,r); } }

4. V d
Chy chng trnh minh ho

5. Nhn xt
Vic nh gi gii thut Heapsort rt phc

tp. Nhng chng minh c trong trng hp xu nht phc tp gn bng nlog2n.

Chng V: Danh sch lin kt


Gii thiu II. Danh sch III. Ngn xp_Stack IV. Hng i_Queue
I.

I. Gii thiu
Cc i tng d liu khng thay i c kch

thc, cu trc trong qu trnh sng c gi l cc kiu d liu tnh. T chc kt hp d liu vi nhng kch thc linh ng hn, c th thay i kch thc, cu trc trong sut thi gian sng c gi l cu trc d liu ng.

Kiu con tr
Cho trc kiu T=<V,O>. Kiu con tr, k

hiu "TP", ch n cc phn t c kiu "T" c nh ngha : TP = <VP ,OP> Trong :

VP = {{ cc a ch c th lu tr nhng i tng c kiu T},NULL} (vi NULL l mt gi tr c bit tng trng cho mt gi tr khng bit hoc khng quan tm ). OP = {cc thao tc nh a ch ca mt i tng thuc kiu T khi bit con tr ch n i tng }.

Khai bo con tr p kiu DATA


DATA *p; DATA la int, float, struct, char,.. Cp pht b nh ng p lu a ch cha mt phn t kiu DATA: p = (DATA *) malloc(sizeof(DATA)); Gii phng b nh: free(p);

II. Danh sch


Cho T l mt kiu c nh ngha trc,

kiu danh sch TX gm cc phn t thuc kiu T c nh ngha l: TX = < VX , OX > Trong :

VX = { tp hp c th t gm mt s bin ng cc phn t kiu T }. OX = { to danh sch; tm 1 phn t trong danh sch; chn 1 phn t vo danh sch; hu 1 phn t khi danh sch; lit k danh sch, sp xp danh sch.}.

1. Danh sch n
1.1T chc danh sch n Mi phn t ca danh sch n l mt cu trc cha 2 thnh phn chnh: - Info: lu tr cc thng tin v bn thn phn t. - Next: lu tr a ch ca phn t k tip trong danh sch, hoc lu tr gi tr NULL nu l phn t cui danh sch. Ta c nh ngha tng qut : typedef struct NODE { Data Info; //Data l kiu c nh ngha struct NODE *Next;//Con tr ch n NODE }node;

Con tr Head s c dng lu tr a ch

phn t u ds, nn ta gi Head l u xu(ds). Ta c th khai bo : node *Head; Con tr Tail gi a ch phn t cui xu. Ta khai bo nh sau : node *Tail; Lc ny ta c xu n :
Head

Tail

1.2. Cc thao tc c bn trn danh sch n


a) Khai bo danh sch

b) To mt phn t cho danh sch


c) Chn mt phn t vo danh sch d) Tm mt phn t trong danh sch n e) Hu mt phn t khi danh sch

Duyt danh sch g) Sp xp danh sch


f)

a. Khai bo danh sch


typedef struct NODE { Data Info; struct NODE *Next; } tagnode; typedef tagnode *LIST; LIST Head, Tail; Hoac tagnode *Head,*Tail;

b. To mt phn t cho danh sch


node *Getnode(Data x) { node *p; p = (node*)malloc(sizeof(node)); if (p==NULL) { printf(" Khng b nh."); exit(1); } p->Info=x; p->Next=NULL; return p; }

c. Chn mt phn t vo danh sch


new_element = Getnode(x);

C 3 TH chn new_element vo xu Head


TH 1 : Chn vo u danh sch TH 2 : Chn vo cui danh sch TH 3: Chen vao giua

TH 1 : Chn vo u danh sch


Head Tail New_element

void InsertFirst(LIST &Head, LIST &Tail, node *new_element) { if (head==NULL) { head=new_element; Tail=Head; } else { new_element->Next=Head; Head=new_element; } }

Cch 2 : Chn vo cui danh sch


Head New_element

Tail

void InsertEnd(LIST &Head, LIST &Tail, node *new_element) { if (head==NULL) { Head=new_element; Tail=new_element; } else { Tail->Next=new_element; Tail=new_element; } }

Cch 3 : Chn vo danh sch sau mt phn t q

void InsertAfter(LIST &Head, LIST &Tail, node *q, node *new_element) { if (q!=NULL) { new_element->Next=q->Next; q->Next=new_element; if (q==Tail) Tail=new_element; } }

d. Tm mt phn t trong danh sch n


p dng thut ton tm kim tuyn tnh. S dng mt con tr ph tr p ln lt tr n cc phn t trong xu. Ci t node *Search(node *Head, DATA x) { node *p; p=Head; while (p->Info!=x)&&(p!=NULL) p=p->Next; return p; } Head

e. Hu mt phn t khi danh sch (Hu mt phn t sau phn t q )

void DeleteAfter(LIST &Head, LIST &Tail, node *q) { node *p; if (q!=NULL) { p=q->Next; if (p!=NULL) { if (p==Tail) Tail=q; q->Next=p->Next; free(p); } } }

Hu mt phn t c kho k
B1: p=Search(Head,k); // p l phn t c kho

k cn hu. B2: Nu (p!=NULL) B2.1: Nu p=Head

//p l u danh sch

B2.1.1: Head=p->Next; B2.1.2: free(p); B2.2.1: q=SearchPre(Head,p) //tm phn t q ng trc p trong xu. B2.2.2 DeleteAfter(Head, Tail, q);

B2.2: Ngc li: p khng l u danh sch

Tm mt phn t trc pt p
node *SearchPre(LIST &Head,node *p)

{
node *q; q=Head; while(q->next!=p) q=q->next; return q; }

f. Duyt danh sch


c thc hin khi x l cc phn t ca danh sch theo cng mt cch thc. Duyt danh sch (v x l tng phn t) thc hin nh sau : void ProcessList(LIST &Head) node *p; p=Head; //p ch vo u danh sch while (p!=NULL) //trong khi cha ht danh sch { ProcessNode(p); //x l c th tu yu cu ca bi ton (in ra , kim tra, tnh ton,...) p=p->Next; //i n phn t tip theo }

g. Sp xp danh sch
Phng n 1 :

Hon v ni dung cc phn t trong danh sch ( thao tc trn vng Info ). Phng n 2 : Thay i cc mi kin kt ( thao tc trn vng Next).

Phng n 1 : Hon v ni dung cc phn t trong danh sch ( thao tc trn vng Info ).
C th chn mt trong nhng thut ton sp xp bit

ci t . V d: Ci t thut ton sp xp Chn la trc tip trn xu:


void ListStraightSelection(LIST &Head) { node *min,*p,*q; p=Head; while (p->Next!=NULL) { q=p->Next; min=p; while (q!=NULL) { if (q->Info<min->Info) min=q; q=q->Next; } Hoanvi(min->Info,p->Info); p=p->Next; } }

Phng n 2 : Thay i cc mi lin kt ( thao tc trn vng Next).


To mt danh sch mi l danh sch c th

t t danh sch c ( ng thi hu danh sch c ).


B1: Khi to danh sch mi Result l rng; B2: Tm trong danh sch c Head phn t min l phn t nh nht; B3: Tch min khi danh sch Head; B4: Chn min vo cui danh sch Result; B5: Lp li bc 2 khi cha ht danh sch Head;

2. Danh sch vng


2.1 T chc danh sch vng Danh sch vng l mt danh sch n m phn t cui danh sch tr ti phn t u danh sch. biu din, ta c th s dng cc k thut biu din nh danh sch n.

2.2 Cc thao tc trn danh sch vng


a) Tm phn t trn danh sch vng
b) Thm phn t new_element vo bn phi

nt q

a. Tm phn t trn danh sch vng


Hm tr v con tr ch vo phn t tm c hoc

hm tr v NULL nu khng tm thy node* Search(node *Head, Data x) { node *p; p = Head; //i t u danh sch do { if (p->Info==x) return p; p=p->Next; } while (p!=Head); //trong khi cha ht danh sch return NULL; //khng tm thy x }

b. Thm phn t new_element vo bn phi nt q


void Insertright(node *&q, node *newelement) { if (q==NULL) { q=newelement; newelement->Next=q; } else { newelement->Next=q->Next; q->Next = newelement; } }

3. Danh sch kp
3.1. T chc lu tr Danh sch kp l danh sch m mi phn t trong danh sch c th kt ni vi 1 phn t ng trc v 1 phn t ng sau n. nh ngha: typedef struct NODE { Data Info; struct NODE *Pre; //Pre lin kt vi phn t ng struct NODE *Next; //Next lin kt vi phn t ng sau } node;

3.2. Cc thao tc trn danh sch kp


a. Khi to mt phn t cho danh sch kp

b. Thm phn t vo danh sch sau phn t q


c. Hu 1 phn t p ca danh sch kp

a. Khi to mt phn t cho danh sch kp


node* Getnode(Data x) { node *p; p=(node*)malloc(sizeof(node)); if (p==NULL) { puts("Khng b nh."); exit(1); } p->Info=x; p->Pre=NULL; p->Next=NULL; return p; }

b. Thm phn t vo danh sch sau phn t q

void InsertRight(node *&q, node *newelement) { if (q==NULL) q=newelement; else { newelement->Next=q->Next; if (q->Next!=NULL) q->Next->Pre=newelement; q->Next = newelement; newelement->Pre=q; } }

c. Hu 1 phn t p ca danh sch kp

void Delete_p (node *&Head, node *p) { if (p->Pre==NULL) Head=p->Next; else { if (p->Next==NULL) p->Pre->Next=NULL; else { p->pre->Next=p->Next; p->Next->Pre=p->Pre; } } free(p); }

III. Stack
1. nh ngha Stack l mt danh sch m 2 php thm v loi b u c thc hin trn mt u. Phn t no thm vo sau s b loi b trc, nn Stack cn c gi l danh sch LIFO (Last In First Our list) hoc Pushdown list.

1 2 3 4

3 2 1

stack

2. Biu din Stack dng mng


T chc d liu Ta nh ngha Stack S l mt cu trc gm mt mng item cc phn t v mt bin sp dng ch n ch s ca phn t trn cng. #define MAX 100 //nh ngha mt gi tr c nh typedef struct tagStack { Data item[MAX]; int sp; }Stack; Stack N;
a.

b. Cc thao tc trn stack


Khi to stack

Thm mt phn t mi vo stack

* Khi to stack
Khi khi to, stack l rng, v ch s ca cc phn t t 0 -> MAX -1 nn ta cho sp = -1. Ci t void Initialize(Stack &S) { S.sp = -1; }

* Thm mt phn t mi vo stack


B sung phn t cha ni

dung NewInfo vo Stack Thc hin: xy dng hm Push, hm tr v gi tr -1 nu Stack y v tr v gi tr ca v tr phn t mi thm vo.

Ci t
int push(Stack &S, Data NewInfo) { if (S.sp < (MAX 1)) //Ngn xp cha y { S.sp++; S.item[S.sp] = NewInfo; return S.sp; } return -1; //Ngn xp y }

* Ly mt phn t ra khi stack


Ly phn t u tin trong

Stack ra Thc hin: gim ch s con tr sp ca Stack i mt n v Xy dng hm Pop tr li gi tr -1 nu Stack rng hoc tr li gi tr 1 cng thng tin ca phn t trong Stack

Ci t :
int pop(Stack &S, Data &gt) { if (S.sp >= 0) //ngn xp khng rng { gt = S.item[S.sp];//ly phn t trn cng S.sp--; //gim ch s phn t trn cng return 1; } return -1; //ngn xp rng }

3. Biu din Stack bng danh sch lin kt n


T chc d liu

Cc thao tc trn Stack

a. T chc d liu
Stack l mt danh sch lin

kt c khai bo nh sau:
typedef struct ITEM { Data Info; struct ITEM *Next; }A; typedef A *Stack; Stack S;

b. Cc thao tc trn Stack


Khi to stack.

Thm mt phn t vo stack


Ly mt phn t ra khi Stack

* Khi to stack
Khi khi to, stack l rng, ta cho S = NULL.

Ci t

void Initialize(Stack &S) { S = NULL; }

* Thm mt phn t vo stack


Hm push a gi tr x vo trong Stack. Nu thnh cng hm tr v 1, ngc li tr v 0. int push( Stack &S,Data x) { item *p; p = (item*)malloc(sizeof(item)); if (p == NULL) //Khng b nh cp pht. return 0; pInfo = x; pNext = s; s = p; return 1; }

* Ly mt phn t ra khi Stack


Hm pop ly gi tr hin ti trong Stack t vo bin x v tr v ga tr 1 nu trong Stack c phn t, ngc li tr v gi tr 0. int pop(Stack &S, Data &x) { item *p; if (S == NULL) //Ngn xp rng return 0; x = SInfo; p = S; S = SNext; free(p); return 1; }

IV. Queue_Hng i
1. nh ngha

Hng i l mt danh sch m php thm

vo c thc hin u ny v loi b c thc hin u kia. Nh vy, phn t no vo trc s c loI b trc, phn t no vo sau s c loi b sau, nn hng i cn c gi l danh sch FIFO (First In First Out list).

2. Ci t hng i dng mng

a. T chc d liu
#define MAX 30 typedef struct tagQueue { Data item[MAX]; int head; }queue; queue Q;
0
...........

head
MAX -1

b. Khi to hng i
Khi khi to, hng i l rng, ta cho head bng -1. Ci t void Initialize(queue &Q) { Q.head = -1; }

c. Thm mt phn t NewItem vo hng i


Hm tr v -1 nu hng i y v tr v 1 nu thm vo c Ci t int Insert(queue &Q, Data NewItem) { int i; if (Q.head = =MAX -1) //hng b y return 1; Q.head++; //Doi cac phan tu len 1 don vi for (i = Q.head; i > 0; i--) Q.item[i] = Q.item[i-1]; //Them phan tu moi vao cuoi hang doi Q.item[0] = NewItem; return 1; }

d. Loi b mt phn t ca hng i


Loi b phn t u a vo x. Hm tr v -1 nu hng i rng v tr v 1 nu ngc li int Remove(queue &Q, Data &x) { if (Q.head = = -1) return 1; //Hng i rng x = Q.item[Q.head]; Q.head--; return 1; }

3. Hng i c t chc theo danh sch lin kt

a. T chc d liu
typedef struct ITEM { Data Info; struct ITEM *Next; }item; item *head, *tail;
head tail

b. Khi to hng i
Khi khi to, hng i l rng, ta cho head v tail c gi tr NULL. Ci t void Initialize(item &head, item &tail) { head = NULL; tail = NULL; }

c. Thm mt phn t NewItem vo hng i head, tail.


Hm tr v -1 nu khng b nh cho

phn t mi, ngc li hm tr v 1.

head

tail

tail

Ci t
int Insert(item &head, item &tail, Data NewInfo) { item *i; i = (item*)malloc(sizeof(item)); if (i == NULL) return 1; iInfo = NewInfo; if (tail == NULL) //hang doi chua co phan tu nao { iNext = NULL; tail = i; head = i; } else //Hang doi da co phan tu { tailNext = i; tail = i; i->Next=NULL; } return 1; }

d. Loi b mt phn t ca hng i .

Loi b phn t trong hng i head, tail v a vo x. Hm tr v -1 nu hng i rng, ngc li hm tr v 1.

int remove(item *&head, item *&tail, Data &x) { item* i; if (head == NULL) return 1; x = headInfo;//Luu lai dia chi phan tu da lay de xoa di i = head; //Di chuyen contro head ve phan tu ngay phia sau head = iNext; free(i); //Huy phan tu da lay ra return 1; }
head head tail

CHNG V

CY_TREE

I. Cy
1. nh ngha Cy l mt tp hp T cc phn t (gi l nt ca cy) trong c mt nt c bit gi l gc, cc nt cn li c chia thnh nhng tp ri nhau T1, T2,, Tn theo quan h phn cp trong Ti cng l cy.

2. Mt s khi nim c bn
Bc ca mt nt : l s con ca nt . Bc ca mt cy : l bc ln nht ca cc nt

trong cy ( s cy con ti a ca mt nt trong cy ). Cy c bc n th gi l cy n-phn.


Nt l : l nt bc 0. Nt nhnh : l nt c bc khc 0 v khng phi

l gc.

2. Mt s khi nim c bn
Mc ca mt nt :

Mc (gc(T))=1.
Gi T1,T2,T3,.,Tn l cy con ca T0.

Mc

(T1)=Mc(T2)=Mc(T3)==Mc(Tn)=Mc(T0)+1
- di ng i t gc n nt x l s nhnh

cn i qua k t gc n x.
Rng cy: l tp hp nhiu cy trong th t

cc cy l quan trng.

II. Cy nh phn
1. nh ngha Cy nh phn l cy m mi nt c ti a 2 cy con. 2. Biu din cy nh phn Thng tin lu ti nt : Info. a ch nt gc ca cy con tri trong b nh : L. a ch nt gc ca cy con phi trong b nh : R.

typedef { DATA struct }NODE; typedef

struct

tagNODE

Info; tagNODE *Left,*Right; NODE *TREE;

III. Cy nh phn tm kim


1. nh ngha Cy nh phn tm kim (CNPTK) l cy nh phn trong ti mi nt, kho ca tt c cc nt thuc cy con tri u nh hn kho ca nt ang xt v nh hn kho ca tt c cc nt thuc cy con phi. 2. V d

2. Cc thao tc trn cy nh phn tm kim


Duyt cy

Duyt theo th t trc ( Node-Left-Right) Duyt theo th t gia ( Left-Node-Right) Duyt theo th t sau ( Left-Right-Node)

Tm mt phn t x trong cy
Thm mt phn t x vo cy Hu mt phn t c kho x

a. Duyt theo th t trc ( Node-Left-Right)


Kiu duyt ny trc tin thm nt gc sau thm cc nt ca cy con tri ri phi. Th tc duyt c th trnh by n gin nh sau: void NLR(TREE Root) { if (root!=NULL) { <X l Root>; // Xl tngng theo nhu cu NLR(RootLeft); NLR(RootRight); } }

b. Duyt theo th t gia ( Left-NodeRight)


Kiu duyt ny trc tin thm cc nt ca cy con tri sau tham nt gc ri n cy con phi. Th tc duyt c th trnh by n gin nh sau: void LNR(TREE Root) { if (root!=NULL) { LNR(RootLeft); <X l Root>;//X l tng ng theo nhu cu LNR(RootRight); } }

c. Duyt theo th t sau ( Left-RightNode)


Kiu duyt ny trc tin thm cc nt ca cy con

tri sau thm n cy con phi ri cui cng mithm nt gc. Th tc duyt c th trnh by n gin nh sau: void LRN(TREE Root) { if (root!=NULL) { LRN(RootLeft); LRN(RootRight); <X l Root>; //Xl tng ng theo nhu cu } }

d. Tm mt phn t x trong cy
tm mt phn t x trong cy ta ch n thun

duyt qua cc phn t cho n khi tm thy x. NODE *SearchTree(TREE Root, DATA x) { NODE *p=Root; while (p!=NULL) { if (x = =pInfo) return p; else if (x<pInfo) p=pLeft; else p=pRight; } return NULL; }

e. Thm mt phn t x vo cy
void AddTree(TREE &Root, DATA x) { if (Root!=NULL) { if (x==RootInfo) //Bo X b trng"; else if (x<RootInfo) AddTree(RootLeft,x); else AddTRee(RootRight,x); } else { Root = (NODE*)malloc(sizeof(NODE)); RootInfo = x; RootLeft = NULL; RootRight = NULL; } }

f. Hu mt phn t c kho x
Bc 1 : Tm phn t p c kho x.

Bc 2 : C 3 trng hp :
p l nt l : hu p. p c 1 con : to lin kt t phn t cha ca p n con ca p

ri hu p.
p c 2 con : tm phn t th mng cho p theo nguyn tc: "Phn t th mng phi nht ca cy con tri ca p (phn

t ln nht trong cc phn t nh hn p)" hay :


"Phn t th mng tri nht ca cy con phi ca p (phn

t nh nht trong cc phn t ln hn p)."


Sau chp thng tin ca phn t th mng vo p v hu

phn t th mng (do phn t th mng c ti a mt con).

Ci t
void DelNode(TREE &Root, DATA x) { NODE *q; If (Root==NULL) Bo cy rng; else { if (x<RootInfo) DelNode(RootLeft,x); else if (x>RootInfo) DelNode(RootRight,x); else { q=Root; if (qRight==NULL) Root=qLeft; else if (qLeft==NULL) Root-qRight; else SearchStandFor(RootLeft,q); free(q); } }

IV. Cy cn bng
nh ngha Cy nh phn tm kim cn bng l cy m ti mi nt ca n cao ca cy con tri v ca cy con phi chnh lch khng qu mt.

THE END.

V d: A[7]=(2,3,5,6,4,1,7)// slile 21
Bc 3: N=6 > 1 (heap cn phn t ): lp li bc 1. 2 7 3 7

3 3

7 4 3

6 6

4 4

7 2

4 7

Bc 1:Hon v A[1] v A[N]


A[7]=(7,3,5,6,4,2,1); N=6

Bc 2:Loi b A[N], hiu chnh li Heap

A[7]=(3,4,5,6,7,2,1); N=5 Bc 3: N=6 > 1 (heap cn phn t ): lp li bc 1.


7
4 6 3 A[7]=(7,4,5,6,3,2,1); N=5 5 6 7 7 6 4 4 7 5

Bc 1:Hon v A[1] v A[N]

Bc 2:Loi b A[N], hiu chnh li Heap A[7]=(4,6,5,7,3,2,1); N=4

You might also like