You are on page 1of 124

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

MC LC
MC LC..........................................................................................................................1 ..............................................................................................................................................2 Li ni u..........................................................................................................................3 Chng 1.............................................................................................................................4 Mt s k thut phong cch lp trnh tt.........................................................................4 0.1 Cch t tn cho bin hm......................................................................................4 0.2 Phong cch vit m ngun......................................................................................6 0.3 Ti u s thc thi m ngun...................................................................................8 K thut quy.................................................................................................................16 1.1 K thut quy.....................................................................................................16 1.2 Xy dng mt chng trnh quy......................................................................20 1.3 Cc v d quy...................................................................................................21 1.4 Kh quy............................................................................................................27 1.4.1 Tm hiu c ch thc hin hm quy..........................................................27 1.4.2 Cc trng hp kh quy n gin.............................................................29 1.4.3 Kh quy dng stack..................................................................................31 Bi ton lin quan t hp..................................................................................................37 2.1 Phng php sinh..................................................................................................37 2.1.1 Bi ton sinh dy nh phn di n...............................................................37 2.1.2 Bi ton lit k tp con k phn t..................................................................39 2.1.3 Bi ton lit k cc hon v............................................................................42 2.2 Thut ton quay lui (Back Tracking)....................................................................45 2.2.1 Thut ton quay lui lit k dy nh phn n.....................................................47 2.2.2 Thut ton quay lui lit k tp con k phn t.................................................48 2.2.3 Thut ton quay lui lit k hon v n phn t................................................50 2.2.4 Bi ton sp xp qun Hu.............................................................................51 2.2.5 Bi ton m i tun........................................................................................57 Tm kim v Sp xp........................................................................................................63 1.1 Tm kim...............................................................................................................63 1.1.1 M t bi ton tm kim trong tin hc............................................................63 1.1.2 Tm kim tuyn tnh.......................................................................................64 1.1.3 Tm kim nh phn.........................................................................................65 1.1.4 Kt lun..........................................................................................................67 1.2 Bi ton sp xp....................................................................................................67 1.3 Mt s phng php sp xp c bn....................................................................67 1.3.1 Phng php chn.........................................................................................67 1.3.2 Phng php sp xp ni bt.........................................................................68 1.3.3 Phng php sp xp chn ...........................................................................68 1.3.4 Phng php i ch trc tip.......................................................................69 1.3.5 Phng php ShellSort..................................................................................76 1.3.6 Phng php phn on QuickSort ..............................................................79 1.3.7 Phng php c s RadixSort.......................................................................83 Stack - Queue....................................................................................................................87
1

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

2.1 Gii thiu Stack ngn xp..................................................................................87 2.1.1 Ci t Stack dng CTDL mng....................................................................88 2.1.2 Cc ng dng stack........................................................................................90 2.1.3 Cc v d minh ha........................................................................................91 2.2 Gii thiu Queue hng i...............................................................................106 2.2.1 Ci t Queue dng CTDL mng................................................................108 2.2.2 Cc ng dng Queue....................................................................................109 BI TP.........................................................................................................................117 TI LIU THAM KHO..............................................................................................124

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Li ni u
Hc phn k thut lp trnh 2 c thit k dnh cho sinh vin khoa cng ngh thng tin H K Thut Cng Ngh, l phn tip ni vi mn k thut lp trnh 1. Mc ch ca mn hc l b sung nhng k thut lp trnh quy, kh quy, cc bi ton trn tp hp, phng php sinh, k thut quay lui, tm kim v sp xp trn mng, ngn xp v hng iSong song vi phn l thuyt l cc v d minh ha c th, cho php sinh vin hiu r vn hn. Ngoi nhng k thut lp trnh, gio trnh cn cp ti phng din phong cch lp trnh trong chng 1. Vic sm lm quen vi phong cch lp trnh s h tr sinh vin hon thin k nng vit chng trnh. Bi ging c vit ln u tin nn s khng trnh khi nhng sai st. Knh mong s ng gp ca cc ging vin v sinh vin nhm hon thin phn bi ging ny trong ln ti bn sau. Tt c nhng kin ng gp iu c trn trng. Xin chn thnh cm n! Tc gi

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Chng 1 Mt s k thut phong cch lp trnh tt

Mt chng trnh ngun c xem l tt khng ch c nh gi thng qua thut gii ng v cu trc d liu thch hp. M cn ph thuc vo phong cch v k thut m ho (coding) ca ngi vit chng trnh. Nu mt ngi lp trnh vit mt chng trnh tuy thc hin ng yu cu t ra nhng m ngun qu ln xn v phong cch lp trnh cu th, th m ngun ny s gy kh khn cho chnh ngi lp trnh! i khi ngi mi lp trnh khng quan tm n vn ny do ban u ch lm vic vi chng trnh nh. Tuy nhin, vn pht sinh khi h phi lm vic vi d n ln v chng trnh lc ny khng cn n gin vi chc dng lnh na. Nu khng rn luyn mt phong cch v trang b mt s k thut lp trnh tt th ngi lp trnh i mt vi nhiu kh khn Trong chng u tin xin gii thiu mt s k thut v phong cch lp trnh c bn, t nhiu gip cho ngi hc vit chng trnh c tt hn.

0.1 Cch t tn cho bin hm


Thng thng ty theo ngn ng v mi trng lp trnh, ngi vit chng trnh thng chn cho mnh mt phong cch nht qun trong vic t tn cc nh danh. Mt s quy tc cn quan tm khi t tn nh sau: 1. Tn ca nh danh phi th hin c ngha: thng thng cc bin nguyn nh i, j, k dng lm bin lp; x, y dng lm bin lu ta Cn nhng bin lu tr d liu khc th nn t gi nh: bin m s ln dng count hay So_Luong, bin lu trng lng weight, chiu cao heightNu t qu ngn gn nh c cho bin m, hay w cho khi lng th sau ny khi nhn vo chng trnh s rt kh hiu! 2. Tn phi xc nh c kiu d liu lu tr: phong cch lp trnh tt l khi ngi c nhn vo mt bin no th xc nh ngay c kiu d liu m
4

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

bin lu tr. Gi s c bin m s ln th ta c th t iCount, trong i l kiu ca d liu, strContent l kiu chuiC nhiu c php quy c t tn bin, ngi lp trnh c th chn cho mnh mt quy c thch hp. C th tham kho mt s quy c trong phn 3 bn di. 3. Theo mt quy c c th: a. C php Hungary: hnh thc chung ca c php ny l thm tin t cha kiu d liu vo tn bin. Bng 1.1 bn di l mt s tin t quy c c nhiu lp trnh vin s dng. Cc cng ty phn mm thng c cc quy c v cch t tn bin cho i ng lp trnh vin. Tuy nhin a s cc quy c ny u da trn c php Hungary. Tin t b c str/s si i/n li f d ld sz if is of os S C w u m_ Kiu d liu boolean char C++ string short integer integer Minh ha bool bStop char cLetterGenre string strFirstName short siTables int iCars

int nCars long integer long liStars floating point float fPercent Double precision floating point double dMiles long double precision floating long double ldPI point Null terminated string Input file stream Input stream Output file stream Output stream Struct Class Word Unsigned.. bin thnh vin ca hm char szName[NAME_LEN] ifstream ifNameFile istream isInput ofstream ofNameFile ostream osOut struct sPoint {} class CStudent {} word wChar class CStudent { private: string m_strName; } string g_strBuff LPCTSTR lpszClassName
5

g_ lp

bin ton cc long pointer

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

handle trong windows

HINSTANCE hInstance

Bng 1.1: Minh ha tin t ca c php Hungary. i vi nhng hng th tt c cc k t u vit hoa
#define const int MAXSIZE 100 MAXLENGTH 200

Cch t tn cho hm: hm bt u vi k t u tin l k t hoa v khng c tin t. Tuy nhin, iu ny cng khng bt buc tu theo ngn ng lp trnh. Ni chung l hm c chc nng thc hin mt chc nng no , cho nn chng thng bt u bng ng t: get, set, do
CString String GetName(); setName(); // Microsoft VC++ standard // Sun Java standard

0.2 Phong cch vit m ngun


S dng tab canh l chng trnh: khi son tho m ngun nn dng tab vi kch thc l 4 hay 8 canh l. Thi quen ny gip cho chng trnh c r rng v d qun l.
for (i = 0;i < N; i++) { if (Check(i)) { Action1(); Action2(); } else Action3(); ActionMain(); } for (i = 0; i < N; i++) { if (Check(i)) { Action1(); Action2(); } else Action3(); ActionMain(); }

S dng khong trng: chng trnh s d nhn hn.


int count; for (count = 0; count < 10; count++) { printf(%d, count * count + count); }

int count; for(count=0;count<10;count++) { printf(%d,count*count+count); }

Trnh vit nhiu lnh trn cng mt dng:


if (a > 5) {

if(a>5){b=a;a++;}

Gio trnh K thut lp trnh 2


b=a; a++; }

Khoa CNTT H KTCN

nh ngha cc hng s: mt thi quen l ngi lp trnh khng nh ngha nhng hng s thng xuyn s dng. Dn n nhng con s kh hiu xut hin trong chng trnh, mt s ti liu lp trnh gi nhng con s ny l magic mumber.
for(int i=0; i < 100; i ++) A[i] = Rand(100); k = InputNum(); j=0; while (A[j] != k && j < 100) j++; #define MAX_LEN 100 #define MAX_NUM 100 for(int i=0; i < MAX_LEN; i++) A[i] = Rand(MAX_NUM); k = InputNum(); j=0; while (A[j] != k && j < MAX_LEN) j++;

