Professional Documents
Culture Documents
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
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
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
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.
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
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
if(a>5){b=a;a++;}
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 }
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.
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
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
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;
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 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
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
} 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; }
14
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
Chng 1
K thut quy
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
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
Phn tch chng trnh thc hin quy: Gi s chng trnh c li gi hm nh sau
long l = Giaithua(5);
17
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
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
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.
20
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); }
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
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
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
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 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
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
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
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
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(1) = 1
Fibo(0) = 1
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
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!
29
} }
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)
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; }
D(X) ;
} 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
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
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
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
36
Chng 2
Bi ton lin quan t hp
37
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
// 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; }
+ 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
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
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
44
45
Gc
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>
46
47
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
48
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
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
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; }
51
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
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
( 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
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 {
55
2) 5) 3) 1) 2) 4) 5) 3)
4) 3) 5) 4) 5) 1) 2) 1)
56
57
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
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)
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
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 }
60
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
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
62
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
Tm kim
Tm kim nh phn
Tp DL bt k
Tp DL c sp
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
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 }
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;
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
66
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. 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.
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.
o o
V d: cho dy s a:
10
16
69
10
i=1
3
j=2
16
3
i=1
10
2
j=5
16
70
10
i=2
7
j=3
16
7
i=2
10
6
j=4
16
6
i=2
10
3
j=5
16
71
3
i=2
10
6
j=5
16
10
i=3
7
j=4
16
72
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
10
i=4
7
j=5
16
7
i=4
10
6
j=6
16
6
i=4
10
5
j=7
16
74
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
10
16
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
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
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
// 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 } } }
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
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.
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.
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:
16
10
left = 1
16
right = 8
10
16
80
4
left = 1
2
right = 4
10
16
10
16
5
left = 3
4
right = 4
10
16
10
16
7
left = 6
10
16
right = 8
10
16
81
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
1.3.7
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
83
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
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
// 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
Chng 2
Stack - Queue
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
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
88
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.
void InitStack(Stack &st): Hm khi int IsEmpty(Stack st): Kim int IsFull(Stack st): Kim
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
90
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
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
#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
94
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
// 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
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
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; }
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
100
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
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
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
c X l
( 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
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
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
Queue
u Queue (Front)
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
Front
Rear
Front
Rear
Front
Rear
Front
Rear
Front
Rear 107
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
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; }
110
} 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
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
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
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
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
115
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; }
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
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
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
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
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
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
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
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
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