Trong on chng trnh bn tri rt kh phn bit gi tr 100 ba v tr c mi quan h g vi nhau. Tuy nhin, trong on bn phi ta d dng thy c ngha ca tng gi tr khi thay bng nh danh. Ngoi ra khi cn thay i gi tr ca MAX_LEN, MAX_NUM th ch cn thay mt ln trong phn nh ngha. Do on chng trnh B d nhn hn v d thay i hn! Vit ch thch cho chng trnh: bin, hm khi nh ngha nn vit ch thch ngha v chc nng r rng. i khi cc lnh thc thi cng cn c gii thch nu chng qu phc tp.
int CheckFactor(int n) { /* ngha: kim tra xem 1 s c phi l nguyn t hay khng Tham s vo: n s cn kim tra Tham s ra: gi tr tr v 0: khng phi s nguyn t 1: l s nguyn t */ .// phn thc hin ca hm }

V d ch thch cho bin


byte int Image; Rows, Cols; // buffer nh // s dng, s ct

Gio trnh K thut lp trnh 2


int int r, c; PixelCount; // dng ct hin hnh // tng s pixel

Khoa CNTT H KTCN

Tuy nhin khng phi bt c lnh no cng ch thch, vic ch thch trn lan ngay c vi cu lnh n gin cng khng c ngha g. i khi cn lm cho chng trnh kh nhn hn! Nn vit biu thc iu kin mang tnh t nhin: biu thc nn vit di dng khng nh, vic vit biu thc dng ph nh s lm kh hiu!
if ( !(iBlock < Block1 ) || !(iBlock >= Block2))

Mi biu thc trong iu kin c vit di dng ph nh, ta nn vit li di dng khng nh cho d hiu hn:
if ( (iBlock >= Block1 ) || (iBlock < Block2))

Dng chnh ngn ng tnh kch thc ca i tng : khng nn dng gi tr tng minh cho kch thc ca d liu. Khi cn ly kch thc ca bin int, ta c th dng sizeof(int) thay cho cc gi tr 2 hay 4. Tng t nh vy khi ly kch thc ca phn t trong mt mng int ta dng sizeof(array[0]) thay cho sizeof(int). Sau ny khi mng array c thay i kiu d liu th cch vit sizeof(array[0]) cng khng nh hng.

0.3 Ti u s thc thi m ngun


M ngun nu c vit tt s lm cho tc chng trnh ci thin ng k. C th ngy nay nng lc x l ca my tnh kh mnh, do ngi lp trnh khng quan tm n vic ti u m ngun. Nhng cng khng v th m b qua k thut ny. Vy th no l ti u m ngun? y khng cp n gii thut, v chc chn gii thut tt th s cho chng trnh ti u. Tuy nhin, vic ci t cng cn phi c k thut, nu khng th chnh kh nng ci t ca lp trnh vin lm hn ch s thc thi ca thut gii hay chng trnh. Mc ch ca vic ti u m ngun l nng cao tc x l v hn ch khng gian b nh m chng trnh chim dng. Thng thng c th mu thun gia tc v khng gian lu tr, do tu theo iu kin c th m ngi lp trnh c th la chn thch hp.
8

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Trong phn di xin trnh by mt s th thut chn lc c th gip ch hnh thnh nn phong cch lp trnh tt cho ngi c. Thu gn nhng biu thc dng nhiu ln: nu mt biu thc tnh ton c dng nhiu ln th chng ta nn tnh kt qu mt ln ri lu vo mt bin v dng li. V d:
F = sqrt(dx*dx+dy*dy) + (sqrt(dx*dx + dy*dy)*sqrt(dx*dx)-sqrt(dy*dy))

Trong dy biu thc trn c sqrt(dx*dx+dy*dy), dx*dx, dy*dy c dng nhiu ch, ta c th tnh trc bn ngoi v lu vo bin tm dng li sau ny. Hn ch vic tnh ton vi cng mt biu thc nhiu ln! a nhng biu thc khng ph thuc vng lp ra ngoi: trong mt s vng lp ta c s dng biu thc tnh ton nhng gi tr ca biu thc khng ph thuc vo s thay i ca vng lp th c th a biu thc ny ra ngoi. V d:
for(i =0; i < strlen(str); i++) . chuyn thnh: int n = strlen(str) for(i =0; i < n; i++) .

Thay th mt biu thc bng mt biu thc tng ng nhng li v thc thi : mt s chng trnh x l nh i hi tc cao, th ngi lp trnh c th thay th cc php nhn chia bng php dch chuyn bit. Thay th s dng ch mc trong mng C/C++ bng con tr V d: khi so snh khong cch ca hai im ta thng lm nh sau
if (sqrt(dx1*dx1+dy1*dy1) < sqrt(dx2*dx2+dy2*dy2))

Thay bng
if ((dx1*dx1+dy1*dy1) < (dx2*dx2+dy2*dy2))

... Dng s nguyn thay cho s thc: do vic x l s thc chm hn x l s nguyn nn ta c th dng s nguyn thay cho s thc c phn l nh.
9

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

V d: im trung bnh ca sinh vin l s thc ta c th thay bng s nguyn: DTB l 8.72 th lu theo s nguyn 872, khi xut ra th chia cho 100. Loi b vng lp: nu thn vng lp n gin v s ln lp cng khng nhiu, ta c th lm cho on chng trnh hiu qu hn bng cch b vng lp. V d:
for(i =0; i < 3; i++) A[i] = B[i] + C[i];

Thay bng
A[1] = B[1] + C[1]; A[2] = B[2] + C[2]; A[3] = B[3] + C[3];

on chng trnh thay th loi b vng lp, tc l lnh r nhnh, lnh r nhnh lm chm chng trnh do ngt lung thc thi. Nu vng lp di v cng dng biu thc ta c th ci tin nh v d sau
for(i=0; i < 3*n; i++) A[i] = B[i] + C[i];

Thay bng
for(i=0; i < 3*n; i+=3) { A[i] = B[i] + C[i]; A[i+1] = B[i+1] + C[i+1]; A[i+2] = B[i+2] + C[i+2]; }

V d trn ch p dng khi chiu di vng lp l bi s ca bc nhy! Loi b cu lnh r nhnh trong vng lp: xem v d sau
Chng trnh B if (w) then for i to 1000 do { x[i] = x[i] + y[i]; y[i] = 0; } else for i to 1000 do x[i] = x[i] + y[i];

Chng trnh A for i to 1000 do { x[i] = x[i] + y[i]; if (w) then y[i] = 0; }

10

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Trong chng trnh A, mi ln lp th phi kim tra thm iu kin ca w. Trong khi chng trnh B th ta kim tra gi tr ca w trc khi vo vng lp. Do B c hai vng lp nhng ch thc hin mt trong hai v ch kim tra gi tr w duy nht 1 ln! Thot khi vng lp sm nht: mt s trng hp khng cn phi lp ht ton b vng lp m t c mc ch th c th thot ra khi vng lp. V d: ch cn xc nh gi tr -99 c xut hin trong danh sch hay khng ta c hai chng trnh A v B minh ha nh sau:
Chng trnh A found = FALSE; for(i=0;i<10000;i++) { if( list[i] == -99 ) { found = TRUE; } } if( found ) printf("Yes, there is a -99."); Chng trnh B found = FALSE; for(i=0; i<10000; i++) { if( list[i] == -99 ) { found = TRUE; break; } } if( found ) printf("Yes, there is a -99.");

Chng trnh A khi tm thy th vn c lp cho n ht, trong khi B th s thot ngay. R rng khi tm thy th khng cn phi lp tip, khi B s ti u hn! Gom cc vng lp: cc vng lp cng s ln lp th nn gom li V d:
for( int i=0; i<n; i++) a[i]= 0; for(i=0; i<n i++) b[i]= 0;

Vit li:
for(i=0; i<n i++) a[i]= b[i]= 0;

S dng php shift thay cho nhn chia:


11

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

o Shift tri 1 bit: nhn 2 o Shift phi 1 bit: chia 2 V d: a *= 4 b /=8 a = 2*(b+c) a<<2 b>>3 a = (b+c)<<1

S dng php &: thay cho php chia d n, vi n l 2i {2, 4, 8, 16, 32} V d: m=n%2 m=n%8 m = n % 16 Ly byte thp: m = n % 256 m = n & 0xFF m=n&1 m=n&7 m = n & 15 m = n & 0x1 m = n & 0x7 m = n & 0xF

Ci tin tnh ton cho bin c:


if (x >y) flag =1; else flag =0;

Ci tin thnh:
flag = x>y;

Lu tm gi tr thng s dng: trong chng trnh i khi mt gi tr c tnh ton mt ln nhng li thng c s dng m t c thay i gi tr. Khi ta c th dng bin lu tr gi tr ca biu thc ny, khi no cn th c th s dng bin thay v phi tnh ton li. V d: on chng trnh gii phng trnh bc hai.
12

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

if ((b*b)-4*a*c < 0) printf(Phuong trinh vo nghiem!); else if ((b*b)-4*a*c == 0) printf(Phuong trinh co nghiem kep); else { x1= (-b + sqrt((b*b)-4*a*c))/(2*a); x2= (-b - sqrt((b*b)-4*a*c))/(2*a); } Trong on chng trnh trn delta c tnh li 4 ln, ta c th ci tin ch tnh duy nht mt ln! delta = (b*b)-4*a*c; if ( delta < 0) printf(Phuong trinh vo nghiem!); else if (delta == 0) printf(Phuong trinh co nghiem kep); else { x1= (-b + sqrt(delta))/(2*a); x2= (-b - sqrt(delta))/(2*a);

13

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

} Trnh lng ph b nh: bng cch s dng kiu d liu nh nht c th c lu tr: khng gian b nh hin ti c th khng cn eo hp nh trc, nhng khng v th m ngi lp trnh c th t do phung ph cp cho chng trnh. Vic s dng qu nhiu ti nguyn hn mc i hi ca chng trnh l thi quen xu m ngi lp trnh hay mc phi. Hn na tc chng trnh s nhanh hn khi s dng kiu d liu nh hn. Khai bo bin cc b trong phm vi gn nht: ng nh tn gi l bin cc b do khi s dng nn khai bo gn vi im s dng nht. Vic khai bo phm v rng hn ch lm lng ph v kh kim sot. S dng macro: mt s hm n gin v thng s dng c th chuyn thnh macro tng tc thc thi ca chng trnh. Do mi ln gi hm s tn chi ph cho vic gi v tr v t hm. V d:
int max(int a, int b) { return a>b? a: b; }

Chuyn thnh macro:


#define max(a, b) ((a)>(b)) ? (a) : (b)

Hm hon chuyn gi tr 2 s nguyn


void swap(int &a, int &b) { int t; t = a; a = b; b = t; }

Chuyn thnh macro swap


#define swap(a, b) {int t = a; a = b; b = t;}

14

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Gim s lng tham s truyn vo hm: vic s dng hm c qu nhiu tham s c truyn vo c th lm nh hng n ngn xp dnh cho vic gi hm. Nht l trng hp tham s l kiu d liu cu trc. S dng con tr hay tham chiu trong trng hp ny n gin ho. V d :
void Print(struct Student s) { printf(%d, s.StudentCode); }

Thay bng:
void Print(const struct Student *s) { printf(%d, s->StudentCode); }

15

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Chng 1
K thut quy

1.1 K thut quy


quy l mt thut ton dng n gin ha nhng bi ton phc tp bng cch phn nh php ton thnh nhiu phn ng dng. Qua vic gii nhng bi ton c phn nh ny, nhng li gii s c kt hp li gii quyt bi ton ln hn. Mt s cc v d quy nh ngha s t nhin o 0 l s t nhin o N l s t nhin n-1 l s t nhin nh ngha giai tha ca n o 0! l 1 o Nu n>0, n! = n *(n-1)! Hm quy : Hm quy l mt hm trong c dng li gi hm n chnh bn thn n. V d ta c hm quy nh sau:
int Sum(int n) { if (n==0) return 0; else return (n+Sum(n-1)); }

// gi quy n chnh bn thn hm sum

Khi mt hm quy gi n chnh n th mi ln gi my s to ra tp cc bin cc b mi hon ton c lp vi bin cc b to ra trong ln gi trc. Bao nhiu ln gi hm quy th tng ng vi by nhiu ln thot ra khi hm, mi ln ra khi hm th tp bin cc b b xa.

16

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

C mt s tng ng gia cc li gi hm v ln thot khi hm theo th t ngc li: ln ra khi hm u tin tng ng vi ln gi hm cui cng. V d minh ha hm quy: tnh giai tha ca n (tch ca cc s t 1 n n). Ta c nh ngha ca giai tha n nh sau: n! = 1.2.3...(n-1).n hoc nh ngha:
n! =

1 (n 1)!. n

n =0 n 1

Phng php th nht l dng vng lp:


long GT(int n) { long result = 1; for(int i=1; i <= n; i++) result *= i; return result; }

Phng php th hai l dng hm quy:


long Giaithua(int n) { if (n == 0) return 1; else return (n*Giaithua(n-1)); }

Phn tch chng trnh thc hin quy: Gi s chng trnh c li gi hm nh sau
long l = Giaithua(5);

17

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

long l = Giaithua(5) 120 Giaithua(5) n=5 return 5* Giaithua(4) Giaithua(4) n=4 return 4* Giaithua(3) 6 Giaithua(3) n=3 return 3* Giaithua(2) 2 Giaithua(2) n=2 return 2* Giaithua(1) 1 Giaithua(1) n=1 return 1* Giaithua(0) 1 Giaithua(0) n=0 return 1

24

Hnh 2.1: Gi quy ca hm giai tha. Lu : Hm quy dng nhiu vng nh trn ngn xp do c th dn n trn ngn xp. Do nu mt bi ton c th dng phng php lp (khng quy) gii quyt th nn s dng cch ny. Phn loi hm quy: quy trc tip: trong mt hm c li gi hm n chnh bn thn hm .
18

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

quy tuyn tnh: thn hm gi mt ln n chnh n: Un a, n =1 r + Un-1, n>1


double U(int n, double a, double r) { if (n == 1) return a ; return r + U(n-1, a, r) ; }

quy nh phn: thn hm c hai ln gi chnh n Un 1, n =1, 2 Un-2 + Un-1, n>2


long Fibo(int n) { if (n<2 ) return 1 ; return Fibo(n-1) + Fibo(n-1) ; }

quy phi tuyn: thn hm gi nhiu ln n n Un n, n < 6 Un-5 + Un-4 Un-3 + Un-2+ Un-1, n>=6
long U( int n) { if (n<6) return n; long S= 0; for (int i = 5; i>0; i--) S+= U(n-i); return S; }

quy h tng: hai hm quy gi nhau Un Gn n, n <5 Un-1 + Gn-2, n>=5 n-3, n <8 Un-1 + Gn-2, n>=8
long G(int n);

19

Gio trnh K thut lp trnh 2


long U( int n) { if (n<5) return n; return U(n-1) + G(n-2); } long G(int n) { if (n<8) return n-3; return U(n-1) + G(n-2); }

Khoa CNTT H KTCN

quy gin tip: trong mt hm c li gi hm n mt hm khc v bn trong hm ny li c li gi hm n hm ban u. V d nh hm F 1 gi hm F2 v bn trong hm F2 li c li gi hm n F1. y c gi l s quy gin tip. Thng thng nhng dng chng trnh quy gin tip th kh theo di v g ri, nn khi xy dng chng trnh loi ny phi ht sc cn thn.

1.2 Xy dng mt chng trnh quy


Phng php quy thng c p dng cho nhng bi ton ph thuc tham s v c cc c im sau: 1. Bi ton d dng gii quyt trong mt s trng hp ring ng vi cc gi tr c bit no ca tham s. Trng hp ny gi l suy bin. V d nh khi tnh giai tha th giai tha ca 0 l 1. 2. Trong trng hp tng qut, bi ton quy v cng mt dng nhng gi tr tham s c thay i. Sau mt s ln hu hn cc bc bin i quy th bi ton tr v trng hp suy bin. V d nh n! = (n-1)!. n, khi n gim v 0 th xy ra trng hp suy bin. Cc hm quy thng c dng tng qut nh sau:
if (Trng hp c bit, suy bin) { // gii theo cch suy bin, trng hp ny c li gii } else // trng hp tng qut.

20

Gio trnh K thut lp trnh 2


{ }

Khoa CNTT H KTCN

// gi quy vi gi tr tham s khc (thay i tham s)

V d 1: Tnh tng cc s nguyn t 1 n N.

i = N + i = N + ( N 1) + i
i =1 i i 1

N 1

N 2

Ta phn tch nh sau: + Trng hp c bit N=1 th kt qu l 1 + Trng hp khc ta thc hin quy: N + Tong(N-1). V d 2: tm USCLN ca hai s nguyn dng a, b. + Trng hp c bit khi a = b khi USCLN(a, b) = a + Trng hp chung a v b khc nhau ta c th thc hin quy nh sau: - USCLN(a, b) = USCLN(a-b, b) nu a>b - USCLN(a, b) = USCLN(a, b-a) nu a<b. Hm tm USCLN quy c vit nh sau:
int USCLN(int a, int b) { if (a==b) return a; else if (a>b) return USCLN(a-b, b); else return USCLN(a, b-a); }

V d 3: Tnh an. + Trng hp c bit n = 0, kt qu l 1 + Trng hp khc, kt qu l a * a(n-1).

1.3 Cc v d quy
Trong phn ny chng ta s tm hiu mt s chng trnh quy nh sau: Thp Hanoi (Tower of Hanoi): Cho 3 ct thp c t tn l C1, C2, v C3. C N a c ng knh gim dn v c sp nh hnh v. Hy dch chuyn N a sang ct C 2, theo nguyn tc sau: mi ln ch dch c mt a, khng c mt a c ng knh ln nm trn a c ng knh nh. Ta phn tch cch thc hin nh sau:
21

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Vi N = 2: ta c cch lm nh sau: chuyn a b nht sang C 3, chuyn a ln sang C2, chuyn a nh t C3 sang C2.
1 2 3 1 2 3 1 2 3 1 2 3

Hnh 2.2: Minh ha thp Hanoi vi n =2. Vi N = 3: ta thc hin vi gi thit bit cch lm vi N-1 a (2 a trong v d N=3): chuyn a 1 v 2 sang cc 3, chuyn a 3 sang cc 2, chuyn hai a 1, 2 t cc 3 sang cc 2.

22

Gio trnh K thut lp trnh 2


C2 C3

Khoa CNTT H KTCN

C1

B1 1, 2 qua cc 3

B2 3 qua cc 2
C2

B3 1, 2 qua cc 2

C1

C2

C3

C1

C3

C1

C2

C3

B1.1
C1 C2 C3 C1

B3.3
C2 C3

B1.2
C1 C2 C3 C1

B3.2
C2 C3

B1.3

B3.1

C1

C2

C3

C1

C2

C3

Hnh 2.3: Minh ha trng hp N = 3. Trong trng hp N = 3 nh hnh 2.3, thc hin ba bc a 3 a v cc 2: gm B1, B2 v B3. Vi B2 th n gin do chuyn 1 a, cn bc B1 v B3 phi di chuyn nhiu hn 1 a nn chng s bao gm nhiu bc nh trong . B1 gm {B1.1, B1.2, B1.3} v

23

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

B2 gm {B2.1, B2.2, B2.3}. Cui cng cch thc hin theo cc bc: B1.1 B1.2 B1.3 B2 B3.1 B3.1 B3.3.
C1 C2 C3

Hnh 2.4: Thp Hanoi vi n = 4. Chng ta nh ngha hm DichChuyen chuyn N a t cc ngun, sang cc ch thng qua mt cc trung gian (cc th 3 cn li). Hm ny nh ngha nh sau: DichChuyen(N, Nguon, Dich, Trung gian); Vi N = 2 ta din t li nh sau:
DichChuyen(1, C1, C3, C2) DichChuyen(1, C1, C2, C3) DichChuyen(1,C3, C2, C1)

Vi N = 3 ta din t nh sau: thng qua dch chuyn 2 a


DichChuyen(2, C1, C3, C2) DichChuyen(1, C1, C2, C3) DichChuyen(2,C3, C2, C1)

Vi N tng qut ta c
DichChuyen(N-1, C1, C3, C2) DichChuyen(1, C1, C2, C3) DichChuyen(N-1,C3, C2, C1)

Trng hp N =1 ta ch cn dch t cc ngun ti cc ch khng cn cc trung gian. on chng trnh C/C++ minh ha nh sau:
#include <stdio.h> void DichChuyen(int N, int C1, int C2, int C3); int main() { int N;

24

Gio trnh K thut lp trnh 2


printf(Nhap so dia: ); scanf(%d, &N); DichChuyen(N, 1, 2, 3); return 0; } void DichChuyen(int N, int C1, int C2, int C3) { if (N == 1) printf(%d - > %d, C1, C2); else { DichChuyen(N-1, C1, C3, C2); DichChuyen(1, C1, C2, C3); DichChuyen(N-1, C3, C2, C1); } }

Khoa CNTT H KTCN

Tm phn t ln nht trong mng dng quy: cho mng a[n], n > 1, hy tm phn t ln nht trong mng a[n]. Ta th phn tch nh sau: tng l i t phn ui v so snh vi phn t cui cng ca mng vi bin tm m, chn ra phn t ln nht lu li vo m. Bc tip theo thc hin tng t nhng lc ny mng rt ngn li cn n-1 phn t.

a1
n = n-1

a2

a3

an-1

an
m = Max(m, an)

a1

a2

a3

an
m = Max(m, an)

n =1

an
m = Max(m, an)
Hnh 2.5 : Tm phn t ln trong mng dng quy Hm quy tm phn t ln nht m t nh sau: gi s ch s mng tnh t 1.
25

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

DeQuyMax(int a[N], int n, int &max)// Ga s n > 0 if ( n ==1) {max = a[1] ; return;} if (max < a[n]) max = a[n]; DeQuyMax(a, n-1, max);

Tnh tng cc phn t trong mng dng quy: cho dy a[1:n], gi hm Sum l hm quy tnh tng, khi tng ca dy a[1:n] l Sum(a[1:n]) Sum(a[1:n]) = Sum(a[1:n-1]) + a[n] V Sum(a[m:m]) = a[m], trng hp m=1 th Sum(a[1:1]) = a[1]

a1

a2

a3
Sum(n) = an + Sum(n-1)

an-1

an

n = n-1

a1

a2

a3

an

Sum(n) = an + Sum(n-1)

n=1

an
Tr v Sum(n) = an = a1
Hnh 2.6: Tng cc phn t trong mng. Hm quy m t bng m gi nh sau: Sum(int a[], int n) if ( n == 1) Sum = a[1]; else Sum = Sum(a, n-1) + a[n];

26

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

1.4 Kh quy
1.4.1 Tm hiu c ch thc hin hm quy
Ti mi thi im ca hm quy c c trng bi: ni dung cc bin v cc lnh cn thc hin tip theo. Do ti mi thi im trong tin trnh x l ca hm quy cn phi lu tr c cc trng thi x l dang d. V d trong hm quy tnh giai tha n,
GT(n): if (n == 0) return 1; else return (n* GT(n-1));

Trong trng hp n = 3

GT(3) = 3 * GT(2)

GT(2) = 2 * GT(1)

GT(1) = 1 * GT(0)

GT(0) = 1 Hnh 2.7: Gi quy hm GT. Khi thc hin li gi GT(3) th s pht sinh li gi hm n GT(2) v ng thi phi lu gi thng tin trng thi x l cn dang d GT(3) = 3 * GT(2). n lt hm GT(2) s pht sinh li gi hm n GT(1) v lu gi thng tin trng thi cn dang d GT(2) = 2 * GT(1)Qu trnh c thc hin tng t cho ti khi gp trng hp suy bin GT(0) = 1.
27

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Kt thc qu trnh gi quy l qu trnh x l ngc c thc hin: Gi tr ca GT(0) c dng tnh GT(1) theo qu trnh lu tr Dng gi tr GT(1) tnh GT(2) theo qu trnh tng t Dng gi tr GT(2) tnh GT(3) ra kt qu cui cng Song song vi qu trnh x l ngc l xa b thng tin lu tr trong nhng ln gi hm tng ng. V d hm quy tnh gi tr dy Fibonacci
Fibo(n) if (n ==0) || (n == 1) return 1; else return (Fibo(n-1) + Fibo(n-2));

Fibo(4) = Fibo(2) + Fibo(3)

Fibo(2) = Fibo(1) + Fibo(0)

Fibo(3) = Fibo(2) + Fibo(1)

Fibo(1) = 1

Fibo(0) = 1

Fibo(2) = Fibo(1) + Fibo(0)

Fibo(1) = 1

Fibo(1) = 1

Fibo(0) = 1

Hnh 2.8: Hm quy tnh dy Fibonacci. Do c im ca qu trnh x l mt hm quy: vic thc thi li gi quy sinh ra li gi quy mi cho n khi gp trng hp suy bin, do cn phi c c ch lu tr thng tin tho yu cu: o mi ln gi phi lu tr thng tin trng thi con cn ang x l dang d, s trng thi ny bng vi s ln gi cha hon tt. o Sau khi thc hin xong mt ln gi th k, cn khi phc li ton b thng tin trng thi ca ln gi trc l ln gi k-1.
28

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

o Lnh gi cui cng (trng hp suy bin) s c hon tt trc tin. Cc lnh gi sau s hon thnh trc, do dy thng tin trng thi c hi phc theo th t ngc vi th t lu tr. Cu trc d liu ngn xp lu tr theo kiu Last In First Out tho cc yu cu trn nn c s dng lu tr thng tin trng thi ca qu trnh x l quy. Thng thng quy l phng php gip chng ta tm gii thut cho nhng bi ton kh. Kt qu ca gii thut quy thng rt gn gng, d hiu v d chuyn thnh cc chng trnh trn cc ngn ng lp trnh. Tuy nhin, vic x l gii thut quy cng gy kh khn cho my v khng gian lu tr v thi gian x l. V vy vic thay th mt chng trnh quy bng mt chng trnh khng quy cng c quan tm rt nhiu. Thng thng khi gp mt bi ton kh gii quyt theo hng khng quy th ngi ta thc hin qu trnh nh sau: o Dng quan nim quy tm gii thut cho bi ton o M ho gii thut quy o Kh quy c mt chng trnh khng quy. Qu trnh trn gi l kh quy, i khi vic kh quy cng khng d dng g, nn nhiu khi cng phi chp nhn chng trnh quy!

1.4.2 Cc trng hp kh quy n gin


o Hm tnh gi tr ca dy d liu m t bng hi quy: V d 1: hm tnh giai tha khng quy
long int GiaiThua( int n) { long int F =1; for (int k = 1; k <= n; k++) F = k*F; return (F); }

V d 2: hm tnh Sn khng quy


int Sn(int n) { int k = 1; int tg = 1; while ( k < n ) {

29

Gio trnh K thut lp trnh 2


k++; if ( k % 2 ) tg += 2*k -1; else tg -= 2*k + 1;

Khoa CNTT H KTCN

} }

o Dng quy ui Mt hm quy ui P c dng nh sau: P(X) { if B(X) else { A(X) P(f(X)) } } Trong : X: l bin (mt hay nhiu bin) P(X): l hm quy ph thuc X A(X) v D(X): l cc nhm lnh khng quy f(X): l hm bin i x trong ln gi th Pi nu B(fi(X)) khng ng th thc hin lnh X v gi Pi+1, ngc li B(fi(X)) ng th thc hin D(X) v kt thc qu trnh gi (Pi ko gi thm hm quy khc). V d: Tm USCLN ca hai s da vo thut ton Euclide Gii thut quy USCLN(m ,n) bng Euclide nh sau :
void USCLN( int m, int n, int & kq) { if ( n ==0) else USCLN(n, m %n, kq) ; } kq = m ;

D(X)

Trong trng hp ny:


30

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

X l m, n v kq P(X) : USCLN(m, n, kq) B(X) : n ==0 D(X) : kq = m ; A(X) : khng c f(x): USCLN(n, m %n, kq) Hm USCLN khng quy c th hin nh sau:
void USCLN(int m, int n, int & kq) { int temp; while (n !=0) { temp = m %n; m = n; n = temp; } kq = m; }

1.4.3 Kh quy dng stack


thc hin mt chng trnh con quy th h thng phi t chc vng nh lu tr theo quy tc LIFO. Cc ngn ng lp trnh cp cao u c kh nng to vng nh stack mi cho php t chc cc chng trnh quy. Thc hin mt chng trnh con quy theo cch mc nh thng tn b nh. Do cch t chc stack mc nh thch hp cho mi trng hp nn s khng ti u trong tng trng hp c th. Do s tt khi ngi lp trnh ch ng to cu trc d liu stack c dng cho tng chng trnh quy c th. Gi s th tc quy trc tip c cu trc nh sau : P(X) { if C(X) else A(X) ; P(f(X)) ; B(X) ;
31

D(X) ;

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

} Trong X : l mt hay nhiu bin C(X) : biu thc iu kin theo X A(X), B(X) v D(X) : nhm lnh khng quy f(X) : l hm ca X Qu trnh thc hin th tc P(X) nh sau: Nu C(X) ng th thc hin D(X) Ngc li thc hin A(X), gi P(f(X)), thc hin B(X) sau khi hon thnh P(f(X)). Mi ln P(Y) c gi th thng tin ca B(Y) li c sinh ra nhng cha thc hin. Gi s qu trnh quy kt thc sau k ln gi quy th chng trnh phi thc hin dy k thao tc B theo th t: B(fk-1(X)), B(fk-2(X)), ..., B(f(f(X))), B(f(X), B(X) thc hin dy thao tc B trn ta cn xy dng stack lu tr tm. Gii thut thc hin P(X) vi vic s dng stack c dng: P(X) { CreateStack(S) ; while ( ! C(X)) { A(X) ; Push(S, X) ; X = f(X) ; } D(X) ; while ( !Empty(S)) { Pop(S, X) ; B(X) ;
32

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

} } V d: th tc quy biu din s thp phn sang nh phn c dng:


void Binary(int m) { if (m >0) { Binary( m / 2); printf("%d", m % 2); } }

Trong : X l m P(X) l Binary(X) A(X) v D(X) khng c B(X) l lnh printf("%d", m % 2) ; C(X) l m 0 f(X) = f(m) = m / 2 ; Gii thut khng quy nh sau:
void Binary( int m) { int temp; CreateStack(S); while (m > 0) { temp = m % 2; Push(S, temp); m = m / 2; } while (! Empty(S)) { Pop(S, temp); printf(%d, temp); }

33

Gio trnh K thut lp trnh 2


}

Khoa CNTT H KTCN

Lnh gi quy vi hai ln gi trc tip: Th tc quy c dng nh sau: P(X) { if C(X) D(X) else { A(X); P(f(X)); B(X); P(g(X)); } } Qu trnh thc hin th tc quy P(X) nh sau: Nu C(X) ng th thc hin D(X). Nu C(X) sai th thc hin A(X), gi P(f(X)), thc hin B(X) v gi P(g(X)); khi ngoi vic lu gi tr fi(X) tng ng chng trnh cn phi lu thm cc gi tr gi(X) pht sinh tng ng Do ngoi d liu X, chng trnh cn phi lu vo ngn xp thm th t ln gi. Th tc kh quy dng stack trong trng hp ny c dng nh sau: P(X) { CreateStack(S); Push(S, (X, 1)); do { while ( !C(X)) {
34

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

A(X); Push(S, (X, 2)); X = f(X); }// end while D(X); Pop(S, (X, k)); if ( k != 1) { B(X); X = g(X); }// end if } while (k > 1); } V d: kh quy ca th tc thp Hanoi Dng th tc quy ca thp Hanoi nh sau:
Hanoi(n, a, b, c) { if (n>0) { Hanoi(n-1, a, c, b); Move(a, c); Hanoi(n-1, b, a, c); } }

Trong n l s a, a l ct u tin, b l ct trung gian, v c l ct cui cng, Move(x, y) l thao tc chuyn 1 a t ct x sang y. Trong trng hp ny: X l b (n, a, b, c); C(X) l (n 0) A(X) v D(X) l rng B(X) l B(n,a, b, c) = Move(a, c) f(X) l f(n, a, b, c) = Hanoi(n-1, a, c, b)
35

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

g(X) l g(n, a, b, c) = Hanoi(n-1, b, a, c) Gii thut khng quy tng ng nh sau:


Create_Stack(S) ; Push(S, (n, a, b, c, 1)); do { while (n > 0) { Push(S, (n, a, b, c, 2)); n = n-1; Swap(b, c); } Pop(S, (n, a, b, c, k)); if ( k != 1) { Move(a, c); n = n-1; Swap(a, b); } } while (k>1);

36

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Chng 2
Bi ton lin quan t hp

2.1 Phng php sinh


Phng php sinh c p dng gii quyt bi ton lit k ca l thuyt t hp. p dng c phng php ny th bi ton phi tho mn hai iu kin sau: o C th xc nh c th t trn tp cc cu hnh t hp cn lit k. T c th xc nh c cu hnh u tin v cu hnh cui cng trong th t . o Xy dng c mt thut ton cho php t mt cu hnh cha phi cu hnh cui, sinh ra c cu hnh k tip ca n. Phng php sinh c th c m t tng qut nh sau: <Xy dng cu hnh u tin> Do <a ra cu hnh ang c> <T cu hnh ang c sinh ra cu hnh k tip> While <Cn cu hnh or khc cu hnh cui>

2.1.1 Bi ton sinh dy nh phn di n


Bi ton: mt tp hp hu hn c n phn t c th c biu din tng ng vi tp cc s t nhin 1, 2, .., n. Bi ton t ra l: cho mt tp hp gm n phn t X = {X1, X2,.., Xn} hy lit k tt c cc tp con ca tp ny. biu din tp con Y ca X ta dng xu nh phn Bn = {B1, B2,.., Bn}, sao cho nu Bi = 0 th Xi Y, ngc li Bi = 1 th Xi Y. V d nh dy 0011 ca tp hp gm n th hin cho tp Y = {X3, X4} do phn t B3 v B4 c gi tr l 1. Khi ta quy v bi ton lit k tt c xu nh phn c kch thc n. S cc xu nh phn l 2n.

37

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Mt dy nh phn x di n l biu din mt s nguyn p(x) no trong on [0, 2n-1]. Do s cc dy nh phn di n = s cc s nguyn [0, 2n-1] = 2n. Mc tiu l lp mt chng trnh lit k cc dy nh phn n phn t theo th t t in, c ngha l lit k dy nh phn biu din cc s nguyn theo th t 0, 1,.., 2n-1. Khi n =3, cc di 3 c lit k nh sau: p(x) 0 1 2 3 4 5 6 7 x 000 001 010 011 100 101 110 111 Khi dy u tin l: 000 v dy cui cng l 111. Nhn thy rng nu x l dy ang c v phi l dy cui cng th dy tip theo cn lit k chnh l x cng thm 1 n v trong h nh phn! V d n = 6: Dy ang c: Cng thm 1: 010000 +1 ______ Dy mi: 010001 Dy mi: Dy ang c: Cng thm 1: ______ 011000 010111 +1

K thut sinh k tip t cu hnh hin ti c th m t nh sau: xt t cui dy ln t hng n v tm s 0 u tin. Nu tm thy th thay s 0 bng s 1 v t tt c phn t pha sau Nu khng tm thy th ton l dy cha 1, y l cu hnh cui v tr bng 0. cng. Chng trnh minh ha 1: chng trnh C/C++ lit k chui nh phn n bit.
int Stop; // bin ton cc void Next_BS(int B[MAX], int n) // Hm pht sinh chui k tip { int i = n; // duyt t cui while (i>0 && B[i]) // lp khi cha tm thy B[i] ==0 { B[i] = 0; // gn cc bit sau l 0 i--; // gim v trc } if (i==0 ) Stop = 1; // cu hnh cui nn khng tm c B[i] = 0 -> dng

38

Gio trnh K thut lp trnh 2


else B[i] = 1;

Khoa CNTT H KTCN

// gn 1 cho B[i]

} void Generate(int B[MAX], int n) // Hm sinh chui nh phn { Stop = 0; while (! Stop) { Result(B,n); // xut chui nh phn hin ti Next_BS(B,n); // chui nh phn tip theo. } } void Result(int B[MAX], int n) { static int count=0; printf(\n Xau nhi phan thu %d, ++count); for(int i=0; i < n;i++) printf(%3d, B[i]); } int main() { int i, B[MAX], n; printf(Nhap n: ); scanf(%d,&n); for(i=0; i< n; i++) B[i] =0; Generate(b, n); getch(); return 0; }

2.1.2 Bi ton lit k tp con k phn t


Pht biu: Cho tp hp X = {1, 2,.., n}. Hy lit k tt c tp con k phn t ca X. Mi tp con k phn t ca X cho th biu din nh b th t: a = (a1, a2,.., ak) tha mn 1 a1 a2 ... ak n. Trn tp con k phn t ca X, ta nh ngha th t ca cc tp con nh sau: Ta ni tp a = (a1, a2,.., ak) c th t trc tp a = (a1, a2,.., ak) theo th t t in v k hiu l a < a nu tm c j sao cho: a1 = a1, a2 = a2..., aj-1 = aj-1 v aj < aj. V d vi n = 5, k = 3, ta lit k 10 tp con ca n nh sau: {{1,2,3},{1,2,4}{1,2,5}{1,3,4}{1,3,5}{1,4,5}{2,3,4}{2,3,5}{2,4,5}{3,4,5}}
39

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

+ Ta thy cu hnh u tin l {1, 2..., k} + Cu hnh kt thc l {n-k+1, n-k+2,.., n}. Nhn xt: chng ta s in ra tp con vi cc phn t ca n theo th t tng dn. Biu din tp con l mt dy a{a1, a2,..., ak} trong a1< a2 <...<ak. Ta nhn thy gii hn trn ca ak l n, ca ak-1 l n-1, ca ak-2 l n-2. Tng qut gii hn trn ca ai = n-k+i. Cn gii hn di ca ca ai (gi tr nh nht ai c th nhn) l ai-1 + 1. Nh vy nu ta ang c mt dy x i din cho tp con, nu x l cu hnh kt thc th c ngha tt c cc phn t trong x u t ti gii hn trn th qu trnh sinh kt thc. Nu khng th phi pht sinh mt dy x tng dn tha mn ln hn dy x v khng c dy no chen vo gia hai dy theo th t t in. V d: n = 9, k = 6, cu hnh ang c <1, 2, 6, 7, 8, 9>, cc phn t a3 a6 t n gii hn nn ta khng th tng cc phn t ny c, ta phi tng a 2 t 2 ln thnh 3. c cu hnh mi l <1, 3, 6, 7, 8, 9> cu hnh ny tho mn ln hn cu hnh c, nhng cha tho mn tnh cht va ln do ta phi thay a3, a4, a5, a6 bng gii hn di ca n nh sau: a3 = a(3-1= 2) + 1 = 3 + 1 = 4 a4 = a(4-1= 3) + 1 = 4 + 1 = 5 a5 = a(5-1= 4) + 1 = 5 + 1 = 6 a6 = a(6-1= 5) + 1 = 6 + 1 = 7 Vy cu hnh tip theo <1, 3, 4, 5, 6, 7> l cu hnh cn tm. Do mun xc nh cu hnh tip ta thy a6 = 7 cha t n gii hn ta ch cn tng a6 ln mt l c cu hnh tip theo: <1, 3, 4, 5, 6, 8>. Vy k thut sinh tp con k tip t tp x c c th xy dng nh sau: Tm t cui ln u dy cho ti khi gp phn t ai cha t n gii hn n-k+i. Nu tm thy: o Tng ai ln 1. o t tt c phn t pha sau ai bng gii hn di. Nu khng tm thy tc l phn t t gii hn trn, y l cu hnh cui cng. Kt thc thut ton. Chng trnh minh ha 2: lit k tp con k phn t ca n.
40

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

int A[MAX], Stop, n ,k; void Next_SubSet() { int i,j; i = k; // duyt t cui dy // lp khi cha tm c phn t cha ti gii hn while (i >0 && A[i] == n-k+i) i--; // duyt v u if ( i > 0) { A[i] = A[i] +1; // tng mt n v // cho cc phn t cn li qua gii hn di for(j = i+1; j <= k; j++) A[j] = A[j-1]+ 1 } else Stop = 1; // kt thc pht sinh cu hnh } void GenerateSet() { Stop = 0; while (!Stop) { Result(); // xut cu hnh hin ti Next_SubSet(); // qua cu hnh khc } } void Result() { static int count=0; printf(Tap con thu %d, ++count); for(i=1; i <=k; i++) printf(%3d, A[i]); } int main() { printf(Nhap n: ); scanf(%d, &n); printf(Nhap k: ); scanf(%d, &k); for(int i=1; i <= n;i++) A[i] = i; GenerateSet(); getch(); return 0;

41

Gio trnh K thut lp trnh 2


}

Khoa CNTT H KTCN

2.1.3 Bi ton lit k cc hon v


Bi ton: Cho tp hp X = {1, 2, ..., n}, hy lit k tt c hon v ca X. Mi hon v n phn t ca tp X c th biu din bi b c th t gm n thnh phn a = {a 1, a2,.., an} tho ai X; i = 1, 2, .., n; ap aq nu p q. Trn cc tp hon v ca X ta nh ngha th t ca cc hon v nh sau: a = (a1, a2,..., an) c gi l c th t trc hon v a=(a1,a2,..,an). C k hiu a < a nu tm c ch s k sao cho. a1 = a1, a2 = a2,..., ak-1 = ak-1, ak <ak. V d X = {1, 2, 3, 4} khi th t hon v n = 4 c lit k nh sau: {{1, 2, 3, 4}, {1, 2, 4, 3}, {1, 3, 2, 4} {1, 3, 4, 2} {1, 4, 2, 3} {1, 4, 3, 2} {2, 1, 3, 4}, {2, 1, 4, 3}, {2, 3, 1, 4} {2, 3, 4, 1} {2, 4, 1, 3} {2, 4, 3, 1} {3, 1, 2, 4}, {3, 1, 4, 2}, {3, 2, 1, 4} {3, 2, 4, 1} {3, 4, 1, 2} {3, 4, 2, 1} {4, 1, 2, 3}, {4, 1, 3, 2}, {4, 2, 1, 3} {4, 2, 3, 1} {4, 3, 1, 2} {4, 3, 2, 1}} Hon v u tin l: {1, 2, ..., n-1, n} v hon v cui cng l {n, n-1,..,2, 1}. Khi hon v k tip sinh ra phi ln hn hon v hin ti, v hn na n phi ln hn hon v hin ti theo ngha khng c hon v no khc chen vo gia n khi sp theo th t t in. Gi s c hon v sau: <3, 2, 6, 5, 4, 1>, ta xt 4 phn t cui cng, do chng c sp theo th t gim dn. Khi ta hon v 4 gi tr ny th cng ch c hon v nh hn hon v hin ti. Nh vy ta phi xt n a2 = 2, ta phi thay gi tr ny, nhng thay gi tr no? ta khng th thay bng 1 v nu nh vy s c hon v nh hn, khng th thay bng 3 v gi tr ny c ri a1 = 3 (phn t sau khng c chn vo nhng gi tr xut hin phn t trc). Ch cn li gi tr 4, 5, 6. V cn mt hon v ln nn ta chn a2 = 4. Cn cc gi tr a3, a4, a5, a6 s ly trong tp {2, 6, 5, 1}. Cng do tnh cht va ln nn ta s tm biu din nh nht ca 4 s ny gn cho a3, a4, a5, a6, l <1, 2, 5, 6> vy ta c hon v mi l <3, 4, 1, 2, 5, 6> Nhn xt: on cui ca hon v hin ti c sp gim dn. s a5 l 4 l s nh nht trong on cui ln hn a2 = 2. Nu i ch a5 cho a2 th ta c a2 = 4 v on cui vn c xp gim dn l <6, 5, 2, 1> khi mun biu din nh nht cho cc gi tr trong on cui th ta ch cn o ngc on cui.
42

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

V d trong hon v hin ti <2, 1, 3, 4> c hon v k tip l <2, 1, 4, 3>. Ta c th xem <2, 1, 3, 4> c on cui gim dn l mt phn t <4>. Vy k thut sinh hon v k tip t hon v hin ti c th xy dng nh sau: Xc nh on cui gim dn di nht, tm phn t ai ng trc on cui . iu ny ng ngha vi vic tm t v tr st cui dy ln u, gp ch s i u tin tho mn ai < ai+1. Nu tm thy ch s i nh trn: trong on cui gim dn, tm phn t a k nh nht tho mn ak > ai. Do on cui gim dn nn thc hin bng cch t cui dy ln u gp ch s k u tin tho ak > ai. o o gi tr ak v ai. o Lt ngc th t on cui gim dn (ai+1 n ak) tr thnh tng dn Nu khng tm thy tc l dy gim dn, y l cu hnh cui cng. Chng trnh minh ha 3: Lit k hon v n phn t.
int n, P[MAX], Stop; void Next_Permutation() { int j, k; j = n -1; while (j>0 && P[j]> P[j+1]) j--; if (j == 0) Stop = 1; else { k = n; while (P[j] > P[k]) k--; Swap(P[j], P[k]); l = j+1; r = n; while (l < r) { Swap(P[l], P[r]); l++; r--; } }// end else } void Permutation()

43

Gio trnh K thut lp trnh 2


{ Stop = 0; while (! Stop) { Result(); Next_Permutation(); } } void Result() { static int count=0; printf(\n Hoan vi thu %d, ++count); for(int i=1; i <= n; i++) printf(%3d, P[i]); } int main() { printf(Nhap n: ); scanf(%d, &n); for(int i=1; i <= n; i++) P[i] = i; return 0; }

Khoa CNTT H KTCN

44

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

2.2 Thut ton quay lui (Back Tracking)


Thut ton quay lui dng gii quyt cc bi ton lit k cc cu hnh. Phng php sinh trong phn trc cng c gii quyt cho cc bi ton lit k khi nhn bit c cu hnh u tin ca bi ton. Tuy nhin, khng phi bt c cu hnh sinh k tip no cng c th sinh mt cch n gin t cu hnh hin ti. Do thut ton sinh k tip ch gii quyt c ci bi ton lit k n gin. gii quyt nhng bi ton t hp phc tp, ngi ta dng thut ton quay lui. Ni dung chnh ca thut ton quay lui: Xy dng dn dn cc thnh phn ca cu hnh bng cch th tt c cc kh nng c th xy ra. Gi s cu hnh cn lit k c dng x = (x 1, x2,..,xn) khi thut ton quay lui thc hin qua cc bc: 1. Xt tt c nhng gi tr c th c ca x1, th cho x1 nhn ln lt cc gi tr . Vi mi gi tr th gn cho x1 ta s lm tip nh sau: 2. Xt tt c gi tr x2 c th nhn, li th cho x2 nhn ln lt cc gi tr . Vi mi gi tr x2 ta li xt ln lt nhng gi tr ca x 3... c tip tc nh vy cho n bc n. 3. Xt gi tr c th nhn cho xn, th cho xn ln lt nhn nhng gi tr , thng bo nhng cu hnh tm c nh (x1, x2,..., xn). Tm li thut ton quay lui lit k cc cu hnh n phn t dng x = (x1, x2,.., xn) bng cch th cho x1 nhn ln lt cc gi tr c th c. Vi mi gi tr th gn cho x1 th bi ton tr thnh lit k tip cu hnh n-1 phn t x = (x2, x3,.., xn).

45

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Gc

Kh nng chn x1 Kh nng chn x2 vi x1 chn Kh nng chn x3 vi x1 v x2 chn

Hnh 3.1: Lit k cc li gii theo thut ton quay lui. M hnh chung ca thut ton quay lui xc nh thnh phn th i c m t tng qut nh sau: (thut ton ny th cho xi nhn ln lt nhng gi tr m n c th nhn).
void Try(int i) { for <mi gi tr v c th gn cho x[i]> do { <Th cho x[i] bng gi tr v> if <x[i] l phn t cui cng trong cu hnh hoc i==n> then <Thng bo cu hnh tm c> else { <Ghi nhn vic cho x[i] nhn gi tr v (nu cn thit)> Try(i+1); } } } // gi quy cho tip chi x[i+1]. <Nu cn th b ghi nhn vic th x[i]:= v th gi tr khc>

Thut ton quay lui s bt u bng li gi Try(1).

46

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

2.2.1 Thut ton quay lui lit k dy nh phn n


Biu din dy nh phn di n di dng x = (x1, x2,..., xn) trong xi nhn cc gi tr l {0, 1}. Vi mi gi tr gn cho xi ta li th gn cc gi tr c th c cho xi+1. Thut ton quay lui c vit nh sau:
void Try(int i, int B[MAX], int n) { int j; for(j=0; j <= 1; j++) { B[i] = j; if (i == n) Result(B, n); else Try(i+1, B, n); } } void Result(int B[MAX], int n) { int i; printf(\n); for(i=1; i <= n; i++) printf(%3d, B[i]); } int main() { int n, B[MAX]; printf(Nhap n: ); scanf(%d, &n); for(int i=1; i <= n; i++) // khi to cho mng B B[i] = 0; Try(1, B, n); // gi thut ton quay lui return 0; }

Khi n = 3, cy tm kim quay lui nh sau:

47

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Try(1)
x1 = 0 x1 = 1

Try(2)
x2 = 0 x2 = 1 x2 = 0

Try(2)
x2 = 1

Try(3)
x3 = 0 x3 = 1

Try(3)
x3 = 0 x3 = 1

Try(3)
x3 = 0 x3 = 1

Try(3)
x3 = 0 x3 = 1

000

001

010

011

100

101

110

111

Hnh 3.2: Cy tm kim quay lui trong bi ton lit k dy nh phn.

2.2.2 Thut ton quay lui lit k tp con k phn t


lit k tp con k phn t ca tp S = {1, 2, ..., n} ta c th a v lit k cc cu hnh x = (x1, x2,.., xn) y xi S v x1 < x2 < ...< xn. T gi tr c chn cho xi l xi-1 + 1 cho n n k+i (1 i k ), gi thit c thm s x0 = 0 khi xt i =1. Nh vy xt tt c cch chn x1 t 1 (x0 +1) n n-k+1, vi mi gi tr , xt tip tt c cch chn x2 t x1+1 n n-k+2...c nh vy khi chn c x k th ta c cu hnh cn lit k. Vi trng hp n = 5 {1, 2, 3, 4, 5} v k = 3 thut ton quay lui lit k tp con k phn t c minh ha nh sau:

48

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

N = 5; k = 3
1 2 3

Hnh 3.3: Cy lit k tp con 3 phn t vi n = 5. Chng trnh quay lui lit k tp k phn t:
void Try(int i, int B[MAX], int k, int n) { int j; for(j = B[i-1] + 1; j <= (n-k+i); j++) { B[i] = j; if (i == k) Result(B, k); else Try(i+1, B, k, n); } } void Result(int B[MAX], int k) { static int count=0; printf(Tap con thu %d: , ++count); for(i=1; i <= k; i++) printf(%3d, B[i]); } int main() { int n, k, B[MAX]; printf(Nhap n: ); scanf(%d,&n); printf(Nhap k: ); scanf(%d, &k); B[0] = 0;

49

Gio trnh K thut lp trnh 2


Try(1, B, k, n); return 0; }

Khoa CNTT H KTCN

2.2.3 Thut ton quay lui lit k hon v n phn t


Biu din hon v di dng p1, p2,.., pn, trong pi nhn gi tr t 1 n n v p i pj vi i j. Cc gi tr t 1 n n c c cho p i, trong gi tr j c chp nhn nu n cha c dng trc . Do cn phi ghi nh xem gi tr j c dng cha. Ta thc hin iu ny bng mt mng B, trong Bj = true nu j cha c dng v ngc li. u tin cc gi tr trong B ny phi c khi to l true, sau khi gn j cho xi th ghi nhn Bj = false, sau khi gi xong th tc Try(i+1) th thit lp li Bj = true, nh du n cha c dng cho bc th tip theo.

n=3

Hnh 3.4: Cy lit k hon v 3 phn t Chng trnh quay lui lit k hon v m phn t:
void Try(int i, int P[MAX], int B[MAX], int n) { int j; for(j = 1; j <= n; j++) if (B[j] == 1)

50

Gio trnh K thut lp trnh 2


{

Khoa CNTT H KTCN

P[i] = j; B[j] = 0; // nh du s dng j if (i == n) result(P, n); // xut kt qu else Try(i+1, P, B, n); // th cho bc tip theo B[j] = 1; // b nh du phn s dng j } } void Result(int P[MAX], int n) { static int count=0; printf(Hoan vi thu %d, ++count); for(int i=1; i<= n; i++) printf(%3d, P[i]); } int main() { int P[MAX], B[MAX], n; printf(Nhap n: ); scanf(%d, &n); for(int i=1; i <=n; i++) B[i] = 1; Try(1, P, B, n); return 0; }

2.2.4 Bi ton sp xp qun Hu


Yu cu: cho mt bn c vua nxn, hy lit k cch sp xp n qun hu sao cho cc qun hu khng n c nhau! Qun hu trn bn c c th n qun khc trn cng hng, cng ct hoc cng ng cho. Phn tch: cc qun hu s c sp trn cc dng khc nhau do chng c th n theo hng ngang. d phn tch ta m t qun hu theo dng; qun hu 1 dng 1, qun hu i dng iDo mi qun hu chc chn nm trn cc dng khc nhau nn ta ch cn xc nh v tr ct ca mi qun hu l xong. Tip theo ta xt nhng rng buc theo ng cho, c hai ng cho: o Cho \: theo hng Trn Tri - Di Phi o Cho /: theo hng Trn Phi - Di Tri

51

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Hnh 3.5: Cc nc i ca qun hu c th c.

Hnh 3.6: Mt cch sp xp 8 hu trn bn c 8x8 Cc ng cho Trn Tri - Di Phi nh hnh v di, mi ng cho ny s i qua cc , cc ny c tnh cht: dng - ct = C (hng s). Do vi mi ng cho ta c 1 hng s C v 1-n C n-1 xc nh duy nht ng cho .

52

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

1 1 2 3 4 4 5 6 7 7 8

8 -7

-1 0

Hnh 3.7: Cc ng cho Trn Tri - Di Phi Cc ng cho Trn Phi - Di Tri: mi ng cho ny s i qua cc c tnh cht sau: dng + ct = C (hng s). Do vi mi ng cho ta c mt hng s C v 2 C 2n. 1 2 1 2 3 4 5 6 7 8 Hnh 3.8: Cc ng cho Trn Phi - Di Tri. 16 14 2 3 4 5 6 7 8 9

53

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

1 1 ng cho TTDP c ch s 0 2 3 4 5 6 ng cho TPDT c ch s 10 7 8

( 5, 5)

Hnh 3.9: V tr ca qun hu nh hng n 2 ng cho. Ci t: o Cu trc d liu: o Mng R[N]: lu theo ct, R[i] = true ct i cn t do, ngc li ct i b qun hu khng ch. o Mng C1[2*N-1]: lu ng cho TT-DP, do cc dng cho ny c ch s t 1-n n-1 nn nh x ch s ny vo mng C1 bng cch cng thm (n-1). Khi ng cho 1-n s c ch s l 0 trong mng C1 o Mng C2[2*N+1]: lu ng cho TP-DT, cc ng cho ny c ch s t 2- 2n nn ta nh ch s C2 t 2- 2n lun cho tin (hai phn t C2[0] v C2[1] ta khng dng n). o Cc phn t ca 3 mng R, C1 v C2 c gn gi tr True khi bt u! o Thut ton quay lui: o tng chnh nh sau: xt tt c cc ct, th t qun hu 1 vo 1 ct, vi mi cch t qun hu 1, xt tt c cc t qun hu 2 sao cho qun hu 1 khng n c n, th t qun hu 2 vo c thri xt tip n qun hu 3 n qun hu n. Vi mi cch t qun hu n s cho ta mt kt qu! Khi xt ht tt c cc gi tr c th c gn cho qun hu th i th thut ton s quay ln xt nhng gi tr cn li ca qun hu th i-1.

54

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

o Khi chn v tr j cho qun hu th i, th (i, j) khng b qun hu t trc n. Do vy (i, j) phi tho iu kin: Ct j cn t do. ng cho TT-DP c ch s (i-j) khng b bt k qun hu no khng ch. ng cho TP-DT c ch s (i+j) cng khng b cc qun hu trc khng ch. o Sau khi t qun hu th i vo ct j, nu i = n tc l t xong qun hu cui cng c mt b kt qu. Ngc li nh du 2 ng cho TT-DP (i-j) v ng TP-DT(i+j) v ct j b khng ch. Tip tc gi quy cho qun th i+1. Sau khi gi quy cho qun hu i+1, ta phi th v tr khc cho qun hu th i trong s nhng gi tr j c th nhn c. Do ta phi b vic nh du ct j v 2 ng cho, lc ny ct j v 2 ng cho s t do. Thao tc ny cho php qun hu khc c th t v tr nhng bc tip sau. Chng trnh C/C++ minh ha bi ton n-Hu:
#define MAX 12 void ShowResult(int b[MAX], int n) { /*Xuat ket qua theo dong*/ for(int i=0; i < n; i++) printf("(%d, %d)\t", i+1, b[i]+1); printf("\n"); } void Try(int *r,int *b, int n, int i, int *c1, int *c2) { for(int j=0; j < n; j++) { if (r[j] && c1[(i-j)+n-1] && c2[i+j]) { b[i] = j; if (i==n-1) ShowResult(b,n); else {

//tm v tr ct //kim tra ct v 2 cho // chn ct j // xut 1 b kt qu

55

Gio trnh K thut lp trnh 2


r[j] = false; c1[(i-j)+n-1] = false; c2[i+j] = false; Try(r, b, n, i+1, c1, c2); r[j] = true; c1[(i-j)+n-1] = true; c2[i+j] = true; } } } } int main(int argc, char* argv[]) { int b[MAX], r[MAX]; int c1[2*MAX-1], c2[2*MAX-1]; int n; printf("doc n (<12): "); scanf("%d",&n); for(int i=0; i < n;i++) r[i] = true; for(i=0; i < 2*MAX-1; i++) { c1[i] = c2[i] = true; } Try(r, b, n, 0, c1, c2); return 0; } Kt qu khi n (1, 1) (2, 3) (1, 1) (2, 4) (1, 2) (2, 4) (1, 2) (2, 5) (1, 3) (2, 1) (1, 3) (2, 5) (1, 4) (2, 1) (1, 4) (2, 2) =5 (3, 5) (3, 2) (3, 1) (3, 3) (3, 4) (3, 2) (3, 3) (3, 5)

Khoa CNTT H KTCN


// nh du chn ct j //cho b hu khng ch //cho b hu khng ch // t hu tip theo // b chn ct j // cho t do // cho t do

(4, (4, (4, (4, (4, (4, (4, (4,

2) 5) 3) 1) 2) 4) 5) 3)

(5, (5, (5, (5, (5, (5, (5, (5,

4) 3) 5) 4) 5) 1) 2) 1)

56

Gio trnh K thut lp trnh 2


(1, 5) (2, 2) (3, 4) (4, 1) (5, 3) (1, 5) (2, 3) (3, 1) (4, 4) (5, 2)

Khoa CNTT H KTCN

2.2.5 Bi ton m i tun


Yu cu: Cho mt bn c tng qut dng nxn, hy ch ra mt hnh trnh ca mt qun M, xut pht t mt v tr bt u i qua tt c cc cn li ca bn c, mi i ng mt ln. tng c bn: dng thut ton quay lui; xut pht t 1 , gi s nc i l t=1, ta cho qun m th i tip 1 (c 8 nc i c th), nu i tip ny cha i qua th chn lm bc i tip theo. Ti mi nc i kim tra xem tng s nc i bng n*n cha, nu bng th m i qua tt c cc dng (do ch cn tm mt gii php). Trng hp ngc li, gi quy chn nc i tip theo. Ngoi ra, nu ti mt bc tm ng i, nu khng tm c ng i tip th thut ton s quay lui li nc i trc v tm ng i khc

Hnh 3.10: Minh ha tm nc i tip ca qun m.

57

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Hnh 3.11: ng i ca qun m trong bn c 5x5 Ci t: o Cu trc d liu: o Mng board[MAX][MAX]: lu bn c, trong board[i][j] l (i, j); gi tr ca board[i][j] l 0 khi qun m cha i qua, v >0 khi qun m i qua, gi tr board[i][j] lc ny chnh l th t nc i trn hnh trnh. Tht s ci t mng board nh vy l , nhng nu b sung thm mt t th s tng tc thc hin. Vn b sung lin quan n ng bin, do mi ln di chuyn qun m ta phi kim tra xem nc i c ra ngoi bin hay khng. Ta c th m rng mng board khng cn phi kim tra bng cch m rng hai v bn hng trn di tri phi. Khi ch cn gn gi tr cho cc ngoi bin l -1.

58

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Hnh 3.12 : Mng board cho bn c 8x8 12x12. o Mng dr[8], dc[8]: lu cc di ca bc i k tip, c tm nc i c th cho v tr qun m hin ti. Do i nc th i ta ch cn cng thm dr[i] cho dng v dc[i] cho ct! (-2, -1) (-1, -2) (-2, 1) (-1, 2)

(1, -2) (2, -1)

(1, 2) (2, 1)

Hnh 3.13: Th t tm nc i theo chiu kim ng h. Mng dr[] = {-2, -1, 1, 2, 2, 1, -1, -2} dc[] = {1, 2, 2, 1, -1, -2, -2, 1} o Thut gii quy: Ti mi bc ln lt cho qun m th tt c cc nc i k tip (tm nc i k tip). Vi mi bc i, kim tra xem nu nc i hp l (cha i qua v trong
59

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

bn c) th th i nc ny. Nu qun m i qua ht bn c th xut kt qu. Ngc li th gi quy tip cho v tr mi th trn. Lu l mi khi v tr i qua c nh du chnh bng chnh th t nc i trn bn c. Sau khi khng th v tr ny th phi b nh du chn gii php khc (trng hp quay lui). Minh ha hm Try vi step l th t ca nc i, i v j l v tr ca qun m hin ti.
Try( int step, int i, j) { + Vi mi nc i k tip (ii, jj) t (i, j) + Nu (ii,jj) hp l chn (ii, jj) lm nc i k tip + nu i ht bn c xut 1 kt qu + ngc li Gi quy Try(step +1, ii, jj) Khng chn (ii, jj) l nc i k tip }

Chng trnh C/C++ minh ha cho trng hp bn c 8x8.


#include "stdafx.h" #include "conio.h" #include "stdlib.h" #define MAX 12 // trng hp bn c 8x8 void Show(int board[MAX][MAX]); void Init(int board[MAX][MAX]) { for(int i=0;i<MAX;i++) for(int j=0;j<MAX;j++) if(i>=2 && i<=MAX-3 && j>=2 && j<=MAX-3) board[i][j]=0; // nh du cha i qua else board[i][j]=-1; // nh du bin } void Try(int step, int i, int j, int board[MAX][MAX], int *dr, int *dc) {

60

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

for(int k=0; k<7; k++) //duyt qua cc nc i k tip { if( board[i+dr[k]][j+dc[k]]==0 ) // nu v tr ny cha i qua { Board[i+dr[k]][j+dc[k]]= step+1; // nh du chn v tr if(step+1==64) //hon tt mt kt qu { Show(board); printf("Nhan <ENTER> de tiep tuc tim loi \ giai ke. Nhan <ESC> de thoat"); char c; if(c = getch() == 27) exit(1); // gi quy cho nc k tip Try(step+1, i+dr[k], j+ dc[k], board, dr, dc); Board[i+dr[k]][j+dc[k]]= 0;// tr t do cho v tr va chn }// end if }//end for } void Show(int board[MAX][MAX]) { for(int i=0;i<MAX;i++) { for(int j=0;j<MAX;j++) printf("%4d",board[i][j]); printf("\n\n"); } } void main() { int board[MAX][MAX]; int dr[8]={-2,-1,1, 2, 2, 1,-1,-2}; int dc[8]={1, 2, 2, 1,-1,-2,-2,-1}; Init(board); board[2][2]=1; // chn v tr u tin Show(board); Try(1, 2, 2, board, dr, dc); } } else

Mt kt qu ca chng trnh nh sau:


61

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

1 4 4 3 9 5 8 4 1 5 0 3 1 4 8

3 8 5 9 4 2 4 5 3 2 4 7 5 6 5 1

4 3 2 3 3 4 0 5 7 5 2 4 9 3 0

3 4 3 7 6 0 5 3 4 6 2 5 6 2 5 5

3 2 0 3 5 2 4 6 1 5 4 2 9 1 4

3 6 2 3 1 8 1 1 2 6 1 5 8 6 3

1 9 4 2 1 1 6 9 6 1 3 2 8

22 17 10 5 12 27 64 7

Hnh 3.14: Mt gii php cho bn c 8x8.

62

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Chng 1
Tm kim v Sp xp

1.1 Tm kim
Tm kim l thao tc c bn, thng xuyn v quan trng trong tin hc. V d nh tm kim nhn vin trong danh sch nhn vin, tm kim mt sinh vin trong danh sch lp hcCc h thng thng tin thng lu tr khi lng d liu ln, nn thut ton tm kim tt s c nhiu li ch. Tuy nhin, thao tc tm kim cn ph thuc rt nhiu n d liu c t chc nh th no; nu d liu c t chc tt th vic tm kim s tin hnh nhanh chng v hiu qu hn. Gi s sch c sp theo ch , th loi th d tm kim hn l khng c sp. Hoc danh sch tn ngi c sp theo th t alphabet cng d cho vic tm kim

1.1.1 M t bi ton tm kim trong tin hc


Tm kim l qu trnh xc nh mt i tng no trong mt tp cc i tng. Kt qu tr v l i tng tm c hoc mt ch s (nu c) xc nh v tr ca i tng trong tp . Vic tm kim da theo mt trng no ca i tng, trng ny l kha (key) ca vic tm kim. V d: i tng sinh vin c cc d liu {MaSV, HoTen, DiaChi,}. Khi tm kim trn danh sch sinh vin th kha thng chn l MaSV hoc HoTen. Thng thng ngi ta phn lm hai loi tm kim: tm kim tuyn tnh hay cn gi l tun t cho tp d liu bt k; tm kim nh phn cho tp d liu c sp xp. Bi ton tm kim c m t nh sau: Tp d liu c lu tr l dy a1, a2,..,an. Gi s chn cu trc d liu mng lu tr dy s ny trong b nh chnh, c khai bo: int a[n];
63

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Kho cn tm l x c kiu nguyn : int x.

Tm kim

Tm kim tuyn tnh

Tm kim nh phn

Tp DL bt k

Tp DL c sp

Hnh 4.1: Phn loi phng php tm kim

1.1.2 Tm kim tuyn tnh


x?

a1

a2

a3

an-1

an

tng chnh: duyt tun t t phn t u tin, ln lt so snh kha tm kim vi kho tng ng ca cc phn t trong danh sch (trong trng hp m t trn l so snh x v a[i]). Cho n khi gp phn t cn tm hoc n khi duyt ht danh sch. Cc bc tin hnh nh sau : Bc 1: i = 1 ; Bc 2: so snh a[i] vi x, c hai kh nng i. ii. i. ii. a[i] = x: tm thy dng a[i] <> x: sang bc 3 nu i>n: ht mng, khng tm thy dng ngc li: quay li bc 2

Bc 3: i = i +1, kim tra ch s i v kch thc mng n

Hm tm kim tuyn tnh n gin minh ha bng ngn ng C/C++.


64

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

int Search(int a[], int n, int key) { int i =0; while (i<n) && (key != a[i]) i++; if (i >= n) return -1; // tm khng thy else return i; // tm thy ti v tr i }

1.1.3 Tm kim nh phn


Phng php tm kim nh phn c p dng cho dy kho c th t: k[1] k[2] ... k[n]. tng ca phng php ny nh sau: Gi s ta cn tm trong on a[left...right] vi kho tm kim l x, trc ht ta xt phn t gia a[mid], vi mid = (left + right)/2. Nu a[mid] < x th c ngha l on a[left] n a[right] ch cha kha < x, ta tin hnh tm kim t a[mid+1] n a[right]. Nu a[mid] > x th c ngha l on a[m] n a[right] ch cha kho > x, ta tin hnh tm kim t a[left] n a[mid-1]. Nu a[mid] = x th vic tm kim thnh cng. Qu trnh tm kim tht bi nu left > right.

Cc bc tin hnh nh sau: Bc 1: left =1, right = n // tm kim trn tt c phn t. Bc 2: mid = (left + right)/2 // ly mc so snh So snh a[mid] vi x c 3 kh nng: Bc 3: Nu left right; cn phn t tm tip bc 2
65

a[mid] = x, tm thy dng a[mid]> x, tm tip trong dy a[left].. a[mid-1] right = mid -1; a[mid] < x, tm tip trong dy a[mid+1].. a[right] left = mid +1;

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Ngc li: dng, xt ht phn t khng tm thy. V d: cho dy s gm 8 phn t {1, 2, 4, 5, 6, 8, 12, 15} v x = 8

X= 8 5

1
Left = 1

12

15
Right = 8

Mid = 4 on tm kim

X= 8 1 2 4 5 6
Left = 5

=
12 15
Right = 8

8
Mid = 6

on tm kim

Hnh 4.2: Tm kim nh phn. Hm C minh ha ci t thut ton tm kim nh phn


int BinarySearch(int key) { int left = 0, right = n-1, mid; while (left <= right) { mid = (left + right)/ 2; if (a[mid] == key) return mid; if (a[mid] < x) left = mid+1; else right = mid-1; } return -1; }

// ly im gia // nu tm c // tm on bn phi mid

// tm on bn tri mid // khng tm c

66

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

1.1.4 Kt lun
Gii thut tm kim tuyn tnh khng ph thuc vo th t ca cc phn t trong mng, do vy y l phng php tng qut nht tm kim trn mt dy bt k. Thut gii nh phn da vo quan h gi tr ca cc phn t trong mng nh hng trong qu trnh tm kim, do vy ch p dng c vi dy c th t. Thut gii nh phn tm kim nhanh hn tm kim tuyn tnh. Tuy nhin khi p dng thut gii nh phn th cn phi quan tm n chi ph cho vic sp xp mng. V khi mng c sp th t ri th mi tm kim nh phn.

1.2 Bi ton sp xp
Sp xp l qu trnh b tr li cc phn t ca mt tp i tng no theo mt th t nht nh. V d nh: tng dn, gim dn vi mt dy s, th t t in vi cc t...Vic sp xp l mt bi ton thng thy trong tin hc, do cc yu cu tm kim thun li, sp xp kt qu cc bng biu... D liu thng c t chc thnh mng cc mu tin d liu, mi mu tin thng c mt s cc trng d liu khc nhau. Khng phi ton b cc trng u tham gia qu trnh sp xp m ch c mt trng no (hoc mt vi trng) c quan tm. Ngi ta gi trng ny l kho, vic sp xp s c tin hnh da vo gi tr kho ny. V d: sp xp mt mng cc s nguyn tng dn, sp xp mt danh sch hc sinh vi im thi gim dn...

1.3 Mt s phng php sp xp c bn


Trong phn ny gii thiu mt s phng php sp xp c bn thng c dng sp xp mt danh sch, mng d liu.

1.3.1 Phng php chn


y l mt trong nhng thut ton sp xp n gin nht. tng c bn ca phng php ny c th hin nh sau:
67

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

1. lt th nht, ta chn trong dy kho k[1..n] ra kho nh nht v i gi tr n vi k[1], khi k[1] s tr thnh kho nh nht. 2. lt th hai, ta chn trong dy kho k[2..n] ra kha nh nht v i gi tr n cho k[2]. 3. ... 4. lt th i, ta chn trong dy kha k[i..n] ra kha nh nht v i gi tr n cho k[i]. 5. Ti lt k-1, ta chn gi tr nh nht trong k[n-1] v k[n] ra kho nh nht v i cho gi tr cho k[n-1]. Thut gii SelectionSort: (m gi, ch s 1 l u mng)
begin for i:= 1 to n-1 do begin jmin := i; for j:=i+1 to n do if a[j] < a[jmin] then jmin = j; if ( jmin <> i) Swap(a[i], a[jmin]) end. end.

1.3.2 Phng php sp xp ni bt


Trong thut ton sp xp ni bt, dy kha s c duyt t cui ln u dy, nu gp hai kha k cn ngc th t th i ch cho nhau. Sau ln duyt nh vy, kha nh nht trong dy kha s c chuyn v v tr u tin v vn tr thnh sp xp dy kho t k[n] n k[2]. Thut gii bubblesort: (m gi, ch s 1 l u mng)
begin for i:=2 to n do for j:= n downto i do if (a[j] < a[j-1]) Swap(a[j],a[j-1]) end.

1.3.3 Phng php sp xp chn


Xt dy kha k[1..n], ta thy dy con ch gm mi mt kho l k[1] c th coi l sp xp ri. Xt thm k[2], ta so snh n vi k[1], nu thy k[2] < k[1] th chn n vo trc k[1]. i vi k[3], ta ch xt dy ch gm hai kho k[1] v k[2] sp xp
68

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

v tm cch chn k[3] vo dy kha c th t sp xp. Mt cch tng qut, ta s sp xp dy k[1..i] trong iu kin dy k[1..i-1] sp xp ri bng cch chn k[i] vo dy ti v tr ng khi sp xp. Thut gii InsertionSort: (m gi, ch s 1 l u mng)
begin for i:= 2 to n do begin tmp = a[i]; j = i-1; while (j>0) and (tmp < a[j]) begin a[j+1] = a[j];// y li gi tr k[i] v sau -> to khong trng j := j-1; end k[j+1] = tmp; // chn vo khong trng. end end.

1.3.4 Phng php i ch trc tip


tng chnh: xut pht t u dy, tm nhng phn t cn li khng tho th t sp xp vi phn t ang xt, hon v cc phn t tng ng tha th t. Lp li tng t vi cc phn t tip theo ca dy. Cc bc tin hnh nh sau: o
Bc 1: i = 1; Bc 2: j = i+1; Bc 3: While j n do Nu a[j]< a[i] Swap(a[i], a[j]); j = j+1; Bc 4: i = i+1; Nu i < n: Bc 2 Ngc li Kt thc // xut pht t u dy // tm cc phn t pha sau i

o o

V d: cho dy s a:

10

16

69

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

10
i=1

3
j=2

16

3
i=1

10

2
j=5

16

70

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

10
i=2

7
j=3

16

7
i=2

10

6
j=4

16

6
i=2

10

3
j=5

16

71

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

3
i=2

10

6
j=5

16

10
i=3

7
j=4

16

72

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

7
i=3

10

6
j=5

16

6
i=3

10

5
j=6

16

5
i=3

10

4
j=7

16

73

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

10
i=4

7
j=5

16

7
i=4

10

6
j=6

16

6
i=4

10

5
j=7

16

74

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

10
i=5

7
j=6

16

7
i=5

10

6
j=7

16

10
i=6

7
j=7

16

10
i=7

16

75

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

10

16

Hnh 4.3: Minh ha i ch trc tip.

1.3.5 Phng php ShellSort


Trong phng php sp xp kiu chn nu ta lun phi chn mt kha vo v tr u dy th dn n hn ch ca thut ton ny. khc phc trong trng hp ny th ngi ta a ra mt phng php sp xp l ShellSort. tng chnh: xt mt dy a[1]...a[n], cho mt s nguyn h (1 h n), ta c th chia dy thnh h dy con nh sau: 10 dy con sau: Dy chnh Dy con 1 Dy con 2 Dy con 3 10 10 3 3 7 7 6 6 2 2 5 5 4 4 16 16 Dy con 1: a[1], a[1+ h], a[1+2h]... Dy con 2: a[2], a[2+h], a[2+2h]... Dy con 3: a[3], a[3+h], a[3+2h]... ... Dy con h: a[h], a[2h], a[3h]... 3 7 6 2 5 4 16 n = 8, h = 3. Ta c

V d cho dy:

Nhng dy ny c coi l nhng dy con xp theo di bc h. T tng chnh ca thut ton ShellSort l: vi mi bc h, p dng thut ton sp xp kiu chn tng dy con c lp lm mn dn cc phn t trong dy chnh. Tip tc lm tng t i vi bc (h div 2)... cho n khi h = 1 th ta c dy phn t c sp. Xt trong v d trn, nu chng ta dng phng php chn th vi phn t a[5] = 2 l phn t nh nht trong dy, do n phi chn vo v tr th 1, tc l phi chn trc 4 phn t trc n. Nhng nu chng ta xem 2 l phn t ca dy 2 th ta ch cn chn trc mt phn t l 3. y chnh l nguyn nhn thut ton ShellSort thc hin hiu qu hn sp xp chn. Khi kha nh nhanh chng a v gn v tr ng ca n.
76

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Cc bc thc hin chnh nh sau:


Bc 1: chn k khong cch h[1], h[2],.., h[k], v i = 1. Bc 2: Chia dy ban u thnh cc dy con c bc nhy l h[i]. Thc hin sp xp tng dy con bng phng php chn trc tip. Bc 3: i = i+1

o Nu i > k: Dng o Ngc li: Bc 2. V d: cho dy bn di vi n = 8, h = {5, 3, 1}.


10 3 7 6 2 5 4 16

Ta c minh ha nh sau:
h=5

10 3 7

Da 1 y

5
Da 2 y Da 3 y

4 16
Da 4 y

6 2

Da 5 y

77

Gio trnh K thut lp trnh 2


h=3

Khoa CNTT H KTCN

5 3 7

6 2

Da 1 y

4
Da 2 y

16
Da 3 y

10

h=1

Da 1( y chnh) y da

5 2

2 3

7 4

4 5

3 6

10 7

6 10

16 16

Hnh 4.4: Minh ho ShellSort. Ci t ShellSort: sp xp dy a[] tng, vi h[] l mng cha cc di (bc nhy) chn sn:
void ShellSort(int a[], int n, int h[], int k) { int step, i, j; int x, len; for(step = 0; step < k; step++) // duyt qua tng bc nhy { len = h[step]; // chiu di ca bc nhy for(i = len; i < n; i++) // duyt cc dy con { // lu phn t cui tm v tr thch hp trong dy con x = a[i];

78

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

// a[j] ng trc a[i] trong cng dy con j = i len; while ((x < a[j]) && (j>= 0)) // sp xp dy con cha x dng pp chn { a[j+len] = a[j]; // di v sau theo dy con j = j len; // qua phn t trc trong dy con } a[j+len] = x;// a x vo v tr thch hp trong dy con } } }

1.3.6 Phng php phn on QuickSort


y l mt phng php sp xp tt do C.A.R Hoare xut. Thut ton ny c tc trung bnh nhanh hn cc thut ton sp xp tng qut khc. Do Hoare dng ch Quick t tn cho thut ton ny. tng chnh: sp dy a[1] ... a[n], ta thc hin sp xp dy a t ch s 1 n ch s n. QuickSort da trn phn hoch dy ban u thnh hai phn da vo gi tr x, x l gi tr ca mt phn t ty trong dy ban u: Dy th 1: gm cc phn t a[1]..a[i] c gi tr khng ln hn x. Dy th 2: gm cc phn t a[i]..a[n] c gi tr khng nh hn x. 1. a[k] < x, vi k = 1..i 2. a[k] = x, vi k = i..j 3. a[k] > x, vi k = j..n

Sau khi phn hoch th dy ban u c phn thnh ba phn:

a[k] < x

a[k] = x

a[k] > x

Ta c nhn xt khi dy con th 2 c th t, nu dy con 1 v dy con 3 c mt phn t th chng cng c th t, khi dy ban u c sp. Ngc li, nu dy con 1 v 3 c nhiu hn mt phn t th dy ban u c th t khi dy con 1 v 3 c sp. sp xp dy con 1 v 3, ta ln lt tin hnh vic phn hoch tng dy con theo cng phng php va trnh by. Gii thut phn hoch dy a[left], a[left+1],.., a[right] thnh hai dy con:
79

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Bc 1: Chn ty mt phn t a[k] trong dy l gi tr mc, left k right, o Cho x = a[k], i = left, j = right.

Bc 2: Tm v hon v cp phn t a[i] v a[j] khng ng th t ang sp.

o Bc 2-1: Trong khi a[i] < x i++; o Bc 2-2: Trong khi a[j] > x j--; o Bc 2-3: Nu i < j
Bc 3: Swap(a[i], a[j]) // a[i], a[j] sai th t

o Nu i < j: Bc 2; o Nu i j: Dng.

// cha ht mng dng

Gii thut sp xp dy a[left], a[left+1],.., a[right]: c pht biu theo cch quy nh sau:
Bc 1: Phn hoch dy a[left]...a[right] thnh cc dy con:

o Dy con 1: a[left]...a[j] < x


o Dy con 2: a[j+1]...a[i-1] = x

o Dy con 3: a[i]...a[right] > x


Bc 2: o Nu (left < j) o // dy con 1 c nhiu hn 1 phn t

Phn hoch dy a[left]...a[j]

Nu (i < right) // dy con 3 c nhiu hn 1 phn t Phn hoch dy a[i]...a[right]

V d phn hoch dy sau: 10

16

Phn hoch on left = 1, right = 8, x = a[4] = 6

10
left = 1

16
right = 8

10

16

Phn hoch on left = 1, right = 4, x = a[2] = 3

80

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

4
left = 1

2
right = 4

10

16

10

16

Phn hoch on left = 3, right = 4, x = a[3] = 5

5
left = 3

4
right = 4

10

16

10

16

Phn hoch on left = 6, right = 8, x = a[7] = 10

7
left = 6

10

16
right = 8

10

16

QuickSort c ci t quy nh sau:


void QuickSort(int a[], int left, int right) { int i, j;

81

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

int x; x = a[(left+right)/2]; // chn phn t gia lm gc i = left; j = right; do{ while (a[i] < x) i++; // lp n khi a[i] >= x while (a[j] > x) j--; // lp n khi a[i] <= x if ( i <= j) // nu c 2 phn t a[i] v a[j] ko theo th t { Swap(a[i], a[j]); i++; // qua phn t k tip j--; // qua phn t ng trc } } while (i<j); if (left < j) // phn hoch on bn tri QuickSort(a, left, j); if (right > i) // phn hoch on bn phi QuickSort(a, i, right); }

82

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

1.3.7

Phng php c s RadixSort

Thut gii sp xp theo phng php c s khng quan tm n vic so snh gi tr ca cc phn t nh cc thut gii trc. RadixSort s dng cch thc phn loi cc con s trong dy v th t phn loi con con s ny to ra th t cho cc phn t. y l cch tip cn khc so vi cc phng php sp xp trc l so snh cc gi tr ca cc phn t. Thut gii da trn tng chnh l sp xp tng con s ca mt dy cc s. Gi s chng ta c dy s nh sau: 493 812 715 710 195 437 582 340 385. u tin sp xp cc s theo hng n v: 493 812 715 710 195 437 582 340 385. Ta c bng kt qu minh ha nh sau: S hng n v 0 1 2 3 4 5 6 7 8 9 Dy con 710 340 812 582 493 715 195 385 437 Bng 4.1: Sp theo hng n v

Lu nhng phn t ny c a vo dy con theo th t tm thy, do chng ta c th thy l cc dy con cha c th t. Lc ny chng ta thu c mt danh sch gm cc dy con t 0 9 nh sau: 710 340 710 340 812 812 582 493 715 195 385 437 582 493 715 195 385 437 Tip tc chng ta phn loi cc phn t ca dy trn theo con s ca hng chc:

S hng chc 0 1 2 3

Dy con 710 437 812 715

83

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

4 5 6 7 8 9

340 582 385 493 195 Bng 4.2: Sp theo hng chc 715 715 437 437 340 340 582 582 385 385 493 493 195 195

Lc ny chng ta thu c danh sch nh sau: 710 710 812 812 Thc hin tip vi phn loi cc con s hng trm: S hng trm 0 1 2 3 4 5 6 7 8 9 Dy con 195 340 385 437 493 582 710 715 812 Bng 4.3: Sp theo hng trm 385 437 493 582 710 715 812

Thu c danh sch cc phn t t dy con c phn loi theo hng trm t 0 9. 195 340 Nh chng ta thy th lc ny dy c sp! Tm li sp xp dy a[1], a[2],..., a[n] gii thut RadixSort thc hin nh sau: Xem mi phn t a[i] trong dy a[1]...a[n] l mt s nguyn c ti a m ch s Ln lt phn loi cc ch s theo hng n v, hng chc, hng trm...Ti mi bc phn loi ta s ni cc dy con t danh sch phn loi theo th t 0 9. Sau khi phn loi xong hng th m cao nht ta s thu c danh sch cc phn t c sp. Cc bc thc hin thut gii: Bc 1: Bc 2: k = 0; // k l ch s phn loi, k = 0 hng n v, k = 1 hng chc... // To cc dy cha phn t phn loi B[0]...B[9]

84

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Khi to B[0]...B[9] rng, cha cha phn t no, B[i] s cha cc phn t c ch s th k l i. Bc 3: o For i=1 to n do t a[i] vo dy B[j] vi j l ch s th k ca a[i].

o Ni B[0], B[1],..., B[9] li theo ng trnh t thnh a. Bc 4: o k = k +1 o Nu k < m: Bc 2. trong mng o Ngc li: Dng. Gii thut sp xp theo c s RadixSort: Mng a[MAX] cha cc phn t ca mng cn sp tng. Mng B[10][MAX] cha cc dy s c phn tm thi theo cc // m l s lng ch s ti a ca cc s

con s. V d B[0] cha cc phn t c con s hng n v l 100, 210, 320...Khi vi mi dng ca B th s phn cc phn t c con s hng th i (i t 0 - 9), cc gi tr ct j s ln lt cha cc phn t c cng con s hng th i. Mng Len[10] cha s lng cc phn t ca cc dng B[i]. V d B[0] c 3 phn t th Len[0] = 3, B[5] c 2 phn t th B[5] = 2. Ti mi bc trc khi phn cc phn t vo mng B th cc Len[i] c khi to l 0. Ci t RadixSort:
void RadixSort(long a[], int n) { int i, j, d; int h = 10; // bin ly cc con s, bt u t hng n v long B[10][MAX]; // mng hai chiu cha cc phn t phn l int Len[10]; // kch thc ca tng mng B[i] // MAXDIGIT l s con s ti a ca cc phn t a[i] for(d = 0; d < MAXDIGIT; d++) { // khi to kch thc cc dy B[i] l 0 for( i = 0; i < 10; i++) Len[i] = 0;

85

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

// thc hin phn l cc phn t theo con s hng th d tnh t cui for(i = 0; i < n; i++) // duyt qua tt c cc phn t ca mng { digit = (a[i] % h) / (h/ 10); // ly con s theo hng h // a vo dy (l) B[digit] ct Len[digit] B[digit][Len[digit]++] = a[i]; }// end for i // thc hin ni li tun t t B[0] n B[9] vo mng a[] ban u num = 0; // ch s bt u cho mng a[] for(i = 0; i < 10; i++) // duyt qua cc dy t B[0] n B[9] { // ly tng phn t ca tng dy B[i] for(j =0; j < Len[i]; j++) a[num++] = B[i][j]; }// end for i h *= 10; // qua hng k tip. }// end for d }// end RadixSort

86

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Chng 2
Stack - Queue

2.1 Gii thiu Stack ngn xp


Ngn xp l kiu danh sch vi hai thao tc c trng b sung mt phn t vo cui danh sch v loi b mt phn t cng cui danh sch. Ni mt cch khc l thao tc thm phn t v loi phn t ch din ra mt u ca danh sch.

a vo (Push)

Ly ra (Pop)

nh stack (top)

Stack

Hnh 5.1: Minh ha Stack. Chng ta c th hnh dung mt cch n gin nh hnh nh mt chng a, a no c t vo chng sau cng s nm trn tt c a khc v s c ly ra u tin. V nguyn tc vo sau ra trc , Stack cn c tn gi l danh sch kiu LIFO (Last In First Out). V tr cui cng c gi l nh (top) ca ngn xp. Hai thao tc chnh trn Stack l: 1. Thao tc push: a mt phn t vo nh ca Stack 2. Thao tc pop: xo i mt phn t nh ca Stack. V d: Cho Stack S v cc thao tc nh sau: 1. Khi to S l rng nh hnh 5.2.1. 2. Thm mt phn t vo Stack S: Push(S, A) c kt qu nh hnh 5.2.2 3. Thm mt phn t vo Stack S: Push(S, B) c kt qu nh hnh 5.2.3.
87

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

4. Loi phn t u Stack S: Pop(S) ta c Stack S nh hnh 5.2.4. 5. Thm phn t vo Stack S: Push(S, C) kt qu Stack S nh hnh 5.2.5.

B A
Hnh 1 Hnh 2

C A
Hnh 4

A
Hnh 3

A
Hnh 5

Hnh 5.2: Minh ha cc thao tc trn Stack.

2.1.1 Ci t Stack dng CTDL mng


Trong phn ny chng ta s ci t mt Stack dng cu trc d liu mng. cho tng qut ta gi Data l kiu d liu c nh ngha m Stack lu tr, v d Data c th l s nguyn, thc... hoc mt cu trc d liu no :
typedef int Data typedef float Data typedef struct { int char float ... } Data; ... ID; Name[50]; Salary;

Khai bo cu trc d liu Stack trn mng:


#define MAX 100 typedef struct{ int Data } Stack; top; S[MAX];

88

Gio trnh K thut lp trnh 2


A B C

Khoa CNTT H KTCN

Top

Hnh 5.3: Minh ha Stack dng mng mt chiu. Trong cu trc Stack ny cc trng c ngha nh sau: top: ch n nh ca Stack, top = -1 Stack rng, top 0 Stack c phn t S[MAX]: cha d liu ca Stack lu tr, truy cp n phn t nh th dng trng top. Cc thao tc trn Stack c m t nh sau:
void Push(Stack &st, Data x): a mt Data Pop(Stack &st): Ly

phn t x vo nh ca Stack.

mt phn t nh ra khi Stack. to mt Stack mi rng

void InitStack(Stack &st): Hm khi int IsEmpty(Stack st): Kim int IsFull(Stack st): Kim

tra xem Stack c rng hay khng.

tra xem Stack y hay cha. phn t nh (khng ly ra).

Data Top(Stack st): Xem mt

Ci t ca cc thao tc:
#define TRUE 1 #define FALSE 0 void Push(Stack &st, Data x) { if (IsFull(st)) { printf(\nStack full!); } else st.S[++st.top] = x; } Data Pop(Stack &st) { if (IsEmpty(st)) printf(\nStack empty!); else return (st.S[st.top--]); }

89

Gio trnh K thut lp trnh 2


void InitStack(Stack &st) { st.top = -1; } int IsEmpty(Stack st) { if (st.top == -1) return TRUE; else return FALSE; } int IsFull(Stack st) { if (st.top >= MAX) return TRUE; else return FALSE; } Data Top(Stack st) { Data d; if (IsEmpty(st)) printf(\n Stack empty!); else d = st.S[st.top]; return d; }

Khoa CNTT H KTCN

2.1.2 Cc ng dng stack


Thng thng cu trc d liu stack thch hp cho vic lu tr d liu m trnh t truy xut ngc vi trnh t lu tr. C ngha l d liu lu tr trc s c ly ra sau nhng d liu lu sau (LIFO). Do stack c mt s ng dng nh sau: Trong trnh bin dch, stack dng lu tr cc li gi hm, v d nh hm A gi hm B, hm B li gi hm C, khi hm C thc hin xong th s iu khin chng trnh s tr v thc hin chng trnh B. Ri khi hm B thc hin xong th s iu khin chng trnh s c tr v cho A. Khi ta thy l hm C c gi sau cng v chng c thc hin xong trc tin ri mi n B v A. y l dng thc hin sau v kt thc trc.

90

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Ha A m

Ha B m

Ha C m

Hnh 5.4: Minh ha x l gi hm trong trnh bin dch Lu tr d liu gii cc bi ton l thuyt th. V d nh tm chu Ngoi ra, stack cn c s dng kh mt s bi ton quy. Cn rt nhiu ng dng ca Stack... trnh Euler, tm ng i...

2.1.3 Cc v d minh ha
Chng trnh xut chui k t theo th t ngc li S dng stack cha d liu l cc k t, khi ta s push ln lt cc k t ca chui vo stack v sau ly (Pop) ln lt cc k t ny ra. Kt qu l chui c xut di dng o ngc li.
#include "stdio.h" #include "conio.h" #include "string.h" #define TRUE 1 #define FALSE 0 #define MAX 100 typedef char Data; typedef struct{ int top; Data S[MAX]; } Stack; void Push(Stack & st, Data x); Data Pop(Stack &st); void InitStack(Stack &st); int IsEmpty(Stack st); int IsFull(Stack st); Data Top(Stack st); void Push(Stack & st, Data x) { if (IsFull(st)) printf("\nStack is full!");

91

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

else st.S[++st.top] = x; } Data Pop(Stack &st) { if (IsEmpty(st)) printf("\nStack is empty!"); else return (st.S[st.top--]); } void InitStack(Stack &st) { st.top = -1; } int IsEmpty(Stack st) { if (st.top == -1) return TRUE; else return FALSE; } int IsFull(Stack st) { if (st.top >= MAX) return TRUE; else return FALSE; } Data Top(Stack st) { Data d; if (IsEmpty(st)) printf("\n Stack is empty!"); else d = st.S[st.top]; return d; } void main() { char s[MAX]; Stack st; clrscr();

92

Gio trnh K thut lp trnh 2


printf("Nhap chuoi: "); gets(s); InitStack(st); for(int i=0; i < strlen(s); i++) Push(st, s[i]); printf("\n Chuoi nguoc lai: "); while (!IsEmpty(st)) printf("%c", Pop(st)); getch(); }

Khoa CNTT H KTCN

Chng trnh i s sang h c s bt k.

#include "stdio.h" #include "conio.h" #include "string.h" #define MAX 100 #define TRUE 1 #define FALSE 0 typedef unsigned int Data; typedef struct{ int top; Data S[MAX]; } Stack; void Push(Stack & st, Data x); Data Pop(Stack &st); void InitStack(Stack &st); int IsEmpty(Stack st); int IsFull(Stack st); Data Top(Stack st); void Push(Stack & st, Data x) { if (IsFull(st)) printf("\nStack is full!"); else st.S[++st.top] = x; } Data Pop(Stack &st) { if (IsEmpty(st)) printf("\nStack is empty!"); else

93

Gio trnh K thut lp trnh 2


return (st.S[st.top--]); } void InitStack(Stack &st) { st.top = -1; } int IsEmpty(Stack st) { if (st.top == -1) return TRUE; else return FALSE; } int IsFull(Stack st) { if (st.top >= MAX) return TRUE; else return FALSE; } Data Top(stack st) { Data d; if (IsEmpty(st)) printf("\n Stack is empty!"); else d = st.S[st.top]; return d; } void main() { char s[MAX]; int coso, so, du; stack st; clrscr(); printf("Nhap co so can doi: "); scanf("%d", &coso); printf("Nhap so:"); scanf("%d",&so); InitStack(st); while (so != 0) { du = so % coso;

Khoa CNTT H KTCN

94

Gio trnh K thut lp trnh 2


Push(st, du); so = so/coso; } printf("\n Co so : "); while (!IsEmpty(st)) printf("%3X", Pop(st)); getch(); }

Khoa CNTT H KTCN

Bi ton thp Hanoi Bi ton thp Hanoi thng c gii bng phng php quy, trong chng trc

trnh by. Tuy nhin c th gii bng cch dng stack kh quy. thc hin vic lu tr tm trong qu trnh di chuyn chng ta dng mt stack. Trong mi phn t ca stack ny cha cc thng tin gm: s a di chuyn (N), ct ngun bt u di chuyn (Nguon) v ct ch l ni cn di chuyn n (Dich). y khng cn lu ct trung gian v c 3 ct nh s l 1, 2 v 3 th ct trung gian di chuyn l: 6 (Nguon+Dich). u tin a vo stack thng tin di chuyn {n, 1, 2}, tc l di chuyn n a t ct 1 sang ct th 2 qua ct trung gian l 6-(1+2) = 3. Ti mi bc khi ly trong stack ra mt phn t, thc hin nh sau: Nu N = 1: di chuyn a t ct Nguon ct Dich Ngc li (nu N > 1): Xc nh ct trung gian TrungGian = 6 (Nguon+Dich) Push stack thng tin di chuyn {N-1, TrungGian, Dich} Push stack thng tin di chuyn {1, Nguon, Dich} Push stack thng tin di chuyn {N-1, Nguon, TrungGian}

Qu trnh cn thc hin khi stack khc rng. Nhn xt: lu th t khi a vo thng tin di chuyn vo stack. Trong phn trn thng tin {N-1, Nguon, TrungGian} c a vo stack sau cng nn chng s c ly ra trc tin, k n l thng tin di chuyn {1, Nguon, Dich} v cui cng l thng tin di chuyn {N-1, TrungGian, Dich}. Chng trnh minh ha:
#include "stdio.h" #include "conio.h"

95

Gio trnh K thut lp trnh 2


#define MAX 100 #define TRUE 1 #define FALSE 0 typedef struct { int N; int Nguon; int Dich; } Data;

Khoa CNTT H KTCN

// s a cn di chuyn // ct bt u di chuyn // ct ch n

typedef struct{ int top; Data S[MAX]; } stack; void Push(stack & st, Data x); Data Pop(stack &st); void InitStack(stack &st); int IsEmpty(stack st); int IsFull(stack st); Data Top(stack st); void Push(stack & st, Data x) { if (IsFull(st)) printf("\nStack full!"); else st.S[++st.top] = x; } Data Pop(stack &st) { if (IsEmpty(st)) printf("\nStack empty!"); else return (st.S[st.top--]); } void InitStack(stack &st) { st.top = -1; } int IsEmpty(stack st) {

96

Gio trnh K thut lp trnh 2


if (st.top == -1) return TRUE; else return FALSE; } int IsFull(stack st) { if (st.top >= MAX) return TRUE; else return FALSE; } Data Top(stack st) { Data d; if (IsEmpty(st)) printf("\n Stack is empty!"); else d = st.S[st.top]; return d; } void Hanoi(int n) { stack st; // stack cha thng tin di chuyn InitStack(st); // khi to stack

Khoa CNTT H KTCN

Data d,d1,d2,d3; // cc bin tm cha thng tin di chuyn. int TrungGian; // ct trung gian // a thng tin ban u vo stack {n, 1, 2} : di chuyn n a t ct 1 n 2 d.N = n; d.Nguon = 1; d.Dich = 2; Push(st, d); // a vo stack

while (!IsEmpty(st)) // lp khi stack cn phn t { d = Pop(st); // ly mt phn t u stack ra thc hin if (d.N == 1) // nu ch c mt a th di chuyn Ngun ch printf("\nDi chuyen: %d -> %d", d.Nguon, d.Dich); else // nhiu hn mt a {

97

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

TrungGian = 6 - (d.Nguon+d.Dich); // ly ct Trung gian /* a vo stack theo th t ngc li. Tc l a vo thng tin: di chuyn N-1 a t cc trung gian n cc ch, di chuyn 1 a t ngun sang ch, v cui cng a N-1 a t cc ngun sang trung gian. Khi ly t stack ra chng ta s c th t ngc li l: di chuyn N-1 a t cc ngun sang trung gian, di chuyn 1 a t cc ngun sang ch v cui cng di chuyn N-1 a t cc trung gian sang ch. y chnh l th t m chng ta cn thc hin chuyn N a t cc ngun sang ch. */ // a thng tin di chuyn N-1 a t Trung gian ch d1.N = d.N-1; d1.Nguon = TrungGian; d1.Dich = d.Dich; Push(st,d1); // a thng tin di chuyn 1 a t Ngun ch d2.N = 1; d2.Nguon = d.Nguon; d2.Dich = d.Dich; Push(st, d2); // a thng tin di chuyn N-1 a t Ngun Trung gian d3.N = d.N -1; d3.Nguon = d.Nguon; d3.Dich = TrungGian; Push(st,d3); } } // end while stack <> } // end Hanoi int main() { int n; clrscr(); printf("Nhap vao so cot: "); scanf("%d",&n); Hanoi(n); getch(); return 0; }

Thut ton QuickSort s dng stack


98

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Nh chng ta bit th thut ton QuickSort thng c ci t bng gii thut quy. Tuy nhin mt cch khc l dng cu trc d liu stack ci t cng tt. Cch thc hin l to mt cu trc stack lu tr hai bin tri v phi ca mt on. V d nh khi phn on left n right, chng ta c ba on l [left...i] l cc phn t nh hn x, on [i+1..j-1] l cc phn t bng x, v on cui l [j...right]. Khi chng ta s a vo stack on bn phi, nu on bn tri nhiu hn mt phn t ta cp nht li right = i, khi chng ta s lp li vi on [left...i] mt cch tng t, khi on bn tri ht th chng ta s ly t trong stack ra nhng on c lu gi thc hin tip tc...qu trnh thc hin cho n khi stack rng.
#include "stdio.h" #include "conio.h" #include "stdlib.h" #define TRUE 1 #define FALSE 0 #define MAX 100 typedef struct { int left; int right; } Data; typedef struct{ int top; Data S[MAX]; } stack; void Push(stack & st, Data x); Data Pop(stack &st); void InitStack(stack &st); int IsEmpty(stack st); int IsFull(stack st); Data Top(stack st); void Swap(int &a, int &b) { int tmp =a; a = b; b = tmp; }

99

Gio trnh K thut lp trnh 2


void Push(stack & st, Data x) { if (IsFull(st)) printf("\nStack is full!"); else st.S[++st.top] = x; } Data Pop(stack &st) { if (IsEmpty(st)) printf("\nStack is empty!"); else return (st.S[st.top--]); } void InitStack(stack &st) { st.top = -1; } int IsEmpty(stack st) { if (st.top == -1) return TRUE; else return FALSE; } int IsFull(stack st) { if (st.top >= MAX) return TRUE; else return FALSE; } Data Top(stack st) { Data d; if (IsEmpty(st)) printf("\n Stack is empty!"); else d = st.S[st.top]; return d; } void QuickSort(int a[MAX], int n)

Khoa CNTT H KTCN

100

Gio trnh K thut lp trnh 2


{ int int i, j, l, r; x;

Khoa CNTT H KTCN

l = 0; r = n-1; stack st; InitStack(st); while (l < r ) { x = a[(l+r)/2]; i = l; j = r; do{ while (a[i] < x) i++; while (a[j] > x) j--; if ( i <= j) { Swap(a[i], a[j]); i++; j--; } } while (i<j); if (r > i) { Data d; d.left = i; d.right = r; Push(st,d); } if (l < j) { r = j; } else if (!IsEmpty(st)) { Data d = Pop(st); l = d.left; r = d.right; } else

101

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

break; // thoat khoi vong lap -> while (l < r) } } void main() { int a[MAX] ; int n = 30; clrscr(); randomize(); printf("Mang truoc khi sap: \n"); for(int i=0; i < n;i++) { a[i] = random(100); printf("%4d", a[i]); } QuickSort(a,n); printf("\nMang sau khi sap:\n"); for(i=0; i <n; i++) printf("%4d",a[i]); getch(); }

Bi ton chuyn biu thc trung t sang hu t. Nh chng ta bit mt biu thc c biu din di dng hu t hay cn gi l

k php nghch o Ba Lan RPN (Reverse Polish Notation) gip ch rt nhiu cho vic tnh ton gi tr biu thc tt hn l biu thc dng trung t. Cc trnh bin dch my tnh thng chuyn nhng biu thc trung t sang hu t d x l hn. Trong phn ny chng ta s tm hiu thut ton chuyn mt biu thc dng trung t n gin sang biu thc hu t tng ng. V d mt biu thc trung t nh sau: (6 / 2 + 3) * (7 - 4) c chuyn thnh biu thc hu t nh sau: 6 2 / 3 + 7 4 - *. Chng ta c th thy cch biu din ca trung t cn phi x l du ngoc trong khi biu thc hu t th khng cn s dng. y l u im ca biu thc hu t. chuyn i chng ta s dng mt Stack dng lu tr cc ton t v du ngoc m. Ngoi ra cng quy nh u tin ca cc ton t thng qua hm Priority, trong php ton *, / c u tin cao nht l 2, php ton +, - c u tin t hn l 1, v cui cng du ngoc m ( l 0. tng ca thut ton:
102

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Duyt qua tng phn t trong biu thc trung t, gi C l phn t ang xt: Nu C l ( th push vo stack Nu C l ) th ly trong stack ra cho n khi gp (: xut ra nhng phn t ny. Nu C l ton t +,-,*,/: Ly trong stack ra tt c nhng ton t c u tin cao hn C, xut nhng phn t ny ra ngoi. Sau a C vo stack. Cui cng ly tt c nhng phn t cn li trong stack xut ra ngoi. Thut ton chuyn i t trung t sang hu t:
Stack = {}; // khi to stack rng for < phn t C c c t biu thc trung t> do { if ( C == ( ) Push(Stack, C); // a vo stack else if ( C== )) { do { x = Pop(Stack); // ly t stack ra cho n khi gp ( if (c != () printf(%c, x); } while ( x!= () } else if (C == + || C ==- || C == * || C==/) { while ( !IsEmpty(Stack) && Priority(C) <= Priority(Top(Stack))) printf(%c, Pop(Stack)); // nu u tin ton t trong // stack ln hn th ly ra. Push(Stack, C); } else // ton hng printf(%c,C); // a ton t mi vo stack

} while ( !IsEmpty(Stack)) // lp ly tt c cc phn t trong stack ra printf(%c, Pop(Stack));

V d khi thc hin vi biu thc trung t: (2 * 3 + 7 / 8) * (5 1) Stack Output


103

c X l

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

( 2 * 3 + 7 / 8 ) * ( 5 1 )

y vo stack Xut Do * u tin hn ( nh stack nn a * vo stack Xut Do + u tin thp hn * nh stack nn ta ly * ra. Tip tc so snh + vi ( th + u tin cao hn nn a vo stack Xut Do / c u tin cao hn + trn nh stack nn a / vo stack. Xut Ly trong stack ra cho n khi gp ngoc (. a vo stack a vo stack Xut u tin ca - cao hn ( trong nh stack nn a - vo stack Xut Ly trong stack ra cho n khi gp ngoc ng Ly nhng phn t cn li trong stack v hin th

( ( (* (* (+ (+ (+/ (+/ * *( *( *(*(*

2 2 23 23* 23*7 23*7 2 2 2 2 2 3 3 3 3 3 * * * * * 7 7 7 7 7 8 8 8 8 8 / / / / + + + +5

23*78/+5 23*78/+51 23*78/+5123*78/+51*

Bi ton tnh gi tr biu thc hu t. Trong nhng nm u 1950 nh logic hc ngi Ba Lan Jan Lukasiewicz chng

minh rng: biu thc hu t khng cn c du ngoc vn c th tnh ng bng cch c ln lt biu thc t tri qua phi v dng mt stack lu tr kt qu trung gian. Cc bc thc hin nh sau: Bc 1: Khi to mt stack = {} Bc 2: c ln lt cc phn t ca biu thc hu t t tri sang phi, vi mi phn t thc hin kim tra: Nu phn t ny l ton hng th y n vo stack Nu phn t ny l ton t th ta ly hai ton hng trong stack ra v thc hin php ton vi hai ton hng . Kt qu tnh c s c lu vo trong stack.

104

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Bc 3: Sau khi kt thc bc hai th ton b biu thc c c xong, trong stack ch cn duy nht mt phn t, phn t chnh l gi tr ca biu thc. V d: tnh gi tr biu thc 10 2 / 3 + 7 4 - *, c biu thc trung t l: (10/2 + 3)*(7-4), ta c cc bc thc hin nh sau: c X l 10 a vo stack a vo stack 2
Ly hai phn t u stack l 2, 10 v thc hin

Stack 10 10 2 5 53 8 87 874 83 24

Output

/ 3 + 7 4 *

php ton 10/2 = 5. Sau lu kt qu 5 vo stack a 3 vo stack Ly hai gi tr 3, 5 ra khi stack, thc hin php cng ca hai s , kt qu l 8 c a vo li stack a 7 vo stack a 4 vo stack Ly hai gi tr 4, 7 ra khi stack, thc hin php tnh 7 4 = 3, kt qu 3 c a vo li stack Ly hai gi tr 3, 8 ra khi stack, thc hin php tnh 8 * 3 = 24, lu kt qu vo stack Ly kt qu t stack y chnh l kt qu ca biu thc.

24

105

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

2.2 Gii thiu Queue hng i


Hng i Queue l kiu danh sch vi hai php ton c bn l b sung mt phn t vo cui danh sch (Rear) v loi b mt phn t u danh sch (Front). Ni tm li l hai thao tc c bn a vo mt phn t v ly ra mt phn t hai u ca danh sch. Danh sch hng i lm vic theo c ch FIFO (First In First Out), ngha l vic thm mt phn t vo hng i hay ly mt phn t t hng i ra ngoi theo th t Vo trc ra trc.
Ly ra (Remove) Thm vo (Insert)

Queue

u Queue (Front)

Cui Queue (Rear)

Hnh 5.5: Minh ha hng i Queue. Hai thao tc chnh trn hng i: 1. Thao tc Insert: thm mt phn t vo cui danh sch. 2. Thao tc Remove: xo mt phn t u danh sch. V d: Cho hng i Q v cc thao tc nh sau: 1. Hng i ban u c hai phn t A v B hnh 5.6 2. Thm mt phn t C vo cui Queue: Insert(Q, C) hnh 5.7 3. Ly mt phn t u Queue: Remove(Q) hnh 5.8 4. Thm mt phn t D vo cui Queue: Insert(Q, D) hnh 5.9 5. Ly mt phn t u Queue: Remove(Q) hnh 5.10

106

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Front

Rear

Hnh 5.6: Hng i c hai phn t A v B.

Front

Rear

Hnh 5.7: Hng i sau khi thm phn t C vo cui.

Front

Rear

Hnh 5.8: Hng i sau khi ly phn t u.

Front

Rear

Hnh 5.9: Hng i sau khi thm phn t D vo cui.

Front

Rear 107

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Hnh 5.10: Hng i sau khi ly phn t u.

2.2.1 Ci t Queue dng CTDL mng


s dng cu trc d liu mng m t Queue ngi ta dng hai ch s l Front v Rear nh du v tr u v cui ca hng i trong mng. Nu mng tnh t ch s 0 th ban u chng ta khi to Rear = -1 v Front = 0. thm mt phn t vo Queue, ta tng Rear ln 1 v a n vo phn t th loi mt phn t khi Queue, ta ly gi tr v tr Front v tng ch s ny Khi Rear tng ln ht khong ch s ca mng th mng y, khi ta khng th Khi Front > Rear Queue = {}. Rear. ln 1. thm vo mng c na. Tng t nh phn Stack y s xy dng mt cu trc Queue cha cc phn t c kiu d liu l Data, Data l kiu d liu do ngi dng nh ngha c th s nguyn, thc, k t hoc mt cu trc d liu no ty . Khai bo cu trc Queue dng mng:
#define MAX 100 typedef struct { int Front; int Rear; Data Q[MAX]; } Queue;

// ch n v tr u ca queue // ch n v tr cui ca queue // mng d liu cn lu tr

Trong cu trc ny trng Front ch n v tr u ca Queue cn Rear ch n v tr cui ca Queue. Ban u khi Queue c khi to rng th Rear = -1 v Front = 0. Cc thao tc trn cu trc Queue:
void Insert(Queue &queue, Data x): a phn Data Remove(Queue &queue): Ly int IsEmpty(Queue queue):

t x vo cui Queue

mt phn t u Queue

Kim tra xem Queue c rng hay khng tra xem Queue y hay khng. to Queue.
108

int IsFull(Queue queue): Kim

void InitQueue(Queue &queue): Khi

Phn ci t cc thao tc trn Queue:

Gio trnh K thut lp trnh 2


#define TRUE 1 #define FALSE 0 void Insert(Queue &queue, Data x) { queue.Rear++; // tng Rear ln 1 if (IsFull(queue)) printf(Queue full!); else queue.Q[queue.Rear] = x; } Data Remove(Queue &queue) { Data x; if (IsEmpty(queue)) printf(Queue empty!); else x = queue.Q[queue.Front++]; return x; } int IsEmpty(Queue queue) { if (queue.Front > queue.Rear) return TRUE; return FALSE; } int IsFull(Queue queue) { if (queue.Rear == MAX) return TRUE; return FALSE; } void InitQueue(Queue &queue) { queue.Rear = -1; queue.Front = 0; }

Khoa CNTT H KTCN

2.2.2 Cc ng dng Queue


Thng thng cc vn lin quan n c ch vo trc ra trc u c th dng cu trc d liu Queue. V d nh c ch sn xut v tiu th, hng ha sn xut trc c a vo kho v s c xut ra trc. Cc ng dng t v tu la my bay, h
109

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

thng rt tin...Ngoi ra hng i cn c dng nhiu trong h iu hnh: b m ng dng, hng i x l cc s kin, hng i x l phm nhn, tin trnh... Bi ton qun l kho hng: y l dng bi ton sn xut & tiu dng, mt hng c sn xut ra s c lu vo kho, hng ha t kho ny s c xut ra ngoi cho nh phn phi. Khi nhng mt hng no a vo kho trc tin s ra c xut kho trc. y l dng FIFO nn chng ta c th dng cu trc d liu Queue minh ha cho n.
#include "stdio.h" #include "conio.h" #define MAX 100 #define TRUE 1 #define FALSE 0 typedef struct { char MaSP[10]; char TenSP[50]; } Data; typedef struct { int Rear, Front; Data Q[MAX]; }Queue; void Insert(Queue &queue, Data x); Data Remove(Queue &queue); int IsEmpty(Queue queue); int IsFull(Queue queue); void InitQueue(Queue &queue); void Insert(Queue &queue, Data x) { queue.Rear++; // tng Rear ln 1 if (IsFull(queue)) printf("Queue full!"); else queue.Q[queue.Rear] = x; }

// Ma san pham // Ten san pham

110

Gio trnh K thut lp trnh 2


Data Remove(Queue &queue) { Data x; if (IsEmpty(queue)) printf("Queue empty!"); else x = queue.Q[queue.Front++]; return x; } int IsEmpty(Queue queue) { if (queue.Front > queue.Rear) return TRUE; return FALSE; } int IsFull(Queue queue) { if (queue.Rear == MAX) return TRUE; return FALSE; } void InitQueue(Queue &queue) { queue.Rear = -1; queue.Front = 0; } Data InputProduct() // c mt sn phm { Data sp; printf("\nMa san pham: "); scanf("%s",sp.MaSP); printf("Ten san pham: "); scanf("%s", sp.TenSP); return sp;

Khoa CNTT H KTCN

} void OutputProduct(Data sp) // xut mt sn phm { printf("\nSan pham : MaSP: %s, TenSP: %s", sp.MaSP, sp.TenSP); } void ListProducts(Queue q) // lit k nhng sn phm trong kho { if (!IsEmpty(q)) // nu c sn phm trong kho { printf("\n Danh sach san pham trong kho:\n");

111

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

for(int i= q.Front; i <= q.Rear; i++) // duyt qua cc phn t { printf("\nSan pham: MaSP: %s, TenSP: %s",q.Q[i].MaSP, q.Q[i].TenSP); } } } int main() { Queue queue; InitQueue(queue); // khi to hng i clrscr(); int i; do { clrscr(); printf("CHUONG TRINH MINH HOA QUAN LY KHO\n"); printf("-----------------------------------------------\n"); printf("1. Them san pham vao kho.\n"); printf("2. Xuat san pham ra khoi kho.\n"); printf("3. Xem san pham chuan bi xuat kho.\n"); printf("4. Xem tat ca hang hoa trong kho. \n"); printf("5. Thoat.\n"); printf("Chon chuc nang: (1- 5): "); scanf("%d",&i); switch (i) { case 1: Insert(queue, InputProduct()); // thm sp vo kho break; case 2: OutputProduct(Remove(queue)); // ly sp khi kho break; case 3: if (!IsEmpty(queue)) // xem sp sp ly OutputProduct(queue.Q[queue.Front]); break; case 4: // xem tt c sp ListProducts(queue); break; } getch(); } while (i != 5);

112

Gio trnh K thut lp trnh 2


return 0; }

Khoa CNTT H KTCN

Duyt cy theo chiu rng trong th: y l phng php duyt hay tm kim ph bin trn th. Vic duyt mt nh v

s cho php chng ta i duyt tip vi nhng nh k ca n sao cho tha th t u tin theo chiu rng, tc l nh no gn vi v nht s c duyt trc.
A

G Duye sau B, C,... t nh D

Hnh 5.11: Minh ha th t duyt theo chiu rng. Khi ti mi bc xt mt nh v ta c mt danh sch cc nh k ca n, nhng nh ny ch c duyt do ta s a nhng nh ny vo cui danh sch ch c duyt, khi nhng nh no vo danh sch ch trc th s c duyt trc. Vi cu trc d liu ny th thch hp cho vic s dng Queue. Thut ton: Breadth First Search
void BFS(int v) // th tc duyt theo chiu rng t mt nh v { Queue QList; InitQueue(QList); // khi to hng i Insert(QList, v); // a v vo hng i Xet[v] = TRUE; // nh du v duyt while (IsEmpty(QList) == 0) { p = Remove(QList); // ly nh trong hng i Visit(p); // thm nh p, c th xut nh ra ... for( i=1; i <= n; i++) // duyt qua cc nh if ( A[v][i] == 1 && Xet[i] == FALSE) // nu i l nh k v v cha xt { Insert(QList, i); // a vo hng i Xet[i] = TRUE; // nh du i xt.

113

Gio trnh K thut lp trnh 2


} } }

Khoa CNTT H KTCN

Mng A[][]: cha ma trn k ca th (G) Mng Xet[]: nh du mt nh v c duyt hay cha; 1: duyt, 0: cha duyt. Tt c cc phn t ca mng Xet[] ban u c khi to l 0. Chng trnh minh ha duyt theo chiu rng:
#include "stdio.h" #include "conio.h" #define MAX 100 #define TRUE 1 #define FALSE 0 typedef int Data; typedef struct { int Rear, Front; Data Q[MAX]; } Queue; void Insert(Queue &queue, Data x); Data Remove(Queue &queue); int IsEmpty(Queue queue); int IsFull(Queue queue); void InitQueue(Queue &queue); void Insert(Queue &queue, Data x) { queue.Rear++; // tng Rear ln 1 if (IsFull(queue)) printf("Queue full!"); else queue.Q[queue.Rear] = x; } Data Remove(Queue &queue) { Data x; if (IsEmpty(queue)) printf("Queue empty!"); else x = queue.Q[queue.Front++]; return x; }

114

Gio trnh K thut lp trnh 2


int IsEmpty(Queue queue) { if (queue.Front > queue.Rear) return TRUE; return FALSE; } int IsFull(Queue queue) { if (queue.Rear == MAX) return TRUE; return FALSE; } void InitQueue(Queue &queue) { queue.Rear = -1; queue.Front = 0; } void BFS(int v, int a[][MAX], int xet[], int n) { int d; Queue queue; InitQueue(queue); Insert(queue, v); xet[v] = TRUE; while (!IsEmpty(queue)) { d = Remove(queue); printf("%d\t", d); for(int i=1; i <= n; i++) if (a[d][i]== 1 && xet[i]== FALSE) { Insert(queue, i); xet[i] = TRUE; } } } int main() { int a[MAX][MAX], xet[MAX], n; clrscr(); char name[50]; printf(Nhap ten file ma tran ke cua (G): );

Khoa CNTT H KTCN

115

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

gets(name); FILE * f = fopen(name,"r"); if (f == NULL) { printf("Loi doc file!"); return 1; } fscanf(f,"%d",&n); for(int i=1; i <= n;i++) for(int j=1; j <= n; j++) fscanf(f,"%d",&a[i][j]); // danh dau cac dinh chua xet for(i =1; i <= n; i++) xet[i] = FALSE; // duyet qua cac dinh cua do thi printf("Cac dinh cua do thi duoc duyet theo chieu rong\n"); for(i =1; i <= n; i++) if (xet[i] == FALSE) BFS(i, a, xet, n); getch(); return 0; }

Tp tin ma trn k c dng sau:


N A[1][1] A[N][1] A[N][N] A[1][N]

Trong A[i][j] = 1 nu (i, j) c cnh ni v ngc li A[i][j] = 0 nu khng c cnh ni V d tp tin ma trn k minh ha th c 5 nh.
5 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0

116

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

BI TP
1. Tinh chnh li on chng trnh sau: for (int i=0; i < n; i++) { if ( flag) b[i] = 0; a[i] = a[i] + b[i]; c[i] = a[i] + 2*b[i]; } 2. Tinh chnh li on chng trnh sau: ... while ( sqrt( i*i) < sqrt (a*a) ) { // on chng trnh . i++; } 3. Tinh chnh li on chng trnh sau: ... flag = FALSE; k =0; while ( k < n) { if (a[i] == x) flag = TRUE; k++; }
117

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

if (flag) printf("Tim thay phan tu!"); 4. Tinh chnh li on chng trnh sau: ... while ( i < n) { d = sqrt (a+b)*i; printf("gia tri %.2f", d); i++; } ... 5. Tinh chnh li on chng trnh sau: ... for(int i=0; i < strlen(strBuff); i++) { . } 6. Tinh chnh li on chng trnh sau: if (a==0 && b==0 && c==0) Function1(); else if (a==0 && b==0) Function2(); else if (a==0) Function3(); else Function4(); 7. Ti u li on chng trnh sau: char S1[MAX], S2[MAX]; . int i;
118

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

for (i=0;i<strlen(S1); i++) { if ( i<strlen(S1)/3 && S1[i] < M ) S2[i]= S1[i]+2; else if ( i < strlen(S1)/2 && S[i] < X) S2[i] = S1[i] +3; else S2[i]= S1[i]; } 8. Tinh chnh on chng trnh sau if (strcmp(s1, s2)==0) printf(equal); else if (strcmp(s1, s2) >0) printf(greater than); else printf(less than); 9. Tinh chnh li on chng trnh sau: x1 = (-b + sqrt(b*b-4*a*c))/(2*a); x2 = (-b - sqrt(b*b-4*a*c))/(2*a); 10. Vit chng trnh vi giao din ho minh ha cho bi ton thp Hanoi. Chng trnh th hin tng bc s chuyn cc a. Cho php nhp vo s n v thi gian di chuyn tng a. 11. Vit hm quy tm phn t ln nht v nh nht trong mng nguyn. 12. Vit hm quy tnh tng cc phn t trong mng cc s nguyn. 13. Vit chng trnh tm kim gi tr x trn ma trn vung cc s nguyn, dng quy tm kim. 14. Vit chng trnh chuyn i c s t h thp phn sang h k, yu cu dng hm quy gii.
119

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

15. Vit chng trnh thp Hanoi khng dng quy. 16. Vit chng trnh chuyn i s t c s thp phn sang c s k bt k, khng dng quy. 17. Vit chng trnh lit k chui nh phn n bit. Dng phng php sinh. 18. Cho tp cc s t nhin {1, 2, .., n}, vit chng trnh lit k tp con k phn t. Dng phng php sinh. 19. Vit chng trnh lit k hon v n phn t. Dng phng php sinh. 20. Nhp vo mt chui k t S, hy lit k cc hon v k t ca chui S. V d: chui S nhp vo l "abc" th kt qu l abc, acb, bac, bca, cab, cba. 21. Tng t nh bi 1, lit k t hp chp k k t ca chui S. 22. Mt hon v hon ton ca tp{1, 2, .., n} l dy hon v m tho mn x[i] i, i: 1 i n. Vit chng trnh nhp vo gi tr n, sau xut ra tt c hon v hon ton ca tp {1, 2, .., n}. 23. Vit chng trnh nhp vo mt s nguyn n, lit k tt c cch chia s t nhin n thnh tng cc s nh hn. V d: n = 4 Kt qu 3 2 2 1 1 2 1 1 1 1 1

24. Cho mt bn c tng qut c kch thc nxn v qun m. Vit chng trnh cho php lit k ra hnh trnh ca qun m t mt v tr (x ,y) i qua tt c cc cn li ca bn c, mi i qua mt ln.

120

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

Hnh: Cc nc i c th c ca qun m 25. Cho bn c vua nxn, hy vit chng trnh minh ho bn c v cch sp xp n qun hu sao cho cc qun hu khng th n ln nhau.

Hnh: Mt cch b tr cc qun Hu. 26. Nhp danh sch tn gm n ngi, lit k ra tt c cch chn k ngi trong s n ngi . V d: n =6: {"Nam", "Hung", "Viet", "Hoa", "Lan", "Tien"}, Kt qu: k = 2 {"Nam", "Hung"}, {"Nam", "Viet"}, {"Nam", "Hoa"}.

121

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

27. Nhp danh sch tn gm n ngi, xut ra cc cch xp n ngi vo trong mt bn trn. 28. Nhp vo danh sch n bn nam v n bn n, hy xut ra danh sch cch xp 2n bn vo mt bn trn trong c s xen ln gia nam v n. 29. Vit chng trnh lit k tt c hon v ca t HUTECH 30. Vit chng trnh lit k tt c hon v ch ci trong t "MISSISSIPPI" 31. Vit chng trnh m phng tng bc thc hin ca cc thut ton sp xp sau: a. Phng php chn b. Phng php ni bt c. Phng php chn d. Phng php i ch trc tip e. Phng php ShellSort f. Phng php phn on g. Phng php c s 32. Cho mt mng nguyn n >100 phn t, cc phn t pht sinh ngu nhin. Vit hm tm kim mt phn t trong mng. 33. Tng t nh bi tp bn trn, nhng hm tm kim theo dng nh phn. Sinh vin c th dng mt trong cc phng php sp xp sp xp li mng trc khi thc hin tm kim nh phn. 34. Vit chng trnh o thi gian thc hin ca cc thut ton sp xp bn trn. Chng trnh pht sinh ngu nhin b d liu test (mng s nguyn, c kch thc n >= 1000) , cho cc thut ton ln lt chy v ghi nhn li thi gian thc hin. 35. Vit chng trnh khng quy cho thut gii Quicksort, (p dng stack kh quy). 36. Nhp vo mt biu thc trung t, chuyn i thnh biu thc hu t v tnh gi tr ca biu thc. Lu : ton hng c th nhiu hn mt con s hay s thc. Sinh vin m rng vi cc ton t khc... V d: (20+5)*3+(10/5) => 20 5 + 3 * 10 5 / + Kt qu: 77 37. Vit chng trnh m phng hng i mua v xem phim. Thng tin ca vic ng k gm: h tn, a ch, tui v s gh...
122

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

38. Vit chng trnh m phng hng i mua v xe la. 39. Vit chng trnh sp xp theo c s (RadixSort), trong s dng cu trc d liu queue lu tm trong qu trnh sp xp. Hng dn s dng 10 hng i lu tm cc con s. Gm hng i 0 n 9, khi hng i 0 s ch lu nhng con s c s 0 cc bc phn hng n v, hng chc, hng trm tng ng...

123

Gio trnh K thut lp trnh 2

Khoa CNTT H KTCN

TI LIU THAM KHO


1. Brian W. Kernighan, Rob Pike, The Practice of Programming, Addison

Wesley, 1999.
2. Ellis Horowitz, Sartaj Sahni, Fundamentals of Data Structures, ebook, 1981. 3. R. Neapolitan, K. Naimipour , Foundations of Algorithms Using C++ Pseudocode, Jones and Bartlett Publishers , 2004. 4. L Hoi Bc, Nguyn Thanh Ngh, K nng lp trnh, NXB KHKT, 2005. 5. Trn Hong Th, Gio trnh K thut Lp trnh Nng cao, H Lt, 2002. 6. Dng Anh c, Trn Hnh Nhi, Nhp mn Cu trc d liu v thut ton,

H KHTN, 2000.
7. L Hu Lp, Nguyn Duy Phng, Gio trnh k thut lp trnh, NXB Bu

in, 2002.
8. L Minh Hong, Gii thut v lp trnh, NXB H S Phm HN, 1999- 2002

124

You might also like