Professional Documents
Culture Documents
Baigiangkythuatlaptrinh HVBCVT
Baigiangkythuatlaptrinh HVBCVT
BI GING
K THUT LP TRNH
Bin son :
Gii thiu mn hc
GII THIU MN HC
II. MC CH
Mn hc cung cp cho sinh vin k nng lp trnh trn cc cu trc d liu quan trng nh: stack, queue mlink, tree & graph cng vi phng php phn tch, thit k, nh gi thut ton. Sau khi hc xong mn hc ny, sinh vin c kh nng vit c chng trnh gii quyt nhng bi ton trong thc t.
Li ni u - Sinh vin phi c kin thc c bn v ton hc cao cp. - Thnh tho t nht mt ngn ng lp trnh. c bit trong cun sch ny s dng ngn ng lp trnh C m t thut ton, v vy sinh vin phi nm c ngn ng lp trnh C. 2. Cc ti liu cn c: Sch hng dn hc tp K thut lp trnh. Ths. Nguyn Duy Phng, Hc vin Cng ngh Bu chnh Vin thng, 2006. Nu cn sinh vin nn tham kho thm: - Gio trnh K thut lp trnh. Ts. L Hu Lp, Ths. Nguyn Duy Phng, Hc vin Cng ngh Bu chnh Vin thng, 2002. - Bi ging in t mn hc: K thut lp trnh ca Hc vin Cng ngh Bu chnh Vin thng. 3. t ra mc tiu, thi hn cho bn thn t ra cc mc tiu tm thi v thi hn cho bn thn v c gng thc hin chng Xy dng mc tiu trong chng trnh nghin cu. 4 Nghin cu v nm nhng kin thc ct li Sinh vin nn c qua sch hng dn hc tp trc khi nghin cu bi ging mn hc v cc ti liu tham kho khc. 5. Tham gia y cc bui hng dn hc tp Thng qua cc bui hng dn hc tp, ging vin s gip sinh vin nm c ni dung tng th ca mn hc v gii p thc mc, ng thi sinh vin cng c th trao i, tho lun vi nhng sinh vin khc v ni dung bi hc. 6. Ch ng lin h vi bn hc v ging vin Cch n gin nht l tham d cc din dn hc tp trn mng Internet, qua c th trao i trc tip cc vn vng mc vi ging vin hoc cc bn hc khc ang online. 7. T ghi chp li nhng chnh Vic ghi chp li nhng chnh l mt hot ng ti hin kin thc, kinh nghim cho thy n gip ch rt nhiu cho vic hnh thnh thi quen t hc v t duy nghin cu. 8. Hc i i vi hnh Hc l thuyt n u thc hnh lm bi tp v thc hnh ngay n hiu v nm chc l thuyt. Sinh vin cn ci t trn my tnh cc thut ton trong bi hc bng cc ngn ng lp trnh t c th hiu v nm chc hn t tng v ni dung ca thut ton. H Ni, ngy 20 thng 02 nm 2006 Ths. Nguyn Duy Phng
Ni dung chnh ca chng ny tp chung lm sng t nhng nguyn l c bn ca lp trnh cu trc. Nhng nguyn l ny c coi nh nn tng t tng ca phng php lp trnh cu trc c tch hp trong cc ngn ng lp trnh. Nm vng cc nguyn l ca lp trnh cu trc khng ch gip ngi hc c cch tip cn ngn ng lp trnh nhanh chng m con gip h cch t duy trong khi xy dng cc h thng ng dng. Cc nguyn l c bn c gii thiu trong chng ny bao gm: Nguyn l lnh - lnh c cu trc - cu trc d liu. Nguyn l ti thiu. Nguyn l a phng. Nguyn l an ton. Nguyn l nht qun. Nguyn l Top-Down . Nguyn l Botton-Up. Bn c c th tm c nhng chi tit su hn v rng hn trong ti liu [1] & [6].
Chng 1: i cng v k thut lp trnh cu trc ging nh nhng hot ng ngh thut nhum mu sc c nhn hn l khoa hc. Mt s ngi nm c mt vi ngn ng lp trnh, cng mt s mo vt tn dng cu hnh vt l c th ca h thng my tnh, to nn mt s sn phm l ca phn mm c coi l mt chuyn gia nm bt c nhng b n ca ngh thut lp trnh. Cc h thng my tnh trong giai on ny c cu hnh yu, b nh nh, tc cc thit b vo ra thp lm chm qu trnh np v thc hin chng trnh. Chng trnh c xy dng bng k thut lp trnh tuyn tnh m ni bt nht l ngn ng lp trnh Assembler v Fortran. Vi phng php lp trnh tuyn tnh, lp trnh vin ch c php th hin chng trnh ca mnh trn hai cu trc lnh, l cu trc lnh tun t (sequential) v nhy khng iu kin (goto). H thng th vin vo ra ngho nn lm cho vic lp trnh tr nn kh khn, chi ph cho cc sn phm phn mm qu ln, tin cy ca cc sn phm phn mm khng cao dn ti hng lot cc d n tin hc b tht bi, c bit l cc h thng tin hc c tm c ln. Nm 1973, Hoare khng nh, nguyn nhn tht bi m ngi M gp phi khi phng v tinh nhn to v pha sao V n (Sao Kim) l do li ca chng trnh iu khin vit bng Fortran. Thay v vit: DO 50 I = 12, 523 (Thc hin s 50 vi I l 12, 13, ..., 523) Lp trnh vin (hoc thao tc vin c ba) vit thnh: DO 50 I = 12.523 (Du phy thay bng du chm) Gp cu lnh ny, chng trnh dch ca Fortran hiu l gn gi tr thc 12.523 cho bin DO 50 I lm cho kt qu chng trnh sai. gii quyt nhng vng mc trong k thut lp trnh, cc nh tin hc l thuyt i su vo nghin cu tm hiu bn cht ca ngn ng, thut ton v hot ng lp trnh, nng ni dung ca k thut lp trnh ln thnh cc nguyn l khoa hc ngy nay. Kt qu ni bt nht trong giai on ny l Knuth xut bn b 3 tp sch mang tn Ngh thut lp trnh gii thiu ht sc t m c s l thuyt m bo ton hc v cc thut ton c bn x l d liu na s, sp xp v tm kim. Nm 1968, Dijkstra cng b l th V s nguy hi ca ton t goto. Trong cng trnh ny, Dijkstra khng nh, c mt s li do goto gy nn khng th xc nh c im bt u ca li. Dijkstra cn khng nh thm: Tay ngh ca mt lp trnh vin t l nghch vi s lng ton t goto m anh ta s dng trong chng trnh, ng thi ku gi hu b trit ton t goto trong mi ngn ng lp trnh ngoi tr ngn ng lp trnh bc thp. Dijkstra cn a ra khng nh, ng thi ca chng trnh c th c nh gi tng minh qua cc cu trc lp, r nhnh, gi qui l c s ca lp trnh cu trc ngy nay. Nhng kt qu c Dijikstra cng b to nn mt cuc cch mng trong k thut lp trnh, Knuth lit k mt s trng hp c li ca goto nh vng lp kt thc gia chng, bt li . . ., Dijkstra, Hoare, Knuth tip tc pht trin t tng coi chng trnh my tnh cng vi lp trnh vin l i tng nghin cu ca k thut lp trnh v phng php 4
Chng 1: i cng v k thut lp trnh cu trc lm ch s phc tp ca cc hot ng lp trnh. Nm 1969, Hoare pht biu cc tin phc v cho vic chng minh tnh ng n ca chng trnh, pht hin tnh bt bin ca vng lp bng cch coi chng trnh va l bn m ho thut ton ng thi l bn chng minh tnh ng n ca chng trnh. Sau Dahl, Hoare, Dijiksta pht trin thnh ngn ng lp trnh cu trc. trin khai cc nguyn l lp trnh cu trc, L. Wirth thit k v ci t ngn ng ALGOL W l mt bin th ca ALGOL 60. Sau ny, L. Wirth tip tc hon thin tr thnh ngn ng lp trnh Pascal. y l ngn ng lp trnh gin d, sng sa v c php, d minh ha nhng vn phc tp ca lp trnh hin i v c coi l mt chun mc trong ging dy lp trnh. Nm 1978, Brian Barninghan cng Denit Ritche thit k ngn ng lp trnh C vi ti thiu cc cu trc lnh v hm kh ph hp vi t duy v tm l ca ca ngi lp trnh. ng thi, hai tc gi pht hnh phin bn h iu hnh UNIX vit ch yu bng ngn ng C, khng nh thm uy th ca C trong lp trnh h thng.
cu lnh GOTO. A;
B;
Cu trc lp vi iu kin trc While (E) A; E S A Trong khi biu thc E cn c gi tr ng th thc hin A;
A; while (E);
E2
Chng 1: i cng v k thut lp trnh cu trc 1.2.2. Lnh c cu trc Lnh c cu trc l lnh cho php cha cc cu trc iu khin trong n. Khi tm hiu mt cu trc iu khin cn xc nh r v tr c php t mt cu trc iu khin trong n, cng nh n l mt phn ca cu trc iu khin no. iu ny tng nh rt tm thng nhng c ngha ht sc quan trng trong khi xy dng v kim tra li c th xy ra trong chng trnh. Nguyn tc vit chng trnh theo cu trc: Cu trc con phi c vit lt trong cu trc cha, im vo v im ra ca mi cu trc phi nm trn cng mt hng dc. V d sau s minh ha cho nguyn tc vit chng trnh:
if (E) while (E1) A; else do B; while(E2);
Trong v d trn, while (E1) A; l cu trc con nm trong thn ca cu trc cha l if (E) ; cn do B while(E2); l cu trc con trong thn ca else. Do vy, cu lnh while(E1); do . . . while(E2) c cng cp vi nhau nn n phi nm trn cng mt ct, tng t nh vy vi A, B v if vi else. 1.2.3. Cu trc d liu Cc ngn ng lp trnh cu trc ni chung u ging nhau v cu trc lnh v cu trc d liu. im khc nhau duy nht gia cc ngn ng lp trnh cu trc l phng php t tn, cch khai bo, c php cu lnh v tp cc php ton c php thc hin trn cc cu trc d liu c th. Nm bt c nguyn tc ny, chng ta s d dng chuyn i cch th hin chng trnh t ngn ng lp trnh ny sang ngn ng lp trnh khc mt cnh nhanh chng m khng tn qu nhiu thi gian cho vic hc tp ngn ng lp trnh. Thng thng, cc cu trc d liu c phn thnh hai loi: cu trc d liu c kiu c bn (Base type) v cu trc d liu c kiu do ngi dng nh ngha (User type) hay cn gi l kiu d liu c cu trc. Kiu d liu c bn bao gm: Kiu k t (char), kiu s nguyn c du (signed int), kiu s nguyn khng du (unsigned int), kiu s nguyn di c du (signed long), kiu s nguyn di khng du (unsigned long ), kiu s thc (float) v kiu s thc c chnh xc gp i (double). Kiu d liu do ngi dng nh ngha bao gm kiu xu k t (string), kiu mng (array), kiu tp hp (union), kiu cu trc (struct), kiu file, kiu con tr (pointer) v cc kiu d liu c nh ngha mi hon ton nh kiu danh sch mc ni (link list), kiu cy (tree) . . . Kch c ca kiu c bn ng ngha vi min xc nh ca kiu vi biu din nh phn ca n, v ph thuc vo tng h thng my tnh c th. xc nh kch c ca kiu nn dng ton t sizeof( type). Chng trnh sau s lit k kch c ca cc kiu c bn. 7
Chng 1: i cng v k thut lp trnh cu trc V d 1.1. Kim tra kch c ca kiu.
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <io.h> void main(void) { printf(\n Kch c kiu k t:%d, sizeof(char)); printf(\n Kch c kiu k t khng du:%d, sizeof(unsigned char)); printf(\n Kch c kiu s nguyn khng du:%d, sizeof(unsigned int)); printf(\n Kch c kiu s nguyn c du:%d, sizeof(signed int)); printf(\n Kch c kiu s nguyn di khng du:%d, sizeof(unsigned long )); printf(\n Kch c kiu s nguyn di c du:%d, sizeof(signed long )); printf(\n Kch c kiu s thc c chnh xc n:%d, sizeof(float )); printf(\n Kch c kiu s thc c chnh xc kp:%d, sizeof(double )); getch(); }
Kch c ca cc kiu d liu do ngi dng nh ngha l tng kch c ca mi kiu thnh vin trong n. Chng ta cng vn dng ton t sizeof(tn kiu) xc nh ln tnh theo byte ca cc kiu d liu ny. Mt im c bit ch trong khi lp trnh trn cc cu trc d liu l cu trc d liu no th phi km theo php ton , v mt bin c gi l thuc kiu d liu no nu nh n nhn mt gi tr t min xc nh ca kiu v cc php ton trn kiu d liu .
Chng 1: i cng v k thut lp trnh cu trc a-=n a%=n a/=n a*=n a = a - n; // gim gi tr bin nguyn a n n v); a = a%n; // ly gi tr bin a modul vi n; a=a/n;// ly gi tr bin a chia cho n; a = a*n; // ly gi tr bin a nhn vi n;
Tp cc php ton so snh: >, <, >=, <=, ==, != ( ln hn, nh hn, ln hn hoc bng, nh hn hoc bng, ng bng, khc). Qui tc vit c th hin nh sau: if ( a>b) { . . } // nu a ln hn b if ( a<b) { . . } // nu a nh hn b if ( a>=b) { . . } // nu a ln hn hoc bng b if ( a<=b) { . . } // nu a nh hn hoc bng b if ( a==b) { . . } // nu a ng bng b if ( a!=b) { . . } // nu a khc b Tp cc php ton logic: &&, ||, ! (v, hoc, ph nh) &&: Php v logic ch cho gi tr ng khi hai biu thc tham gia u c gi tr ng (gi tr ng ca mt biu thc trong C c hiu l biu thc c gi tr khc 0). ||: Php hoc logic ch cho gi tr sai khi c hai biu thc tham gia u c gi tr sai. !: Php ph nh cho gi tr ng nu biu thc c gi tr sai v ngc li cho gi tr sai khi biu thc c gi tr ng. Ng ngha ca cc php ton c minh ha thng qua cc cu lnh sau: int a =3, b =5; if ( (a !=0) && (b!=0) ) // nu a khc 0 v b khc 0 if ((a!=0) || (b!=0)) if ( !a ) if (a==b) // nu a khc 0 hoc b khc 0 // ph nh a khc 0 // nu a ng bng b
Cc ton t thao tc bt (khng s dng cho float v double) & | ^ << >> ~ : Php hi cc bt. : Php tuyn cc bt. : Php tuyn cc bt c loi tr. : Php dch tri (dch sang tri n bt gi tr 0) : Php dch phi (dch sang phi n bt c gi tr 0) : Php ly phn b.
Chng 1: i cng v k thut lp trnh cu trc V d 1.2: Vit chng trnh kim tra cc ton t thao tc bt.
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <io.h> void main(void){ unsigned int a=3, b=5, c; clrscr(); c = a & b; printf(\n c = a & b=%d,c); c = a | b; printf(\n c = a | b=%d,c); c = a ^ b; printf(\n c = a ^ b=%d,c); c = ~a; printf(\n c = ~a =%d,c); c = a << b; printf(\n c = a << b=%d,c); c = a >>b; printf(\n c = a >> b=%d,c); getch(); }
Ton t chuyn i kiu: Ta c th dng ton t chuyn i kiu nhn c kt qu tnh ton nh mong mun. Qui tc chuyn i kiu c thc hin theo qui tc: (kiu) bin. V d 1.3: Tnh gi tr php chia hai s nguyn a v b.
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <io.h> void main(voi)( int a=3, b=5; float c; c= (float) a / (float) b; printf(\n thng c = a / b =%6.2f, c); getch(); }
Th t u tin cc php ton : Khi vit mt biu thc, chng ta cn lu ti th t u tin tnh ton cc php ton, cc bng tng hp sau y phn nh trt t u tin tnh ton ca cc php ton s hc v php ton so snh. Bng tng hp th t u tin tnh ton cc php ton s hc v so snh
10
Chng 1: i cng v k thut lp trnh cu trc +, >>, << <, <=, > , >=, == != & ^ | && || ?: =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>= 1.3.2. Tp cc lnh vo ra c bn Nhp d liu t bn phm: scanf(format_string, . . ., ¶meter . . .); Nhp d liu t tp: fscanf( file_pointer,format_string, . . ., ¶meter, . . .); Nhn mt k t t bn phm: getch(); getchar(); Nhn mt k t t file: fgetc(file_pointer, character_name); Nhp mt string t bn phm: gets(string_name); Nhn mt string t file text : fgets(string_name, number_character, file_pointer); Xut d liu ra mn hnh: printf(format_string . . ., parameter . . .); Xut d liu ra file : fprintf(file_pointer, format_string . . ., parameter. . .); Xut mt k t ra mn hnh: putch(character_name); Xut mt k t ra file: fputc(file_pointer, character_name); Xut mt string ra mn hnh: puts(const_string_name); Xut mt string ra file: fputs(file_pointer, const_string_name); 1.3.3. Thao tc trn cc kiu d liu c cu trc Tp thao tc trn string: char *strchr(const char *s, int c) : tm k t c u tin xut hin trong xu s; char *stpcpy(char *dest, const char *src) : copy xu scr vo dest; L -> R L -> R L -> R L -> R L -> R L -> R L -> R L -> R L -> R R -> L R -> L
11
Chng 1: i cng v k thut lp trnh cu trc int strcmp(const char *s1, const char *s2) : so snh hai xu s1 v s2 theo th t t in, nu s1 < s2 th hm tr li gi tr nh hn 0. Nu s1>s2 hm tr li gi tr dng. Nu s1==s2 hm tr li gi tr 0. char *strcat(char *dest, const char *src) : thm xu scr vo sau xu dest. char *strlwr(char *s) : chuyn xu s t k t in hoa thnh k t in thng. char *strupr(char *s): chuyn xu s t k t thng hoa thnh k t in hoa. char *strrev(char *s): o ngc xu s. char *strstr(const char *s1, const char *s2): tm v tr u tin ca xu s2 trong xu s1. int strlen(char *s): cho di ca xu k t s. Tp thao tc trn con tr: Thao tc ly a ch ca bin: & parameter_name; Thao tc ly ni dung bin (bin c kiu c bn): *pointer_name; Thao tc tr ti phn t tip theo: ++pointer_name; Thao tc tr ti phn t th n k t v tr hin ti: pointer_name = pointer_name +n; Thao tc tr ti phn t sau con tr k t v tr hin ti: --pointer_name; Thao tc tr ti phn t sau n phn t k t v tr hin ti: Pointer_name = pointer_name - n; Thao tc cp pht b nh cho con tr: void *malloc(size_t size); void *calloc(size_t nitems, size_t size); Thao tc cp pht li b nh cho con tr : void *realloc(void *block, size_t size); Thao tc gii phng b nh cho con tr: void free(void *block); Tp thao tc trn cu trc: nh ngha cu trc: struct struct_name{ type_1 parameter_name_1; type_2 parameter_name_2; ...................... type_k parameter_name_k; } struct_parameter_name; Php truy nhp ti thnh phn cu trc:
12
Chng 1: i cng v k thut lp trnh cu trc struct_parameter_name.parameter_name. Php gn hai cu trc cng kiu: struct_parameter_name1 = struct_parameter_name2; Php tham tr ti thnh phn ca con tr cu trc: pointer_struct_parameter_name -> struct_parameter_name. Tp thao tc trn file: Khai bo con tr file: FILE * file_pointer; Thao tc m file theo mode: FILE *fopen(const char *filename,const char *mode); Thao tc ng file: int fclose(FILE *stream); Thao tc c tng dng trong file: char *fgets(char *s, int n, FILE *stream); Thao tc c tng khi trong file: size_t fread(void *ptr, size_t size,size_t n, FILE *stream); Thao tc ghi tng dng vo file: int fputs(const char *s, FILE *stream); Thao tc ghi tng khi vo file: size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream); Thao tc kim tra s tn ti ca file: int access(const char *filename, int amode); Thao tc i tn file: int rename(const char *oldname,const char *newname); Thao tc loi b file: int unlink(const char *filename);
Kt qu thc hin chng trnh: Kt qu thc hin trong th tc a = 5 b=3 Kt qu sau khi thc hin th tc a = 1 b =8 Trong v d trn a, b l hai bin ton cc, hai bin a, b trong th tc Swap l hai bin cc b. Cc thao tc trong th tc Swap gn cho a gi tr 3 v b gi tr 5 sau thc hin i gi tr ca a =5 v b =3 l cng vic x l ni b ca th tc m khng lm thay i gi tr ca bin ton cc ca a, b sau thi thc hin xong th tc Swap. Do vy, kt qu sau khi thc hin Swap a = 1, b =8; iu chng t trong th tc Swap cha bao gi s dng ti hai bin ton cc a v b. Tuy nhin, trong v d sau, th tc Swap li lm thay i gi tr ca bin ton cc a v b v n thao tc trc tip trn bin ton cc. V d 1.5. i gi tr ca hai bin a v b
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <io.h> int a, b; // khai bo a, b l hai bin ton cc. void Swap(void) { int temp; // khai bo a, b l hai bin a phng a= 3; b=5; // gn gi tr cho a v b temp=a; a=b; b=temp;// i gi tr ca a v b printf(\n Kt qu thc hin trong th tc a=%5d b=%5d:,a,b); } void main(void) {
14
Kt qu thc hin chng trnh: Kt qu thc hin trong th tc a = 8 b=1 Kt qu sau khi thc hin th tc a = 1 b =8
15
Chng 1: i cng v k thut lp trnh cu trc th ly modul ca hai s thc hoc thc hin cc thao tc dch chuyn bt trn n, v nhng thao tc khng nm trong nh ngha ca kiu. iu tng t cng xy ra vi cc string. Trong Pascal, php ton so snh hai string hoc gn trc tip hai Record cng kiu vi nhau l c php, v d : Str1>Str2, Str1 := Str2; Nhng trong C th cc php ton trn li khng c nh ngha, nu mun thc hin n, chng ta ch c cch nh ngha li hoc thc hin n thng qua cc li gi hm.
16
Chng 1: i cng v k thut lp trnh cu trc Loi li cui cng m cc compiler khng th pht hin ni l li do chnh lp trnh vin gy nn trong khi thit k chng trnh v x l d liu. Nhng li ny khng c compiler thng bo m n phi tr gi bng qu trnh t test hoc chng minh c tnh ng n ca chng trnh. Li c th nm chnh thit k, hoc li do khng lng trc c tnh cht ca mi loi thng tin vo. V d sau minh ha cho li thng xy ra thuc loi ny. V d 1.6. Tnh tng hai a thc A bc n, a thc B bc m.
#include <stdio.h> #include <conio.h> #include <stdlib.h> #define MAX 100 typedef float dathuc[MAX]; void In(dathuc A, int n, char c){ int i; printf("\n Da thuc %c:", c); for(i=0;i<n; i++) printf("%6.2f", A[i]); } void Init( dathuc A, int *n, dathuc B, int *m){ int i;float temp; printf("\n Nhap n="); scanf("%d", n);*n=*n+1; printf("\n Nhap m="); scanf("%d",m); *m=*m+1; printf("\n Nhap he so da thuc A:"); for(i=0; i<*n;i++){ printf("\n A[%d]=", i); scanf("%f", &temp); A[i]=temp; } printf("\n Nhap he so da thuc B:"); for(i=0; i<*m;i++){ printf("\n B[%d]=",i); scanf("%f", &temp); B[i] = temp; } In(A,*n,'A'); In(B,*m,'B'); } void Tong(dathuc A, int n, dathuc B, int m, dathuc C){ int i, k; if (n>= m ){ k =n; for(i=0; i<m; i++) C[i] = A[i]+B[i]; for (i=m; i<n; i++)
17
Trong v d trn, chng ta s dng nh ngha MAX =100 gii quyt bi ton. MAX c hiu l bc ca a thc ln nht m chng ta cn x l. Nh vy, bn thn vic nh ngha MAX hn ch ti phm vi bi ton, hn ch cng c th xut pht t thit k. Do vy, nu ngi s dng nhp n>MAX th chng trnh s gp li. Nu chng ta khc phc bng cch nh ngha BAC ln th trong trng hp x l cc a thc c bc n nh s gy nn hin tng lng ph b nh, v trong nhiu trng hp khng b nh nh ngha a thc. Gii php khc phc cc li loi ny l chng ta s dng con tr thay cho cc hng, k thut ny s c tho lun k trong Chng 2.
Chng 1: i cng v k thut lp trnh cu trc tc phn r h thng theo tng chc nng ph cho ti khi no nhn c mc cc n th ( UNIT, Function, Procedure), khi chng ta tin hnh ci t h thng. Chng ta s lm r hn tng mc ca qu trnh Top-Down thng qua bi ton sau: Bi ton: Cho hai s nguyn c biu din nh phn l a=(a1, a2, . . ., an), b = (b1, b2, .., bn); ai, bi =0, 1, i=1, 2, . . .n. Hy xy dng tp cc thao tc trn hai s nguyn . Mc tng quan (level 0): Hnh dung ton b nhng thao tc trn hai s nguyn a=(a1, a2, . . ., an), b=(b1,b2,..,bn) vi y nhng chc nng chnh ca n. Gi s nhng thao tc bao gm: F1- Chuyn i a, b thnh cc s nh phn; F2- Tnh tng hai s nguyn: a + b; F3- Tnh hiu hai s nguyn: a - b; F4 Tnh tch hai s nguyn: a *b; F5- Thng hai s nguyn : a/b; F6- Phn d hai s nguyn: a % b; F7- c s chung ln nht ca hai s nguyn. Mc 1. Mc cc chc nng chnh: mi chc nng cn m t y thng tin vo (Input), thng tin ra (Output), khun dng (Format) v cc hnh ng (Actions). Chc nng F1: Chuyn i a, b thnh cc s h nh phn
Input Output Format Actions { Q = n; k=0; While ( Q 0 ) { ak = q mod b; q = q div b; k = k +1; } < Khai trin c s b ca a l (ak-1, ak-2, . ., a1, a0) >; } : : : a : integer; a=(a1, a2, . . ., an)b; (*khai trin c s b bt k*) Binary(a);
19
20
21
rng, sau khi phn r bi ton mc 1, chng ta ch cn xy dng hai php ton cng v php tnh nhn cc s nh phn ca a, b. V hiu hai s a v b chnh l tng s ca (a,-b). Tng t nh vy, tch hai s a v b c biu din bng tng ca mt s ln php nhn mt bt nh phn ca vi a. Php chia v ly phn d hai s a v b chnh l php tr nhiu ln s a. Php tm USCLN cng tng t nh vy. i vi cc h thng ln, qu trnh cn c m t tip tc cho ti khi nhn c mc n v chng trnh. Trong v d n gin ny, mc n v chng trnh xut hin ngay ti mc 1 nn chng ta khng cn phn r tip na m dng li ci t h thng.
22
23
24
25
Mt ngn ng lp trnh bt k u da trn tp cc cu trc lnh iu khin (tun t, tuyn chn & lp), cc cu trc d liu (d liu kiu c bn & d liu c cu trc) cng vi cc php ton trn n. Khi mi bt u hc lp trnh, hy lp trnh t tp ti thiu cc cng c m ngn ng lp trnh trang b (Nguyn l ti thiu). Khi no dng bin a phng, khi no dng bin ton cc l ni dung chnh ca nguyn l a phng. Nm vng nguyn l ny gip cho ta s dng cch truyn tham bin v cch truyn tham tr cho hm. D liu kiu no th php ton l ni dung chnh ca nguyn l nht qun. Mi li d nh nht cng phi lng trc mi mc ci t ca chng trnh. Cch phn r mt vn ln thnh nhng vn nh hn l ni dung chnh ca nguyn l Top-Down. Cch ci t mt vn c thc hin t mc n v chng trnh (hm, th tc) n mc lp ghp cc n v chng trnh thnh h thng hon thin l ni dung chnh ca nguyn l Botton-Up.
26
BI TP CHNG 1
Bi 1. Tm cc nghim nguyn dng ca h phng trnh: X + Y + Z = 100 5X + 3Y + Z/3 = 100 Bi 2. Cho s t nhin n. Hy tm tt c cc b 3 cc s t nhin a, b, c sao cho a2+b2 = c2 trong a<= b< =c <=n . Bi 3. Cho s t nhin n. Hy tm cc s Fibonaci nh hn n. Trong cc s Fibonai c nh ngha nh sau: U0 = 0; U1 = 1; Uk = Uk-1 + Uk-2 ; k=1, 2, . . . Bi 4. Chng minh rng, vi mi s nguyn dng N, 0<N<=39 th N2 + N + 41 l mt s nguyn t. iu khng nh trn khng cn ng vi N>39. Bi 5. Cho s t nhin n. Hy lit k tt c cc s nguyn t nh hn n. Bi 6. Cho s t nhin n. Hy tm tt c cc s nguyn t nh hn n bng phng php sng Estheven. Bi 7. Cho s t nhin n. Dng phng php sng Estheven tm 4 s nguyn t b hn n nm trong cng bc chc ( v d : 11, 13, 15, 17). Bi 8. Cho s t nhin n. Hy lit k tt c cc cp s p, 4p+1 u l s nguyn t nh hn n. Trong p cng l s nguyn t nh hn n. Bi 9. Hy lit k tt c cc s nguyn t c 5 ch s sao cho tng s cc ch s trong s nguyn t ng bng S cho trc 1S45. Bi 10. Mt s c gi l s Mersen nu n l s nguyn t c biu din di dng 2P 1 trong P cng l mt s nguyn t. Cho s t nhin n, tm tt c cc s Mersen nh hn n. Bi 11. Cho s t nhin n. Hy phn tch n thnh tch cc tha s nguyn t. V d 12 = 2*2*3. Bi 12. Hai s t nhin a, b c gi l hu ngh nu tng cc c s thc s ca a (k c 1) bng b v ngc li. Cho hai s t nhin P , Q. Hy tm tt c cc cp s hu ngh trong khong [P, Q]. Bi 13. Cho s t nhin n. Hy tm tt c cc s 1, 2, .., n sao cho cc s trng vi phn cui bnh phng chnh n (V d : 62 = 36, 252 = 625). Bi 14. Mt s t nhin c gi l s amstrong nu tng cc ly tha bc n ca cc ch s ca n bng chnh s . Trong n l s cc ch s ( V d 153 = 13 + 23 + 33 ). Hy tm tt c cc s amstrong gm 2, 3, 4 ch s.
27
Chng 1: i cng v k thut lp trnh cu trc Bi 15. Mt s t nhin l Palindrom nu cc ch s ca n vit theo th t ngc li th s to thnh l chnh s ( V d: 4884, 393). Hy tm: Tt c cc s t nhin nh hn 100 m khi bnh phng ln th cho mt Palindrom. Tt c cc s Palindrom b hn 100 m khi bnh phng ln chng cho mt Palindrom. Bi 16. ghi nhn cho nhng chic gh trong mt ging ng, ngi ta s dng 4 k t, k t u tin l mt ch ci in hoa, ba k t tip theo l mt s nguyn dng khng vt qu 100. Hi bng cch c nhiu nht bao nhiu chic gh c nh nhn v l nhng nhn no. Bi 17. D n nh s in thoi ca Bang Florida c qui nh nh sau. Trong d n nh s in thoi gm 10 ch s c chia thnh nhm: m vng gm 3 ch s, nhm m chi nhnh gm 3 ch s v nhm m my gm 4 ch s. V nhng nguyn nhn k thut nn c mt s hn ch i vi cc ch s, gi s X biu th cc ch s nhn gi tr t 0 . .9, Y l cc ch s nhn gi tr hoc 0 hoc l 1, N l cc ch s nhn gi tr t 2 . .9. Hi vi cch nh s dng NYX NNX XXXX v NXX NXX XXXX s c bao nhiu s in thoi khc nhau. In ra mn hnh v ghi li vo File DT.TXT s in thoi ca vng c m 200, m chi nhnh 250 v s in thoi bt u l s 9. Mi s in thoi c ghi trn mt dng, mi dng c ghi lm 3 phn (M vng, m chi nhnh, s in thoi) mi phn phn bit vi nhau bi mt hoc v du trng. Bi 18. Cho File d liu TEXT.TXT c t chc thnh tng dng, di ti a ca mi dng l 80 k t. K thut m ho tuyn tnh l phng php bin i m ca cc k t t [a . .z], [A . .Z] thnh mt k t mi m m ca n cng thm vi mt hng s k cho trc. Qu trnh gii m c thc hin ngc li. Hy vit chng trnh m t phng php m ho v gii m tuyn tnh File d liu TEXT.TXT. Qu trnh m ho c ghi li trong File MAHOA.TXT, qu trnh gii m ghi li trong File GIAIMA.TXT. Bi 19. Cho File d liu TEXT.TXT c t chc thnh tng dng, di ti a ca mi dng l 80 k t. K thut m ho chn l l phng php bin i m ca cc k t [a . .z], [A . . Z]. Trong , nu k t c s cc bt 1 l l ta b xung thm mt bt c gi tr mt vo bt s 7 ca k t k t tr thnh chn. Qu trnh gii m c thc hin ngc li. Hy vit chng trnh m t k thut m ho chn l File d liu TEXT.TXT. Qu trnh m ho c ghi li trong File MAHOA.TXT, qu trnh gii m ghi li trong File GIAIMA.TXT.
28
Duyt ton b l phng php ph dng nht trong khi gii quyt mt bi ton trn my tnh. Cc k thut duyt cng rt phong ph a dng nu nh ta chng ta li dng c nhng mo mc khng mang tnh tng qut ho nhng hn ch c khng gian tm kim li gii bi ton. qui c s dng nhiu trong cc k thut duyt. S dng qui thng cho ta mt li gii tng i ngn gn, d hiu nhng n cha trong n nhiu b n kh lng. Tuy nhin, n vn c coi l mt mu hnh vt cn tt c cc kh nng ca bi ton. Cc k thut qui c cp y bao gm: Cc nh ngha bng qui, cc cu trc d liu nh ngha bng qui & gii thut qui. Thut ton sinh k tip gii quyt bi ton duyt. Thut ton quay lui giiquyt bi ton duyt. Thut ton nhnh cn giiquyt bi ton duyt. Bn c c th tm thy nhiu hn nhng ng dng v ci t c th phng php duyt trong ti liu [1].
Chng 2: Duyt v qui Xut pht t S(1) thay th ngc li chng ta xc nh S(n): S(1) = 1 S(2) = S(1) + 2 S(3) = S(2) + 3 ............ S(n) = S(n - 1) + n V d 2.2. nh ngha hm bng qui Hm f(n) = n! D thy f(0) = 1. V (n+1) ! = 1 . 2.3 . . . n(n+1) = n! (n+1), nn ta c: f(n+1) = ( n+1) . f(n) vi mi n nguyn dng. V d 2.3. Tp hp nh ngha bng qui nh ngha qui tp cc xu : Gi s * l tp cc xu trn b ch ci . Khi * c nh ngha bng qui nh sau: *, trong l xu rng wx * nu w * v x V d 2.4. Cu trc t tr c nh ngha bng qui
struct node { int infor; struct node *left; struct node *right; };
30
Thut ton 2: Thut ton qui tnh c s chung ln nht ca hai s nguyn dng a v b.
int USCLN( int a, int b){ if (a == 0) return(b); return(USCLN( b % a, a)); }
31
Di y l mt v d in hnh minh ha cho thut ton sinh k tip. Bi ton lit k cc tp con ca tp n phn t Mt tp hp hu hn gm n phn t u c th biu din tng ng vi tp cc s t nhin 1, 2, . . . n. Bi ton c 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 hp X. lit k c tt c cc tp con ca X, ta lm tng ng mi tp Y X vi mt xu nh phn c di n l B = { B1, B2, . . , Bn } sao cho Bi = 0 nu Xi Y v Bi = 1 nu Xi Y; nh vy, php lit k tt c cc tp con ca mt tp hp n phn t tng ng vi php lit k tt c cc xu nh phn c di n. S cc xu nh phn c di n l 2n. By gi ta i xc nh th t cc xu nh phn v phng php sinh k tip. Nu xem cc xu nh phn b = { b1, b2, . . , bn } nh l biu din ca mt s nguyn dng p(b). Khi th t hin nhin nht l th t t nhin c xc nh nh sau: Ta ni xu nh phn b = { b1, b2, . . , bn } c th t trc xu nh phn b = { b1, b2, . . , bn } v k hiu l b<b nu p(b) < p(b). V d vi n= 4: chng ta c 24 = 16 xu nh phn (tng ng vi 16 tp con ca tp gm n phn t) c lit k theo th t t in nh sau: b 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 32 p(b) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Chng 2: Duyt v qui T y ta xc nh c xu nh phn u tin l 00. .00 v xu nh phn cui cng l 11..11. Qu trnh lit k dng khi ta c xu nh phn 1111. Xu nh phn k tip l biu din nh phn ca gi tr xu nh phn trc cng thm 1 n v. T ta nhn c qui tc sinh k tip nh sau: Tm ch s i u tin theo th t i = n, n-1, . ., 1 sao cho bi = 0. Gn li bi = 1 v bj = 0 vi tt c j>i. Dy nh phn thu c l dy cn tm Thut ton sinh xu nh phn k tip
void Next_Bit_String( int *B, int n ){ i = n; while (bi ==1 ) { bi = 0; i = i-1; } bi = 1; }
} void Result(int *B, int n){ int i;count++; printf("\n Xau nhi phan thu %d:",count); for(i=1; i<=n;i++) printf("%3d", B[i]); } void Next_Bits_String(int *B, int n){ int i = n; while(i>0 && B[i]){ B[i]=0; i--;
33
34
Chng 2: Duyt v qui im quan trng nht ca thut ton l phi ghi nh li mi bc i qua, nhng kh nng no c th trnh s trng lp. nh li nhng bc duyt trc , chng trnh cn phi c t chc theo c ch ngn xp (Last in first out). V vy, thut ton quay lui rt ph hp vi nhng php gi qui. Thut ton quay lui xc nh thnh phn th i c th c m t bng th tc Try(i) nh sau:
void Try( int i ) { int j; if ( <Chp nhn j >) { <Xc nh xi theo j> if (i==n) <Ghi nhn cu hnh>; else } } } Try(i+1); for ( j = 1; j < ni; j ++) {
C th m t qu trnh tm kim li gii theo thut ton quay lui bng cy tm kim li gii sau: Gc
Kh nng chn x1
V d: Bi ton Xp Hu. Lit k tt c cc cch xp n qun hu trn bn c n x n sao cho chng khng n c nhau.
35
Chng 2: Duyt v qui Bn c c n hng c nh s t 0 n n-1, n ct c nh s t 0 n n-1; Bn c c n*2 -1 ng cho xui c nh s t 0 n 2*n -2, 2 *n -1 ng cho ngc c nh s t 2*n -2. V d: vi bn c 8 x 8, chng ta c 8 hng c nh s t 0 n 7, 8 ct c nh s t 0 n 7, 15 ng cho xui, 15 ng cho ngc c nh s t 0 . .15. V trn mi hng ch xp c ng mt qun hu, nn chng ta ch cn quan tm n qun hu c xp ct no. T dn n vic xc nh b n thnh phn x1, x2, . ., xn, trong xi = j c hiu l qun hu ti dng i xp vo ct th j. Gi tr ca i c nhn t 0 n n-1; gi tr ca j cng c nhn t 0 n n-1, nhng tho mn iu kin (i,j) cha b qun hu khc chiu n theo ct, ng cho xui, ng cho ngc. Vic kim sot theo hng ngang l khng cn thit v trn mi hng ch xp ng mt qun hu. Vic kim sot theo ct c ghi nhn nh dy bin logic aj vi qui c aj=1 nu ct j cn trng, ct aj=0 nu ct j khng cn trng. ghi nhn ng cho xui v ng cho ngc c chiu ti (i,j) hay khng, ta s dng phng trnh i + j = const v i - j = const, ng cho th nht c ghi nhn bi dy bin bj, ng cho th 2 c ghi nhn bi dy bin cj vi qui c nu ng cho no cn trng th gi tr tng ng ca n l 1 ngc li l 0. Nh vy, ct j c chp nhn khi c 3 bin aj, bi+j, ci+j u c gi tr 1. Cc bin ny phi c khi u gi tr 1 trc , gn li gi tr 0 khi xp xong qun hu th i v tr li gi tr 1 khi a ra kt qu.
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <dos.h> #define N 8 #define #define #define #define D SG (2*N-1) (N-1)
void hoanghau(int); void inloigiai(int int int soloigiai =0; void hoanghau(int i){ int j; for (j=0; j<N;j++){ if (A[j] && B[i-j+SG] && C[i+j] ) { loigiai[i]=j; A[j]=FALSE; B[i-j+SG]=FALSE; C[i+j]=FALSE; if (i==N-1){ soloigiai++; A[N], B[D], C[D], loigiai[N];
36
min{ f ( x) : x D}
Trong , D l tp hu hn phn t. Ta gi thit D c m t nh sau: D = { x =( x1, x2, . . ., xn) A1 A2 . . . An ; x tho mn tnh cht P }, vi A1 A2 . . . An l cc tp hu hn, P l tnh cht cho trn tch cc A1 A2 . . . An . Vi gi thit v tp D nh trn, chng ta c th s dng thut ton quay lui lit k cc phng n ca bi ton. Trong qu trnh lit k theo thut ton quay lui, ta s xy dng
37
Chng 2: Duyt v qui dn cc thnh phn ca phng n. Mt b phn gm k thnh phn (a1, a2, . . ., ak) xut hin trong qu trnh thc hin thut ton s c gi l phng n b phn cp k. Thut ton nhnh cn c th c p dng gii bi ton t ra, nu nh c th tm c mt hm g xc nh trn tp tt c cc phng n b phn ca bi ton tho mn bt ng thc sau:
(*)
Bt ng thc (*) c ngha l gi tr ca hm ti phng n b phn (a1, a2, . ., ak) khng vt qu gi tr nh nht ca hm mc tiu bi ton trn tp con cc phng n. D(a1, a2, . ., ak) { x D: xi = ai, 1 = 1, 2, . ., k }, ni cch khc, g(a1, a2, .., ak) l cn di ca tp D(a1, a2, . ., ak). Do c th ng nht tp D(a1, a2, . . ., ak) vi phng n b phn (a1, a2, . . , ak), nn ta cng gi gi tr g(a1, a2, . ., ak) l cn di ca phng n b phn (a1, a2, . ., ak). Gi s, ta c c hm g. Ta xt cch s dng hm ny hn ch khi lng duyt trong qu trnh duyt tt c cc phng n theo thut ton quay lui. Trong qu trnh lit k cc phng n, c th thu c mt s phng n ca bi ton. Gi x l gi tr hm mc tiu nh nht trong s cc phng n duyt, k hiu f = f (x) . Ta gi x l phng n tt nht hin c, cn f l k lc. Gi s, ta c c f , khi nu g(a1, a2, .., ak) > f th t bt ng thc (*) ta suy ra
f < g(a1, a2, . . ., ak) min { f(x): x D, xi = ai, i=1, 2, . . ., k }, v th tp con cc phng n ca bi ton D(a1, a2, . . ., ak) chc chn khng cha phng n ti u. Trong trng hp ny, ta khng cn phi pht trin phng n b phn (a1, a2, . . ., ak). Ni cch khc, ta c th loi b cc phng n trong tp D(a1, a2, . ., an) khi qu trnh tm kim.
Thut ton quay lui lit k cc phng n cn sa i li nh sau:
void Try(int k) { (*Pht trin phng n b phn (a1, a2, . . ., ak-1 theo thut ton quay lui c kim tra cn di trc khi tip tc pht trin phng n*) for ak Ak { if ( chp nhn ak ) { xk = ak; if (k== n) < cp nht k lc>; else if (g(a1, a2, . . ., ak) } } }
f )) Try (k+1);
38
Chng 2: Duyt v qui Khi , thut ton nhnh cn c thc hin nh th tc sau:
void Nhanh_Can(){
f = +;
(* Nu bit mt phng n x no th c th t Try(1); if( }
f = f ( x) *)
f )) Try(k+1);
bi
if (k == n) < cp nht k lc >; else Try(k+1);
th th tc Try s lit k ton b cc phng n ca bi ton, v ta li thu c thut ton duyt ton b. Vic xy dng hm g ph thuc vo tng bi ton ti u t hp c th. Nhng chng ta c gng xy dng sao cho vic tnh gi tr ca g phi n gin v gi tr ca g(a1, a2, . ., ak) phi st vi gi tr ca hm mc tiu. V d. Gii bi ton ngi du lch bng thut ton nhnh cn Bi ton Ngi du lch. Mt ngi du lch mun i thm quan n thnh ph T1, T2, . . . , Tn. Xut pht t mt thnh ph no , ngi du lch mun i qua tt c cc thnh ph cn li, mi thnh ph i qua ng mt ln, ri quay tr li thnh ph xut pht. Bit cij l chi ph i t thnh ph Ti n thnh ph Tj (i, j = 1, 2, . ., n), hy tm hnh trnh vi tng chi ph l nh nht (mt hnh trnh l mt cch i tho mn iu kin). Gii: C nh thnh ph xut pht l T1. Bi ton Ngi du lch c a v bi ton: Tm cc tiu ca phim hm:
T1 T (u 2 ) ... T (u k 1 ) T (u k )
V vy, chi ph phi tr theo hnh trnh b phn ny s l tng cc chi ph theo tng node ca hnh trnh b phn.
39
0 3 C= 17 6
3 14 18 15 0 9 2 4 22 20 0 16 4 7 0 12 5 0
9 15 11
Ta c cmin = 2. Qu trnh thc hin thut ton c m t bi cy tm kim li gii c th hin trong hnh 2.2. Thng tin v mt phng n b phn trn cy c ghi trong cc trn hnh v tng ng theo th t sau: u tin l cc thnh phn ca phng n tip n l chi ph theo hnh trnh b phn g l cn di Kt thc thut ton, ta thu c phng n ti u ( 1, 2, 3, 5, 4, 1) tng ng vi phng n ti u vi hnh trnh
T1 T2 T3 T5 T4 T1
v chi ph nh nht l 22
40
f = +
(2) =3; g=15 (3) =14; g=26 (4) =18; g=30 (5) =15; g=27
(2,5)=23; g=32
(2,3,4) g=29
=23;
(2,3,5) g=17
=11;
f = 22
f = 53
f = 22
Chng trnh gii bi ton theo thut ton nhnh cn c th hin nh sau:
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <io.h> #define MAX 20 int n, P[MAX], B[MAX], C[20][20], count=0; int A[MAX], XOPT[MAX]; int can, cmin, fopt; void Read_Data(void){ int i, j;FILE *fp; fp = fopen("dulich.in","r"); fscanf(fp,"%d", &n); printf("\n So thanh pho: %d", n); printf("\n Ma tran chi phi:");
41
42
43
Khi khng cn cch no gii quyt vn th c th s dng cch duyt gii quyt. Tuy phng php nh ngha bng qui & gii thut qui tng i ngn gn v d hiu nhng khng nn qu lm dng n trong khi vit chng trnh. Cn phi hiu r khi no th php sinh k tip mi c p dng. Qu trnh quay lui ch thc s ng khi ta kim sot c cc bc trc . hn ch cc php duyt nn s dng phng php nhnh cn (nu c th).
44
BI TP CHNG 2
Bi 1. Duyt mi tp con ca tp hp 1, 2, . . ., n. D liu vo cho bi file tapcon.in, kt qu ghi li trong file bai11.out. V d sau s minh ha cho file tapcon.in v tapcon.out. tapcon.in 3 tapcon.out 1 2 2 3 3 3 3 1 2 2 1 1
Bi 2. Tm tp con di nht c th t tng dn, gim dn. Cho dy s a1, a2, . . ., an. Hy tm dy con di nht c sp xp theo th t tng hoc gim dn. D liu vo cho bi file tapcon.in, dng u tin ghi li s t nhin n (n100), dng k tip ghi li n s, mi s c phn bit vi nhau bi mt hoc vi k t rng. Kt qu ghi li trong file tapcon.out. V d sau s minh ha cho file tapcon.in v tapcon.out. tapcon.in 5 7 1 3 8 9 6 12 tapcon.out 5 1 3 8 9 12
Bi 3. Duyt cc tp con tho mn iu kin. Cho dy s a1, a2, . . ., an v s M. Hy tm tt c cc dy con dy con trong dy s a1, a2, . . ., an sao cho tng cc phn t trong dy con ng bng M. D liu vo cho bi file tapcon.in, dng u tin ghi li hai s t nhin N v s M (N100), dng k tip ghi li N s mi s c phn bit vi nhau bi mt v du trng. Kt qu ghi li trong file tapcon.out. V d sau s minh ha cho file tapcon.in v tapcon.out tapcon.in 7 5 tapcon.out 20 30 50 10 15 20 25 30 35
45
Bi 4. Cho li hnh ch nht gm (nm) hnh vung n v. Hy lit k tt c cc ng i t im c ta (0, 0) n im c ta (nm). Bit rng, im (0, 0) c coi l nh di ca hnh vung di nht gc bn tri, mi bc i ch c php thc hin hoc ln trn hoc xung di theo cnh ca hnh vung n v. D liu vo cho bi file bai14.inp, kt qu ghi li trong file bai14.out. V d sau s minh ha cho file bai14.in v bai14.out. bai14.in 2 2
bai14.out 0 0 0 1 1 1 0 1 1 0 0 1 1 0 1 0 1 0 1 1 0 1 0 0
Bi 5. Duyt mi tp con k phn t t tp gm n phn t. D liu vo cho bi file tapcon.in, kt qu ghi li trong file tapcon.out. V d sau s minh ha cho tapcon.in v tapcon.out. tapcon.in 5 3
tapcon.out 1 1 1 1 1 1 2 2 2 3 3 4 3 4 5 4 5 5 46
Bi 6. Duyt cc tp con k phn t tha mn iu kin. Cho dy s a1, a2, . . ., an v s M. Hy tm tt c cc dy con dy con k phn t trong dy s a1, a2, . . ., an sao cho tng cc phn t trong dy con ng bng M. D liu vo cho bi file tapcon.in, dng u tin ghi li s t nhin n , k v s M, hai s c vit cch nhau bi mt vi k t trng, dng k tip ghi li n s mi s c vit cch nhau bi mt hoc vi k t trng. Kt qu ghi li trong file tapcon.out. V d sau s minh ha cho file tapcon.in v tapcon.out. tapcon.in 7 5 3 10 50 15 20 25 30 35
tapcon.out 5 5 5 10 15 20 35 35 25 25
10 15
Bi 7. Duyt mi hon v ca t COMPUTER. D liu vo cho bi file hoanvi.in, kt qu ghi li trong file hoanvi.out. Bi 8. Duyt mi ma trn cc hon v. Cho hnh vung gm n n (n 5, n l) hnh vung n v. Hy in cc s t 1, 2, . . ., n vo cc hnh vung n v sao cho nhng iu kin sau c tho mn: c theo hng ta nhn c n hon v khc nhau ca 1, 2, . . ., n; c theo ct ta nhn c n hon v khc nhau ca 1, 2, . . ., n; c theo hai ng cho ta nhn c 2 hon v khc nhau ca 1, 2, . . ., n; Hy tm t nht 1 (hoc tt c) cc hnh vung tho mn 3 iu kin trn. D liu vo cho bi file hoanvi.in, kt qu ghi li trong file hoanvi.out. V d sau s minh ha cho file input & output ca bi ton. hoanvi.in 5 hoanvi.out 5 3 4 1 2 47
Bi 9. Duyt mi cch chia s t nhin n thnh tng cc s nguyn nh hn. D liu vo cho bi file chiaso.in, kt qu ghi li trong file chiaso.out. V d sau s minh ha cho file input & output ca bi ton. chiaso.in 4 chiaso.out 4 3 2 2 1 1 2 1 1 1 1 1
Bi 10. Duyt mi b gi tr trong tp cc gi tr ri rc. Cho k tp hp cc s thc A1, A2, . . ., Ak(k 10) c s cc phn t tng ng l N1, N2, . . ., Nk ( cc tp c th c nhng phn t ging nhau). Hy duyt tt c cc b k phn t a=(a1, a2, . . ., ak) sao cho aiAi(i=1, 2, . . ., k). D liu vo cho bi file chiaso.in, dng u tin ghi li k+1 s t nhin, mi s c phn bit vi nhau bi mt vi du trng l gi tr ca n, N1, N2, . . ., Nk; k dng k tip ghi li cc phn t ca tp hp A1, A2, . . ., Ak. Kt qu ghi li trong file chiaso.out, mi phn t c phn bit vi nhau bi mt vi du trng. V d sau s minh ha cho file input & output ca bi ton. Chiaso.inp 3 1 4 6 chiaso.out 1 1 1 1 4 4 5 5 6 7 6 7 3 2 5 7 2 3 2
48
Bi 11. Tm b gi tr ri rc trong bi 21 hm mc tiu sin(x1+x2 + . . .+ xk) t gi tr ln nht. D liu vo cho bi file bai22.inp, kt qu ghi li trong file bai22.out. Bi 12. Duyt mi php ton trong tnh ton gi tr biu thc. Vit chng trnh nhp t bn phm hai s nguyn M, N. Hy tm cch thay cc du ? trong biu thc sau bi cc php ton +, -, *, %, / (chia nguyn) sao cho gi tr ca biu thc nhn c bng ng N: ( (((M?M) ?M)?M)?M)?M)?M Nu khng c hy a ra thng bo l khng th c. Bi 13. Bi ton ci ti vi s lng vt khng hn ch. Mt nh thm him em theo mt ci ti c trng lng khng qu b. C n vt cn em theo, vt th i c trng lng tng ng l mt s ai v gi tr s dng ci (1in). Hy tm cch b cc vt vo ti sao cho tng gi tr s dng cc vt l ln nht. Bit rng s lng cc vt l khng hn ch. D liu vo cho bi file caitui.in, dng u tin ghi li s t nhin n v s thc b hai s c vit cch nhau bi mt du trng, hai dng k tip ghi n s trn mi dng, tng ng vi vector gi tr s dng ci v vector trng lng ai. Kt qu ghi li trong file caitui.out trn 3 dng, dng u ghi li gi tr s dng ti u, dng k tip ghi li loi vt cn em theo, dng cui cng ghi li s lng ca mi loi vt. V d sau s minh ha cho file input & output ca bi ton. caitui.in 4 10 5 caitui.out 15 1 1 1 1 0 0 0 0 8 5 3 3 2 6 4
49
Chng 2: Duyt v qui Bi 14. Bi ton ci ti vi s lng vt hn ch. Mt nh thm him em theo mt ci ti c trng lng khng qu b. C n vt cn em theo, vt th i c trng lng tng ng l mt s ai v gi tr s dng ci (1in). Hy tm cch b cc vt vo ti sao cho tng gi tr s dng cc vt l ln nht. Bit rng s lng mi vt l 1. D liu vo cho bi file caitui.in, dng u tin ghi li s t nhin n v s thc b hai s c vit cch nhau bi mt du trng, hai dng k tip ghi n s trn mi dng, tng ng vi vector gi tr s dng ci v vector trng lng ai. Kt qu ghi li trong file caitui.out trn 2 dng, dng u ghi li gi tr s dng ti u, dng k tip ghi li loi vt cn em theo. V d sau s minh ho cho file input & output ca bi ton. caitui.in 4 8 4 caitui.out 14 1 1 0 1 8 5 3 3 2 1 1
Bi 15. Bi ton ngi du lch. Mt ngi du lch mun i tham quan ti n thnh ph khc nhau. Xut pht ti mt thnh ph no , ngi du lch mun i qua tt c cc thnh ph cn li mi thnh ph ng mt ln ri quay tr li thnh ph ban u. Bit Cij l chi ph i li t thnh ph th i n thnh ph th j. Hy tm hnh trnh c chi ph thp nht cho ngi du lch. D liu vo cho bi file dulich.in, dng u tin ghi li s t nhin n, n dng k tip ghi li ma trn chi ph Cij. Kt qu ghi li trong file dulich.out, dng u tin ghi li chi ph ti u, dng k tip ghi li hnh trnh ti u. V d sau s minh ha cho file input & output ca bi ton. dulich.in 5 00 20 29 06 01 dulich.out 81 1 5 3 4 2 1 48 00 64 19 28 43 30 00 02 07 54 63 04 00 18 31 22 17 08 00
50
CHNG 3: NGN XP, HNG I V DANH SCH MC NI (STACK, QUEUE, LINK LIST)
Ni dung chnh ca chng ny nhm lm r cc phng php, k thut biu din, php ton v ng dng ca cc cu trc d liu tru tng. Cn c bit lu , ng dng cc cu trc d liu ny khng ch ring cho lp trnh ng dng m cn ng dng trong biu din b nh gii quyt nhng vn bn trong ca cc h iu hnh. Cc k thut lp trnh trn cu trc d liu tru tng c cp y bao gm: K thut lp trnh trn ngn xp. K thut lp trnh trn hng i. K thut lp trnh trn danh sch lin kt n. K thut lp trnh trn danh sch lin kt kp. Bn c c th tm thy nhng ci t v ng dng c th trong ti liu [1].
51
Chng 3: Ngn xp, hng i v danh sch mc ni push(S,C) push(S,D) pop(S) pop(S) C B A (d) (hnh d) (hnh e) (hnh f) (hnh g) D C B A (e) C B A (f)
A (a) (b)
B A (c)
B A (g)
C th lu tr stack di dng mt vector S gm n thnh phn lin tip nhau. Nu T l a ch ca phn t nh stack th T s c gi tr bin i khi stack hot ng. Ta gi phn t u tin ca stack l phn t th 0, nh vy stack rng khi T c gi tr nh hn 0 ta qui c l -1. Stack trn khi T c gi tr l n-1. Mi khi mt phn t c thm vo stack, gi tr ca T c tng ln 1 n v, khi mt phn t b loi b khi stack gi tr ca T s gim i mt n v. TOP S1 S2 S3 ... T ST ... BOOTTOM
khai bo mt stack, chng ta c th dng mt mng mt chiu. Phn t th 0 l y stack, phn t cui ca mng l nh stack. Mt stack tng qut l mt cu trc gm hai trng, trng top l mt s nguyn ch nh stack. Trng node: l mt mng mt chiu gm MAX phn t trong mi phn t l mt nt ca stack. Mt nt ca stack c th l mt bin n hoc mt cu trc phn nh tp thng tin v nt hin ti. V d, khai bo stack dng lu tr cc s nguyn.
#define #define #define TRUE 1 FALSE 0 MAX { top; nodes[MAX]; int int } stack; 100
typedef struct
52
Chng 3: Ngn xp, hng i v danh sch mc ni 3.1.2. Cc thao tc vi stack Trong khi khai bo mt stack dng danh sch tuyn tnh, chng ta cn nh ngha MAX ln c th lu tr c mi nh ca stack. Mt stack b trn (TOP = MAX1) th n khng th thm vo phn t trong stack, mt stack rng th n khng th a ra phn t. V vy, chng ta cn xy dng thm cc thao tc kim tra stack c b trn hay khng (full) v thao tc kim tra stack c rng hay khng (empty). Thao tc Empty: Kim tra stack c rng hay khng:
int Empty(stack *ps) { if (ps ->top == -1) return(TRUE); return(FALSE); }
3.1.3. ng dng ca stack Stack c nng dng biu din nhiu thut gii phc tp khc nhau, c bit i vi nhng bi ton cn s dng n cc li gi qui. Di y l mt s cc v d in hnh ca vic ng dng stack. o ngc xu k t: Qu trnh o ngc mt xu k t ging nh vic a vo (push) tng k t trong xu vo stack, sau a ra (pop) cc k t trong stack ra cho ti khi stack rng ta c mt xu o ngc. Chuyn i s t h thp phn sang h c s bt k: chuyn i mt s h thp phn thnh s h c s bt k, chng ta ly s chia cho c s cn chuyn i, lu
53
Chng 3: Ngn xp, hng i v danh sch mc ni tr li phn d ca php chia, sau o ngc li dy cc s d ta nhn c s cn chuyn i, vic lm ny ging nh c ch LIFO ca stack. Tnh gi tr mt biu thc dng hu t:Xt mt biu thc dng hu t ch cha cc php ton cng (+), tr (-), nhn (*), chia (/), ly tha ($). Cn phi nhc li rng, nh logic hc Lewinski chng minh c rng, mi biu thc u c th biu din di dng hu t m khng cn dng thm cc k hiu ph. V d : 23+5*2$ = ( (2 + 3) *5 ) 2 = 625
tnh gi tr ca biu thc dng hu t, chng ta s dng mt stack lu tr biu thc qu trnh tnh ton c thc hin nh sau: Ly ton hng 1 ( 2 ) -> Ly ton hng 2 ( 3 ) -> Ly php ton + -> Ly ton hng 1 cng ton hng 2 v y vo stack (5) -> Ly ton hng tip theo (5), ly php ton tip theo (*), nhn vi ton hng 1 ri y vo stack (25), ly ton hng tip theo (2), ly php ton tip theo ($) v thc hin, ly lu tha ri y vo stack. Cui cng ta nhn c 25 2= 625. Di y l chng trnh o ngc xu k t s dng stack. Nhng v d khc, bn c c th tm thy trong cc ti liu [1], [2]. V d 3.1. Chng trnh o ngc xu k t.
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <dos.h> #include <string.h> #define #define #define typedef MAX 100 TRUE 1 FALSE 0 struct{ int top; char node[MAX]; } stack; /* nguyen mau cua ham*/ int Empty(stack *); void Push(stack *, char); char Pop(stack *); /* Mo ta ham */ int Empty(stack *ps){ if (ps->top==-1) return(TRUE); return(FALSE); } void Push(stack *ps, char x){
54
55
truy nhp vo hng i, chng ta s dng hai bin con tr front ch li trc v rear ch li sau. Khi li trc trng vi li sau (q.rear = q.rear) th queue trng thi rng (hnh a), thm d liu vo hng i cc phn t A, B, C c thc hin thng qua thao tc insert(q,A), insert(q,B), insert(q,C) c m t hnh b, thao tc loi b phn t khi hng i Remove(q) c m t hnh c, nhng thao tc tip theo c m t ti hnh d, e.
Hnh a. Trng thi rng ca hng i. q.rear=2 C B q.front=0 A Hnh c. remove(q). Hnh b. insert(Q,A);insert(Q,B), insert(Q,C)
Hnh d. insert(q,D).
Hnh e. remove(q).
Cch t chc ny s dn ti trng hp cc phn t di chuyn khp khng gian nh khi thc hin b sung v loi b. Trong nhiu trng hp, khi thc hin thm hoc loi b phn t ca hng i chng ta cn xt ti mt th t u tin no , khi hng i c gi l hng i c u tin ( Priority Queue ). Vi priority queue, th nt no c u tin cao nht c thc hin loi b trc nht, cn vi thao tc thm phn t vo hng i tr thnh thao tc thm phn t vo hng i c xt ti u tin.
56
Chng 3: Ngn xp, hng i v danh sch mc ni 3.2.2. ng dng hng i Mi vn ca thc t lin quan ti c ch FIFO nh c ch gi tin, rt tin trong ngn hng, t v my bay u c th ng dng c bng hng i. Hng i cn c nhng ng dng trong vic gii quyt cc bi ton ca H iu hnh v chng trnh dch nh bi ton iu khin cc qu trnh, iu khin np chng trnh vo b nh hay bi ton lp lch. Bn c c th tham kho thm trong cc ti liu [1], [2]. Di y, chng ta a ra mt ng dng ca hng i gii quyt bi ton Nh sn xut v Ngi tiu dng. V d 3.2- Gii quyt bi ton Ngi sn xut v nh tiu dng vi s cc vng m hn ch. Chng ta m t qu trnh sn xut v tiu dng nh hai qu trnh ring bit v thc hin song hnh, ngi sn xut c th sn xut ti a n mt hng. Ngi tiu dng ch c php s dng trong s n mt hng. Tuy nhin, ngi sn xut ch c th lu tr vo kho khi v ch khi kho cha b y. Ngc li, nu kho hng khng rng (kho c hng) ngi tiu dng c th tiu dng nhng mt hng trong kho theo nguyn tc hng no nhp vo kho trc c tiu dng trc ging nh c ch FIFO ca queue. Sau y l nhng thao tc ch yu trn hng i gii quyt bi ton: Ta xy dng hng i nh mt danh sch tuyn tnh gm MAX phn t mi phn t l mt cu trc, hai bin front, rear tr n li vo v li ra trong queue:
typedef struct{ int mahang; char ten[20]; } hang; typedef struct { int front, rear; hang node[MAX]; } queue;
Thao tc Initialize: thit lp trng thi ban u ca hng i. trng thi ny, font v rear c cng mt gi tr MAX-1.
void Initialize ( queue *pq){ pq->front = pq->rear = MAX -1; }
Thao tc Empty: kim tra hng i c trng thi rng hay khng. Hng i rng khi front == rear.
int Empty(queue *pq){ if (pq->front==pq->rear) return(TRUE); return(FALSE); }
57
Chng 3: Ngn xp, hng i v danh sch mc ni Thao tc Insert: thm X vo hng i Q. Nu vic thm X vo hng i c thc hin u hng, khi rear c gi tr 0, nu rear khng phi u hng i th gi tr ca n c tng ln 1 n v.
void Insert(queue *pq, hang x){ if (pq->rear==MAX-1 ) pq->rear=0; else (pq->rear)++; if (pq->rear ==pq->front){ printf("\n Queue full"); delay(2000);return; } else pq->node[pq->rear]=x; }
Thao tc Remove: loi b phn t v tr front khi hng i. Nu hng i trng thi rng th thao tc Remove khng th thc hin c, trong trng hp khc front c tng ln mt n v.
hang Remove(queue *pq){ if (Empty(pq)){ printf("\n Queue Empty"); delay(2000); } else { if (pq->front ==MAX-1) pq->front=0; else pq->front++; } return(pq->node[pq->front]); }
58
void Insert(queue *, hang x); hang Remove(queue *); void Traver(queue *); /* Mo ta ham */ void Initialize ( queue *pq){ pq->front = pq->rear = MAX -1; } int Empty(queue *pq){ if (pq->front==pq->rear)
59
60
61
Trong trng hp ny, bin nguyn phantu ca tng nh cha d liu cn bin con tr tiep cha a ch ca nh tip theo. S biu din danh sch mc ni n c biu din nh hnh di y: Phn_t Phn_t Phn_t ....
62
Chng 3: Ngn xp, hng i v danh sch mc ni Tng qut hn, mi nh ca danh sch c th cha nhiu phn t d liu. Trong trng hp ny, hp l hn c l nh ngha mt kiu cu trc tng ng vi d liu cn lu gi ti mi nh. Phng php ny c s dng trong nh ngha kiu sau y:
/*nh ca danh sch tng qut */ struct tq { thtin_t phantu; struc tq*tiep; }; typedef struct tq tq_t;
Kiu cu trc thtin_t phi c nh ngha trc tng ng vi cc d liu s c lu tr ti tng nh. Danh sch c to nn t kiu nh ny ging nh s trong Hnh 3.4, ngoi tr vic mi phantu l mt bin nguyn. 3.3.2. Cc thao tc trn danh sch mc ni Cc thao tc trn danh sch mc ni bao gm vic cp pht b nh cho cc nh v gn d liu cho con tr. danh sch c to nn ng n, ta biu din phn t cui danh sch l mt con tr NULL. Con tr NULL l tn hiu thng bo khng cn phn t no tip theo trong danh sch na. Tin hn c l chng ta nh ngha mt con tr ti danh sch nh sau:
struct node { int infor; struct node *next; }; typedef struct node *NODEPTR; // Con tr ti node
Chn mt phn t mi vo u danh sch: Cc bc chn mt phn t mi vo u danh sch cn thc hin l: Cp khng gian b nh lu gi mt nh mi; Gn cc gi tr con tr thch hp cho nh mi;
63
Chng 3: Ngn xp, hng i v danh sch mc ni Thit lp lin kt vi nh mi. S biu din php thm mt nh mi vo u danh sch c th hin nh trn hnh 3.5. infor next infor next infor next
infor
Thm mt phn t mi vo cui danh sch: thm mt node vo cui danh sch, ta cn thc hin qua cc bc sau: Cp pht b nh cho node mi; Gn gi tr thch hp cho node mi; Di chuyn con tr ti phn t cui danh sch; Thit lp lin kt cho node mi. S th hin php thm mt phn t mi vo cui danh sch c th hin nh trong hnh 3.6
infor
next
infor
next
infor
next
infor
next
NULL
Thm node mi q vo gia danh sch trc node p: thm node q vo trc node p, chng ta cn lu node p phi c thc trong danh sch. Gi s node p l c thc, khi xy ra hai tnh hung: hoc node p l node cui cng ca danh sch lin kt tc p->next =NULL, hoc node p cha phi l cui cng hay p->next != NULL. Trng hp th nht, chng ta ch cn gi ti thao tc Push_Bottom(). Trng hp th 2, chng ta thc hin theo cc bc nh sau: Cp pht b nh cho node mi; Gn gi tr thch hp cho node; Thit lp lin kt node q vi node k tip p; Thit lp lin kt node node p vi node q;
void Push_Before( NODEPTR p, int x ){ NODEPTR q; if (p->next==NULL) Push_Bottom(p, x); else { q= Getnode(); // cp pht b nh cho node mi q -> infor = x; // gn gi tr thng tin thch hp q-> next = p-> next; // thit lp lin kt node q vi node k tip p; p->next = q; // thit lp lin kt node p vi node k tip q; } }
65
Chng 3: Ngn xp, hng i v danh sch mc ni p infor next infor next infor next
Xo mt node ra khi u danh sch: Khi loi b node khi u danh sch lin kt, chng ta cn ch rng nu danh sch ang rng th khng th thc hin vic loi b. Trong trng hp cn li, ta thc hin nh sau: Dng node p tr ti u danh sch; Dch chuyn v tr u danh sch ti node tip theo; Loi b lin kt vi p; Gii phng node p;
void Del_Top( NODEPTR *plist) { NODEPTR p; p = *plist; // node p tr ti u danh sch; if (p==NULL) return; // danh sch rng (*plist) = (*plist) -> next; // dch chuyn node gc ln node k tip p-> next = NULL; //loi b lin kt vi p Freenode(p); // gii phng p; }
Loi b node cui danh sch: Mt node cui danh sch c th xy ra ba tnh hung sau: Danh sch rng: ta khng cn thc hin loi b; Danh sch ch c ng mt node: ng vi trng hp loi b node gc; Trng hp cn li danh sch c nhiu hn mt node, khi ta phi dch chuyn ti node gn node cui cng nht thc hin loi b.
void Del_Bottom(NODEPTR *plist) { NODEPTR p, q; if (*plist==NULL) return; //khng lm g else if ( (*plist)->next==NULL)) // danh sch c mt node Del_Top(plist); else {
66
Loi b node gia danh sch (trc node p): Cn rng, nu trc node p l NULL (p->next==NULL) th ta khng thc hin loi b c. Trng hp cn li chng ta thc hin nh sau: Dng node q tr ti node trc node p; Loi b lin kt ca q; Gii phng q.
void Del_before(NODEPTR p){ NODEPTR q; if (p->next==NULL) return; // khng lm g q = p ->next; p->next = q->next; Freenode(q); }
67
Null
Null
Hnh 3.8. M t mt danh sch lin kt kp. Cc thao tc trn danh sch lin kt kp cng tng t nh danh sch lin kt n. Nhng cn ch rng, mi node p ca danh sch lin kt kp c hai ng lin kt l p-> left v p->right; Thao tc thm node mi vo u danh sch lin kt kp: Cp pht b nh cho node mi; Gn gi tr thch hp cho node mi; Thit lp lin kt cho node mi;
void Push_Top(NODEPTR *plist, int x){ NODEPTR p; p = Getnode(); //cp pht b nh cho node p ->infor = x; //gn gi tr thch hp; p -> right = *plist; // thit lp lin kt phi (*plist) ->left = p; // thit lin kt vi *plist p-> left = NULL;// thit lp lin kt tri *plist = p; }
Thao tc thm node vo cui danh sch: Nu danh sch rng th thao tc ny trng vi thao tc thm node mi vo u danh sch. Nu danh sch khng rng chng ta thc hin nh sau: Cp pht b nh cho node; Gn gi tr thch hp cho node; Chuyn con tr ti node cui trong danh sch; Thit lp lin kt tri; Thit lp lin kt phi;
void Push_Bottom(NODEPTR *plist, int x){ NODEPTR p, q; if (*plist ==NULL) Push_Top(plist, x); else { p= Getnode();// cp pht b nh cho node p->infor =x; //gn gi tr thch hp //chuyn con tr ti node cui danh sch
68
Thm node vo trc node p: Mun thm node vo trc node p th node p phi tn ti trong danh sch. Nu node p tn ti th c th xy ra hai trng hp: hoc node p l node cui cng ca danh sch hoc node p l node cha phi l cui cng. Trng hp th nht ng vi thao tc Push_Bottom. Trng hp th hai, chng ta lm nh sau: Cp pht b nh cho node; Gn gi tr thch hp; Thit lp lin kt tri cho node mi; Thit lp lin kt phi cho node mi; Qu trnh c m t bi th tc sau:
void Push_Before(NODEPTR p, int x){ NODEPTR q; if (p==NULL) return; //khng lm g else if (p->next==NULL) Push_Bottom(p, x); else { q = Getnode(); // cp pht b nh cho node mi q ->infor = x; //gn gi tr thng tin thch hp q ->right = p->right; //thit lp lin kt phi (p ->right) ->left =q; q -> left = p; //thit lp lin kt tri p ->right = q; } }
Loi b node u danh sch: Nu danh sch rng th khng cn loi b; Dng node p tr ti u danh sch; Chuyn gc ln node k tip;
69
Chng 3: Ngn xp, hng i v danh sch mc ni Loi b lin kt vi node p; Gii phng p;
void Del_Top(NODEPTR *plist){ NODEPTR p; if ( (*plist)==NULL) return; //khng lm g p = *plist; //p l node u tin trong danh sch (*plist) = (*plist) -> right; // chuyn node gc ti node k tip p ->right =NULL; // ngt lin kt phi ca p; (*plist) ->left ==NULL;//ngt lin kt tri vi p Freenode(p); //gii phng p }
Loi b node cui danh sch: Nu danh sch rng th khng cn loi b; Nu danh sch c mt node th n l trung hp loi phn t u danh sch; Nu danh sch c nhiu hn mt node th: Chuyn con tr ti node cui cng; Ngt lin kt tri ca node; Ngt lin kt phi ca node; Gii phng node.
void Del_Bottom(NODEPTR *plist) { NODEPTR p, q; if ((*plist)==NULL) return; //khng lm g else if ( (*plist) ->right==NULL) Del_Top(plist); else { p = *plist; // chuyn con tr ti node cui danh sch while (p->right!=NULL) p =p->right; // p l node cui ca danh sch q = p ->left; //q l node sau p; q ->right =NULL; //ngt lin kt phi ca q p -> left = NULL; //ngt lin kt tri ca p Freenode(p); //gii phng p } }
70
Chng 3: Ngn xp, hng i v danh sch mc ni Nu node p l node cui th cng khng th loi b; Trng hp cn li c thc hin nh sau: Ngt lin kt tri vi node p ng thi thit lp lin kt phi vi node (p right) right; Ngt lin kt phi vi node p ng thi thit lp lin kt tri vi node (p right) right; Gii phng node p right.
void Del_Before(NODEPTR p){ NODEPTR q, r; if (p==NULL || p->right==NULL) return; /*khng lm g nu node p l khng c thc hoc l node cui cng */ q = (p->right)->right; //q l node trc node p ->right r = p->right; // r l node cn loi b r -> left =NULL; //ngt lin kt tri ca r r->right ==NULL;//ngt lin kt phi ca r p->right =q; //thit lp lin kt phi mi cho p q ->left = p; // thit lp lin kt tri mi cho p Freenode(r); //gii phng node }
71
Cc phng php nh ngha stack, khi no dng stack & vai tr ca stack i vi cc gii thut qui. Phng php nh ngha hng i, cc thao tc trn hng i v ng dng ca hng i. Bn cht ng l tnh cht c bn nht ca danh sch lin kt n v lin kt kp. S khc bit c bn ca danh sch lin kt n v danh sch lin kt kp l cc con tr left v right. Nhng ng dng ln thng c ci t trn cc cu trc d liu ng. Ch gii phng b nh cho con tr trong khi lp trnh.
72
BI TP CHNG 3
Bi 1. Xu thun nghch c l xu bt nh phn c di n m khi o xu ta vn nhn c chnh xu . Hy lit k tt c cc xu thun nghch c c di n v ghi li nhng xu vo File thuang.out theo tng dng, dng u tin ghi li gi tr ca n, cc dng tip theo l nhng xu thun nghch c c di n. V d: vi n=4, ta c c nhng xu thun nghch c c dng sau: 4 0 0 1 1 0 1 0 1 0 1 0 1 0 0 1 1
Bi 2. Vit chng trnh qun l im thi ca sinh vin bng single (double) link list bao gm nhng thao tc sau: - Nhp d liu; - Hin th d liu theo lp, xp loi . . .; - Sp xp d liu; - Tm kim d liu; - In n kt qu. Trong , thng tin v mi sinh vin c nh ngha thng qua cu trc sau:
typedef struct { int char char float float float char } sinhvien; masv; // m sinh vin; malop[12]; //m lp hoten[30]; //h tn sinh vin diemki; // im tng kt k 1 diemkii;// im tng kt k 2 diemtk; // im tng kt c nm xeploai[12]; // xp loi
Bi 3. Biu din biu thc theo c php Ba Lan. Biu thc nguyn l mt dy c thnh lp t cc bin kiu nguyn ni vi nhau bng cc php ton hai ngi ( cng: + , tr : , nhn : *) v cc du m ngoc n (, ng ngoc n ). Nguyn tc t tn bin v th t thc hin cc php ton c thc hin nh sau: Qui tc t tn bin: L dy cc k t ch in thng hoc k t s di khng qu 8, k t bt u phi l mt ch ci. 73
Chng 3: Ngn xp, hng i v danh sch mc ni Qui tc thc hin php ton: Biu thc trong ngoc n c tnh trc, php ton nhn * c u tin cao hn so vi hai php ton cng v tr. Hai php ton cng + v tr c cng u tin. V d : a * b + c phi c hiu l: (a * b) + c.
Dng vit khng ngoc Ba Lan cho biu thc nguyn c nh ngha nh sau: Nu e l tn bin th dng vit Ba Lan ca n chnh l e, Nu e1 v e2 l hai biu thc c dng vit Ba Lan tng ng l d1 v d2 th dng vit Ba Lan ca e1 + e2 l d1 d2+, ca e1 - e2 l d1 d2-, ca e1*e2 l d1 d2* ( Gia d1 v d2 c ng mt du cch, trc du php ton khng c du cch), Nu e l biu thc c dng vit Ba Lan l d th dng vit Ba Lan ca biu thc c ngoc n (e) chnh l d ( khng cn du ngoc na) . V d: Biu thc (c+b*(f-d)) c dng vit Ba Lan l : c b f d-*+.
Cho file d liu balan.in c t chc thnh tng dng, mi dng khng di qu 80 k t l biu din ca biu thc nguyn A. Hy dch cc biu thc nguyn A thnh dng vit Ba Lan ca A ghi vo file balan.out theo tng dng. V d: vi file balan.in di y s cho ta kt qu nh sau: balan.in a+b a-b a*b (a - b) +c (a + b) * c (a + (b-c)) ( a + b*(c-d)) ( (a + b) *c- ( d + e) * f) balan.out a b+ a ba b* a b- c+ a b+ c* a b c-+ a b c d-*+ a b+c* d e+f*-
Bi 4. Tnh ton gi tr biu thc Ba Lan. Cho file d liu balan.in gm 2 * n dng trong , dng c s th t l (1, 3, 5, . . ) ghi li mt xu l biu din Ba Lan ca biu thc nguyn A, dng c s th t chn (2,4,6, . .) ghi li gi tr ca cc bin xut hin trong A. Hy tnh gi tr ca biu thc A, ghi li gi tr ca A vo file balan.out tng dng theo th t: Dng c th t l ghi li biu thc Ba Lan ca A sau khi thay th cc gi tr tng ng ca bin trong A, dng c th t chn ghi li gi tr ca biu thc A. V d vi file balan.in di y s cho ta kt qu nh sau: balan.in a b+ balan.out 3 5+
74
Chng 3: Ngn xp, hng i v danh sch mc ni 35 a b73 a b* 43 c a b-+ 345 8 7 34 43* 12 3 4 5-+ 2
Bi 5. Lp lch vi mc u tin. lp lch cho CPU p ng cho cc qu trnh ang i ca h thng, ngi ta biu din mi qu trnh bng mt bn ghi bao gm nhng thng tin : s qu trnh(Num) l mt s t nhin nh hn 1024, tn qu trnh (Proc) l mt xu k t di khng qu 32 khng cha du trng gia, u tin qu trnh l mt s nguyn dng (Pri) nh hn 10, thi gian thc hin ca qu trnh (Time) l mt s thc. Cc qu trnh ang i trong h c CPU p ng thng qua mt hng i c gi l hng i cc qu trnh, hng i cc qu trnh vi u tin c xy dng sao cho nhng iu kin sau c tho mn: Cc qu trnh c sp theo th t u tin; i vi nhng qu trnh c cng u tin th qu trnh no c thi gian thc hin t nht c xp ln trc nht.
Cho file d liu lich.in c t chc nh sau: Dng u tin ghi li mt s t nhin n l s cc qu trnh; n dng k tip, mi dng ghi li thng tin v mt qu trnh ang i.
Hy xy dng hng i cc qu trnh vi u tin. Ghi li th t cc qu trnh m CPU p ng trn mt dng ca file lich.out, mi qu trnh c phn bit vi nhau bi mt hoc vi k t trng, dng k tip ghi li s gi cn thit m CPU cn p ng cho cc qu trnh. V d vi file lich.in di y s cho ta kt qu nh sau: lich.in 7 1 Data_Processing 2 Editor_Program 3 System_Call 4 System_Interative 5 System_Action 3 6 Writing_Data 7 Reading_Data 2 1 1 3 3 2 2 10 75 20 10 20 0.5 1
Chng 3: Ngn xp, hng i v danh sch mc ni lich.out 3 63.5 Bi 6. Thut ton RR (Round Robin): Thut ton SJF p ng c ti a cc qu trnh hot ng trong h, tuy nhin s c nhiu qu trnh c chi ph thi gian ln phi i nhiu qu trnh c chi ph thi gian nh thc hin. Vi thut ton SJF , tnh cng bng ca h b vi phm. khc phc iu trn, thut ton Round Robin thc hin chn mt lng t thi gian thch hp, sau p ng cho mi qu trnh theo tng vng vi lng t thi gian chn. u im ca RR l tnh cng bng ca h c m bo, s cc qu trnh c CPU p ng trn mt n v thi gian chp nhn c. Nhc im ln nht ca thut ton l vic la chn lng t thi gian p ng cho mi qu trnh sao cho ti u khng phi l n gin. Hy vit chng trnh m phng thut ton lp lch RR. 4 5 7 6 1 2
76
Cy l mt trong nhng cu trc d liu ri rc c ng dng quan trng trong biu din tnh ton, biu din tri thc & biu din cc i tng d liu phc tp. Trng tm chnh ca chng ny nhm cung cp cho bn c nhng khi nim v thao tc c bn trn cy nh phn, bao gm: Khi nim v cy, cy nh phn, cy nh phn tm kim. Khi nim node gc (root), node l (leaf), mc (level) & su ca cy. Phng php biu din v cc thao tc trn cy nh phn. Cc thao tc duyt cy: duyt theo th t trc, duyt theo th t gia & duyt theo th t sau. Phng php biu din v cc thao tc trn cy nh phn tm kim. Bn c c th tm hiu su hn v cy nhiu nhnh, cy cn bng v cy nh phn hon ton cn bng trong ti liu [1].
4.1
4.2
4.3
4.4
4.1.1
4.1.2
4.3.1
4.3.2
4.4.1
4.4.2
Hnh 4.1. V d v mt cy th mc
77
Chng 4: Cu trc d liu cy (Tree) Mt cy c gi l rng nu n khng c bt k mt node no. S cc node con ca mt node c gi l cp (degree) ca node . V d: trong cy 4.2 sau, cp ca node A l 3, cp ca node B l 2, cp ca node D l 3, cp ca node H l 2. A B D
J Hnh 4.2. m t cp ca cy
Node c cp bng 0 c gi l l (leaf) hay node tn cng (terminal node). V d: cc node E, F, C, G, I, J, K c gi l l. Node khng l l c gi l node trung gian hay node nhnh (branch node). V d node B, D, H l cc node nhnh. Cp cao nht ca node trn cy gi l cp ca cy, trong trng hp cy trong hnh 4.2 cp ca cy l 3. Gc ca cy c s mc l 1. Nu node cha c s mc l i th node con c s mc l i+1. V d gc A c s mc l 1, D c s mc l 2, G c s mc l 3, J c s mc l 4. Chiu cao (height) hay chiu su (depth) ca mt cy l s mc ln nht ca node trn cy . Cy 4.2 c chiu cao l 4. ng i t node n1 n nk l dy cc node n1, n2, . ., nk sao cho ni l node cha ca node ni+1 (1<=i<k), di ca ng i (path length) c tnh bng s cc node trn ng i tr i 1 v n phi tnh t node bt u v node kt thc. V d: trong cy 4.2 ng i t node A ti node G l 2, ng i t node A n node K l 3. Mt cy c gi l c th t nu chng ta xt n th t cc cy con trong cy (ordered tree), ngc li l cy khng c th t (unordered tree). Thng thng cc cy con c tnh theo th t t tri sang phi.
4.2. CY NH PHN
Cy nh phn l mt dng quan trng ca cu trc cy c c im l mi node trn cy ch c ti a l hai node con. Cy con bn tri ca cy nh phn c gi l left subtree, cy con bn phi ca cy c gi l right subtree. i vi cy nh phn, bao gi cng c phn bit cy con bn tri v cy con bn phi. Nh vy, cy nh phn l mt cy c th t. V d trong hnh 4.3 u l cc cy nh phn:
78
79
Cy nh phn hon ton cn bng (hnh 4.5): l cy nh phn m tt c cc node ca n s node trn nhnh cy con bn tri v s node trn nhnh cy con bn phi chnh lnh nhau khng qu 1. Nu ta gi Nl l s node ca nhnh cy con bn tri v Nr l s node ca nhnh cy con bn phi, khi cy nh phn hon ton cn bng ch c th l mt trong 3 trng hp: S node nhnh cy con bn tri bng s node nhnh cy con bn phi bng (Nl = Nr ) (hnh 4.5a). S node nhnh cy con bn tri bng s node nhnh cy con bn phi cng 1 (Nl = Nr+1) (hnh 4.5b) S node nhnh cy con bn tri bng s node nhnh cy con bn phi tr 1 (Nl = Nr-1) (hnh 4.5c). A B D E C D B E
A C B
A C F
Hnh 4.5a
Hnh 4.5b
Hnh 4.5c
Cy nh phn tm kim: l mt cy nh phn hoc b rng hoc tt c cc node trn cy tha mn iu kin sau: Ni dung ca tt c cc node thuc nhnh cy con bn tri u nh hn ni dung ca node gc. Ni dung ca tt c cc node thuc nhnh cy con bn phi u ln hn ni dung ca node gc.
80
Chng 4: Cu trc d liu cy (Tree) Cy con bn tri v cy con bn phi cng t nhin hnh thnh hai cy nh phn tm kim.
20 10 10
12 8 15 25
30 37
19
29
10
22
28
40
39
30 25 37
V[0] 30
V[1] V[2] 25 37
V[3] 22
V[4] 28
V[5] V[6] 35 40
22
28
35
40
Hnh 4.7. Lu tr k tip ca cy nh phn i vi cy nh phn khng y , vic lu tr bng mng t ra khng hiu qu v chng ta phi b trng qu nhiu phn t gy lng ph b nh nh trong v d sau:
81
V[0]
25 37
V[1]
V[2]
V[3]
30
25
37
22
35
22
35
Hnh 4.8- Lu tr k tip ca cy nh phn khng y 4.3.2. Biu din cy nh phn bng danh sch mc ni Trong cch lu tr cy nh phn bng danh sch mc ni, mi node c m t bng ba loi thng tin chnh : left l mt con tr tr ti node bn tri ca cy nh phn; infor : l thng tin v node, infor c th l mt bin n hoc mt cu trc; right l mt con tr tr ti node bn phi ca cy nh phn. Trong trng hp node l node l th con tr left v con tr right c tr ti con tr NULL. i vi node lch tri, con tr right s tr ti con tr NULL, ngc li i vi node lch phi, con tr left cng s tr ti con tr NULL. Cu trc ca mt node c m t trong hnh 4.9. Left Infor Right
Hnh 4.9. m t mt node ca cy nh phn. V d: cy nh phn trong hnh 4.10 s c biu din bng danh sch lin kt nh sau:
Left 30 25 22 37 30 right
Left
25
right
Left
37
NULL
35
NULL
22
NULL
NULL
35
NULL
82
Khi ng cy nh phn
void Initialize(NODEPTR *ptree){ *ptree=NULL; }
83
To mt node l cho cy nh phn: Cp pht b nh cho node; Gn gi tr thng tin thch hp cho node; To lin kt cho node l;
NODEPTR Makenode(int p; x){ NODEPTR
p= Getnode();// cp pht b nh cho node p ->infor = x; // gn gi tr thng tin thch hp p ->left = NULL; // to lin kt tri ca node l p ->right = NULL;// to lin kt phi ca node l return(p); }
To node con bn tri ca cy nh phn: to c node con bn tri l node l ca node p, chng ta thc hin nh sau: Nu node p khng c thc (p==NULL), ta khng th to c node con bn tri ca node p; Nu node p c node con bn tri (p->left!=NULL), th chng ta cng khng th to c node con bn tri node p; Nu node p cha c node con bn tri, th vic to node con bn tri chnh l thao tc make node c xy dng nh trn;
void Setleft(NODEPTR if (p==NULL){ // nu node p khng c thc th khng th thc hin c printf(\n Node p khng c thc); delay(2000); return; } // nu node p c thc v tn ti l con bn tri th cng khng thc hin c else if ( p ->left !=NULL){ printf(\n Node p c node con bn tri); delay(2000); return; } // nu node c thc v cha c node tri p, int x ){
84
To node con bn phi ca cy nh phn: to c node con bn phi l node l ca node p, chng ta lm nh sau: Nu node p khng c thc (p==NULL), th ta khng th thc hin c thao tc thm node l vo node phi node p; Nu node p c thc (p!=NULL) v c node con bn phi th thao tc cng khng th thc hin c; Nu node p c thc v cha c node con bn phi th vic to node con bn phi node p c thc hin thng qua thao tc Makenode();
void Setright(NODEPTR p, int x ){ if (p==NULL){ // Nu node p khng c thc printf(\n Node p khng c thc); delay(2000); return; } // Nu node p c thc & c node con bn phi else if ( p ->right !=NULL){ printf(\n Node p c node con bn phi); delay(2000); return; } // Nu node p c thc & cha c node con bn phi else p ->right = Makenode(x); }
Thao tc xo node con bn tri cy nh phn Thao tc loi b node con bn tri node p c thc hin nh sau: Nu node p khng c thc th thao tc khng th thc hin; Nu node p c thc (p==NULL) th kim tra xem p c node l bn tri hay khng; Nu node p c thc v p khng c node l bn tri th thao tc cng khng th thc hin c; Nu node p c thc (p!=NULL) v c node con bn tri l q th: - Nu node q khng phi l node l th thao tc cng khng th thc hin c (q->left!=NULL || q->right!=NULL); - Nu node q l node l (q->left==NULL && q->right==NULL) th: o Gii phng node q; 85
Chng 4: Cu trc d liu cy (Tree) o Thit lp lin kt mi cho node p; Thut ton c th hin bng thao tc Delleft() nh di y:
int Delleft(NODEPTR p) { if ( p==NULL) printf(\n Node p khng c thc);delay(2000); exit(0); } q = p ->left; // q l node cn xo; x = q->infor; //x l ni dung cn xo if (q ==NULL){ // kim tra p c l bn tri hay khng printf(\n Node p khng c l bn tri); delay(2000); exit(0); } if (q->left!=NULL || q->right!=NULL) { // kim tra q c phi l node l hay khng printf(\n q khng l node l); delay(2000); exit(0); } p ->left =NULL; // to lin kt mi cho p Freenode(q); // gii phng q return(x); } NODEPTR q; int x;
Thao tc xo node con bn phi cy nh phn: Thao tc loi b node con bn phi node p c thc hin nh sau: Nu node p khng c thc th thao tc khng th thc hin; Nu node p c thc (p==NULL) th kim tra xem p c node l bn phi hay khng; Nu node p c thc v p khng c node l bn phi th thao tc cng khng th thc hin c; Nu node p c thc (p!=NULL) v c node con bn phi l q th: - Nu node q khng phi l node l th thao tc cng khng th thc hin c (q->left!=NULL || q->right!=NULL); - Nu node q l node l (q->left==NULL && q->right==NULL) th: o Gii phng node q; o Thit lp lin kt mi cho node p; Thut ton c th hin bng thao tc Delright() nh di y:
86
Thao tc tm node c ni dung l x trn cy nh phn: tm node c ni dung l x trn cy nh phn, chng ta c th xy dng bng th tc qui nh sau: Nu node gc (proot) c ni dung l x th proot chnh l node cn tm; Nu proot =NULL th khng c node no trong cy c ni dung l x; Nu ni dung node gc khc x (proot->infor!=x) v proot!=NULL th: Tm node theo nhnh cy con bn tri (proot = proot->left); Tm theo nhnh cy con bn phi; Thut ton tm mt node c ni dung l x trong cy nh phn c th hin nh sau:
NODEPTR Search( NODEPTR proot, int x) { NODEPTR p; if ( proot ->infor ==x) // iu kin dng return(proot); if (proot ==NULL) return(NULL); p = Search(proot->left, x); // tm trong nhnh con bn tri if (p ==NULL) // Tm trong nhnh con bn phi Search(proot->right, x);
87
A B D E F C G
Hnh 4.11. m t phng php duyt cy nh phn 4.5.1. Duyt theo th t trc (Preorder Travesal) Nu cy rng th khng lm g; Nu cy khng rng th : Thm node gc ca cy; Duyt cy con bn tri theo th t trc; Duyt cy con bn phi theo th t trc; V d: vi cy trong hnh 4.11 th php duyt Preorder cho ta kt qu duyt theo th t cc node l :A -> B -> D -> E -> C -> F -> G. Vi phng php duyt theo th t trc, chng ta c th ci t cho cy c nh ngha trong mc 4.4 bng mt th tc qui nh sau:
void Pretravese ( NODEPTR proot ) { if ( proot !=NULL) { // nu cy khng rng printf(%d, proot->infor); // duyt node gc Pretravese(proot ->left); // duyt nhnh cy con bn tri Pretravese(proot ->right); // Duyt nhnh con bn phi } }
88
Chng 4: Cu trc d liu cy (Tree) 4.5.2. Duyt theo th t gia (Inorder Travesal) Nu cy rng th khng lm g; Nu cy khng rng th : Duyt cy con bn tri theo th t gia; Thm node gc ca cy; Duyt cy con bn phi theo th t gia; V d : cy trong hnh 4.11 th php duyt Inorder cho ta kt qu duyt theo th t cc node l :D -> B -> E -> A -> F -> C -> G. Vi cch duyt theo th t gia, chng ta c th ci t cho cy c nh ngha trong mc 4.4 bng mt th tc qui nh sau:
void Intravese ( NODEPTR proot ) { if ( proot !=NULL) { // nu cy khng rng Intravese(proot ->left); // duyt nhnh cy con bn tri printf(%d, proot->infor); // duyt node gc Intravese(proot ->right); // Duyt nhnh con bn phi } }
Nu cy rng th khng lm g;
Nu cy khng rng th : Duyt cy con bn tri theo th t sau; Duyt cy con bn phi theo th t sau; Thm node gc ca cy; V d: cy trong hnh 4.11 th php duyt Postorder cho ta kt qu duyt theo th t cc node l :D -> E -> B -> F -> G-> C -> A . Vi cch duyt theo th t gia, chng ta c th ci t cho cy c nh ngha trong mc 4.4 bng mt th tc qui nh sau:
void Posttravese ( NODEPTR proot ) { if ( proot !=NULL) { // nu cy khng rng Posttravese(proot ->left); // duyt nhnh cy con bn tri Posttravese(proot ->right); // duyt nhnh con bn phi printf(%d, proot->infor); // duyt node gc } }
89
Thao tc chn thm node (Insert): thm node x vo cy nh phn tm kim, ta thc hin nh sau: Nu x trng vi gc th khng th thm node Nu x < gc v cha c l con bn tri th thc hin thm node vo nhnh bn tri. Nu x > gc v cha c l con bn phi th thc hin thm node vo nhnh bn phi.
void Insert(NODEPTR proot, int x){ if (x==proot->infor){ printf("\n Noi dung bi trung"); delay(2000);return; } else if(x<proot->infor && proot->left==NULL){ Setleft(proot,x);return;
90
Thao tc loi b node (Remove): Vic xo node trn cy nh phn tm kim kh phc tp. V sau khi xo node, chng ta phi iu chnh li cy n vn l cy nh phn tm kim. Khi xo node trn cy nh phn tm kim th node cn xo b c th mt trong 3 trng hp sau: Trng hp 1: nu node p cn xo l node l hoc node gc th vic loi b c thc hin ngay. Trng hp 2: nu node p cn xo c mt cy con th ta phi ly node con ca node p thay th cho p. Trng hp 3: node p cn xo c hai cy con. Nu node cn xo pha cy con bn tri th node bn tri nht s c chn lm node th mng, nu node cn xo pha cy con bn phi th node bn phi nht s c chn lm node th mng. Thut ton loi b node trn cy nh phn tm kim c th hin nh sau:
NODEPTR Remove(NODEPTR p){ NODEPTR rp,f; if(p==NULL){ printf("\n Nut p khong co thuc"); delay(2000);return(p); } if(p->right==NULL) rp=p->left; else { if (p->left==NULL) rp = p->right; else { f=p; rp=p->right; while(rp->left!=NULL){ f=rp; rp=rp->left; } if(f!=p){ f->left =rp->right;
91
struct node
92
93
94
95
96
97
nh ngha cy, cy nh phn, cy cn bng v cy hon ton cn bng. Cc khi nim mc, su ca cy. Cc phng php duyt cy: duyt theo th t trc, duyt theo th t gia v duyt theo th t sau. Phn bit c nhng thao tc ging nhau v khc nhau cy nh phn tm kim v cy nh phn thng thng. Tm hiu thm v cy nhiu nhnh trong cc ti liu [1], [2]. Tm hiu thm v cy quyt nh v ng dng ca n trong biu din tri thc.
98
BI TP CHNG 4
Bi 1. Mt cy nh phn c gi l cy nh phn ng nu node gc ca cy v cc node trung gian u c hai node con (ngoi tr node l). Chng minh rng, nu cy nh phn ng c n node l th cy ny c tt c 2n-1 node. Hy to lp mt cy nh phn bt k, sau kim tra xem nu cy khng phi l cy nh phn ng hy tm cch b sung vo mt s node cy tr thnh cy hon ton ng. Lm tng t nh trn vi thao tc loi b node. Bi 2. Mt cy nh phn c gi l cy nh phn y vi chiu su d (d nguyn dng) khi v ch khi mc i (0id) cy c ng 2i node. Hy vit chng trnh kim tra xem mt cy nh phn c phi l mt cy y hay khng? Nu cy cha phi l cy nh phn y, hy tm cch b xung mt s node vo cy nh phn n tr thnh cy nh phn y. Bi 3. Mt cy nh phn c gi l cy nh phn gn y vi su d nu vi mi mc i (0id-1) n c ng 2i node. Cho cy nh phn bt k, hy kim tra xem n c phi l cy nh phn gn y hay khng ? Bi 4. Hy xy dng cc thao tc sau trn cy nh phn: To lp cy nh phn; m s node ca cy nh phn; Xc nh chiu su ca cy nh phn; Xc nh s node l ca cy nh phn; Xc nh s node trung gian ca cy nh phn; Xc nh s node trong tng mc ca cy nh phn; Xy dng tp thao tc tng t nh trn i vi cc nhnh cy con; Thm mt node vo node phi ca mt node; Thm node vo node tri ca mt node; Loi b node phi ca mt node; Loi b node tri ca mt node; Loi b c cy; Duyt cy theo th t trc; Duyt cy theo th gia; Duyt cy theo th t sau;
99
Chng 4: Cu trc d liu cy (Tree) Bi 5. Cho file d liu cay.in c t chc thnh tng dng, trn mi dng ghi li mt t l ni dung node ca mt cy nh phn tm kim. Hy xy dng cc thao tc sau cho cy nh phn tm kim: To lp cy nh phn tm kim vi node gc l t u tin trong file d liu cay.in. Xc nh s node trn cy nh phn tm kim; Xc nh chiu su ca cy nh phn tm kim; Xc nh s node nhnh cy bn tri; Xc nh s node nhnh cy con bn phi; Xc nh s node trung gian; Xc nh s node l; Tm node c di ln nht; Thm node; Loi b node; Loi b c cy; Duyt cy theo th t trc; Duyt cy theo th t gia; Duyt cy theo th t sau; Cho cy nh phn bt k hy xy dng chng trnh xc nh xem: Cy c phi l cy nh phn ng hay khng? Cy c phi l cy nh phn y hay khng ? Cy c phi l cy nh phn gn y hay khng? Cy c phi l cy nh phn hon ton cn bng hay khng? Cy c phi l cy nh phn tm kim hay khng ?
Bi 6. Cho tam gic s c biu din nh hnh di y. Hy vit chng trnh tm dy cc s c tng ln nht trn con ng t nh v kt thc ti u y. Bit rng, mi bc i c th i cho xung pha tri hoc cho xung pha phi. S lng hng trong tam gic l ln hn 1 nhng nh hn 100; cc s trong tam gic u l cc s t 0 . .99.
100
7 3 8 2 4 5 7 2 1 4 6 8 0 4 5
D liu vo cho bi file cay.in, dng u tin ghi li s t nhin n l s lng hng trong tam gic, n hng tip theo ghi li tng hng mi phn t c phn bit vi nhau bi mt hoc vi du trng. Kt qu ghi li trong file cay.out dng u tin ghi li tng s ln nht tm c, dng k tip ghi li dy cc s c tng ln nht. V d vi hnh trn file input & output nh sau: cay.in 5 7 2 8 2 4 cay.out 30 7 3 8 7 5 8 1 7 5 0 4 2 4 6 5
Bi 7. Cho cy nh phn s hon ton cn bng:(s node bn nhnh cy con bn tri ng bng s node nhnh cy con bn phi, mc th i c ng 2i node) nh hnh sau: 7 9 0 6 3 2 1
Bi 8. Hy tm dy cc node xut pht t gc ti mt node l no sao cho tng gi tr ca cc node l ln nht, bit rng mi bc i ch c php i cho sang node tri hoc cho theo node phi. D liu vo cho bi file cay.in, dng u tin ghi li s t nhin n 50 l s cc mc ca cy, n dng k tip mi dng ghi li dy cc s l cc 101
Chng 4: Cu trc d liu cy (Tree) node trn mi mc. Kt qu ghi li trong file cay.out theo th t, dng u l tng ln nht ca hnh trnh, dng k tip l dy cc node trong hnh trnh. V d: vi hnh trn file input & output c t chc nh sau: cay.in 3 7 9 0 cay.out 22 7 9 6 2 6 3 1
102
Chng 5: th (Graph)
CHNG 5: TH (GRAPH)
th l mt cu trc d liu ri rc nhng li c ng dng hin i. th c th dng biu din cc s ca mt mch in, biu din ng i ca h thng giao thng hay cc loi mng my tnh. Nm bt c nhng thut ton trn th gip chng ta gii quyt c nhiu bi ton ti u quan trng nh bi ton qui hoch mng, bi ton phn lung trn mng hay phn lung giao thng, bi ton tm ng i ngn nht hoc cc tiu ho chi ph cho cc hot ng sn xut kinh doanh. Nhng ni dung c trnh by bao gm: nh ngha th, phn loi d th v nhng khi nim c bn lin quan. Cc phng php biu din th trn my tnh. Cc thut ton tm kim trn th. th Euler & th hamilton. Bi ton tm cy bao trm nh nht. Bi ton tm ng i ngn nht Bn c c th tm thy nhng ci t c th v nhng kin thc su hn v L thuyt th trong ti liu [1] & [3].
103
Chng 5: th (Graph) loi mng my tnh bao gm: mi my tnh l mt nh, mi cnh l nhng knh in thoi c ni gia hai my tnh vi nhau. Hnh 5.1 l s ca mng my tnh loi 1.
San Francisco
Detroit
Chicago
New York
Denver Los Angeles Washington Hnh 5.1. Mng my tnh n knh thoi. Trong mng my tnh ny, mi my tnh l mt nh ca th, mi cnh v hng biu din cc nh ni hai nh phn bit, khng c hai cp nh no ni cng mt cp nh. Mng loi ny c th biu din bng mt n th v hng. nh ngha 1. n th v hng G = <V, E> bao gm V l tp cc nh, E l tp cc cp c th t gm hai phn t khc nhau ca V gi l cc cnh. Trong trng hp gia hai my tnh no thng xuyn truyn ti nhiu thng tin, ngi ta ni hai my tnh bi nhiu knh thoi khc nhau. Mng my tnh a knh thoi c th c biu din nh hnh 5.2. San Francisco Detroit
Chicago
New York
Denver Los Angeles Washington Hnh 5.2. Mng my tnh a knh thoi. Trn hnh 5.2, gia hai my tnh c th c ni vi nhau bi nhiu hn mt knh thoi. Vi mng loi ny, chng ta khng th dng n th v hng biu din. th loi ny l a th v hng. nh ngha 2. a th v hng G = <V, E> bao gm V l tp cc nh, E l h cc cp khng c th t gm hai phn t khc nhau ca V gi l tp cc cnh. e1, e2 c gi l cnh lp nu chng cng tng ng vi mt cp nh.
104
Chng 5: th (Graph) R rng, mi n th u l a th, nhng khng phi a th no cng l n th v gia hai nh c th c nhiu hn mt cnh ni gia chng vi nhau. Trong nhiu trng hp, c my tnh c th ni nhiu knh thoi vi chnh n. Vi loi mng ny, ta khng th dng a th biu din m phi dng gi th v hng. Gi th v hng c m t nh trong hnh 5.3. nh ngha 3. Gi th v hng G = <V, E> bao gm V l tp nh, E l h cc cp khng c th t gm hai phn t (hai phn t khng nht thit phi khc nhau) trong V c gi l cc cnh. Cnh e c gi l khuyn nu c dng e =(u, u), trong u l nh no thuc V. San Francisco Detroit
Chicago
New York
Hnh 5.3. Mng my tnh a knh thoi c khuyn. Trong nhiu mng, cc knh thoi ni gia hai my tnh c th ch c php truyn tin theo mt chiu. Chng hn my tnh t ti San Francisco c php truy nhp ti my tnh t ti Los Angeles, nhng my tnh t ti Los Angeles khng c php truy nhp ngc li San Francisco. Hoc my tnh t ti Denver c th truy nhp c ti my tnh t ti Chicago v ngc li my tnh t ti Chicago cng c th truy nhp ngc li my tnh ti Denver. m t mng loi ny, chng ta dng khi nim n th c hng. n th c hng c m t nh trong hnh 5.4. San Francisco Detroit
Chicago
New York
Denver Los Angeles Hnh 5.4. Mng my tnh c hng. nh ngha 4. n th c hng G = <V, E> bao gm V l tp cc nh, E l tp cc cp c th t gm hai phn t ca V gi l cc cung. Washington
105
Chng 5: th (Graph) th c hng trong hnh 5.4 khng cha cc cnh bi. Nn i vi cc mng a knh thoi mt chiu, th c hng khng th m t c m ta dng khi nim a th c hng. Mng c dng a th c hng c m t nh trong hnh 5.5. San Francisco Detroit
Chicago
New York
Denver Los Angeles Washington Hnh 5.5. Mng my tnh a knh thoi mt chiu. nh ngha 5. a th c hng G = <V, E> bao gm V l tp nh, E l cp c th t gm hai phn t ca V c gi l cc cung. Hai cung e1, e2 tng ng vi cng mt cp nh c gi l cung lp. T nhng dng khc nhau ca th k trn, chng ta thy s khc nhau gia cc loi th c phn bit thng qua cc cnh ca th c th t hay khng c th t, cc cnh bi, khuyn c c dng hay khng. 5.1.2. Mt s thut ng c bn ca th nh ngha 1. Hai nh u v v ca th v hng G =<V, E> c gi l k nhau nu (u,v) l cnh thuc th G. Nu e =(u, v) l cnh ca th G th ta ni cnh ny lin thuc vi hai nh u v v, hoc ta ni cnh e ni nh u vi nh v, ng thi cc nh u v v s c gi l nh u ca cnh (u,v). nh ngha 2. Ta gi bc ca nh v trong th v hng l s cnh lin thuc vi n v k hiu l deg(v). b c d
Hnh 5.6 th v hng G. V d 1. Xt th trong hnh 5.6, ta c deg(a) = 2, deg(b) =deg(c) = deg(f) = 4, deg(e) = 3, deg(d) = 1, deg(g)=0.
106
Chng 5: th (Graph) nh bc 0 c gi l nh c lp. nh bc 1 c gi l nh treo. Trong v d trn, nh g l nh c lp, nh d l nh treo. nh ngha 3. Nu e=(u,v) l cung ca th c hng G th ta ni hai nh u v v l k nhau, v ni cung (u, v) ni nh u vi nh v hoc cng ni cung ny i ra khi nh u v i vo nh v. nh u (v) s c gi l nh u (cui) ca cung (u,v). 5.1.3. ng i, chu trnh, th lin thng nh ngha 1. ng i di n t nh u n nh v trn th v hng G=<V,E> l dy x0, x1, . . ., xn-1, xn trong n l s nguyn dng, x0=u, xn =v, (xi, xi+1)E, i =0, 1, 2,. . ., n-1. ng i nh trn cn c th biu din thnh dy cc cnh (x0, x1), (x1,x2) , . . ., (xn-1, xn). Ta gi nh u l nh u, nh v l nh cui ca ng i. ng i c nh u trng vi nh cui (u=v) c gi l chu trnh. ng i hay chu trnh c gi l n nu nh khng c cnh no lp li. V d 3. Tm cc ng i, chu trnh trong th v hng nh trong hnh 5.7. D dng nhn thy (a, d, c, f, e) l ng i n di 4, (d, e, c, a) khng l ng i v (e,c) khng phi l cnh ca th. Dy (b, c, f, e, b) l chu trnh di 4. ng i (a, b, e, d, a, b) c di 5 khng phi l ng i n v cnh (a,b) c mt hai ln. a b c
Hnh 5.7. ng i trn th. Khi nim ng i v chu trnh trn th c hng c nh ngha hon ton tng t, ch c iu khc bit duy nht l ta phi ch ti cc cung ca th. nh ngha 3. th v hng (c hng) c gi l lin thng nu lun tm c ng i gia hai nh bt k ca n.
Chng 5: th (Graph) Xt n th v hng G =<V, E>, vi tp nh V = {1, 2, . . ., n}, tp cnh E = {e1, e2, . . ., em}. Ta gi ma trn k ca th G l ma trn c cc phn t hoc bng 0 hoc bng 1 theo qui nh nh sau: A = { aij: aij = 1 nu (i, j) E, aij = 0 nu (i,j) E; i, j =1, 2, . . ., n}. V d 1. Biu din th trong hnh 5.8 di y bng ma trn k. 2 1 4 1 6 2 3 3 5 4 5 6 Ma trn k c nhng tnh cht sau: a. Ma trn k ca th v hng l ma trn i xng A[i,j] = A[j, i]; i, j = 1, 2, . . . n. Ngc li, mi (0, 1) ma trn cp n ng cu vi mt n th v hng n nh; b. Tng cc phn t theo dng i ( ct j) ca ma trn k chnh bng bc nh i (nh j); c. Nu k hiu 1 0 1 1 0 0 0 2 1 0 1 1 0 0 3 1 1 0 0 1 0 4 0 1 0 0 1 1 5 0 0 1 1 0 1 6 0 0 0 1 1 0
108
Chng 5: th (Graph) Trong rt nhiu ng dng khc nhau ca l thuyt th, mi cnh e =(u,v) ca n c gn bi mt s c(e) = d(u,v) gi l trng s ca cnh e. th trong trng hp nh vy gi l th trng s. Trong trng hp , ma trn k ca th c thay bi ma trn trng s c= { c[i,j], i, j= 1, 2, . . ., n. c[i,j] = d(i,j) nu (i, j) E, c[i,j] = nu (i, j) E. Trong , nhn cc gi tr: 0, , - tu theo tng tnh hung c th ca thut ton. V d 3. Ma trn k ca th c trng s trong hnh 5.10. 2 3 1 7 3 3 5 9 6 6 8 4 5 1 6 2 3 4 1 0 3 7 0 0 0 2 3 0 6 6 0 0 3 7 6 0 0 3 0 4 0 6 0 0 8 5 5 0 0 3 8 0 9 6 0 0 0 5 9 0
u im ca phng php biu din th bng ma trn k (hoc ma trn trng s) l ta d dng tr li c cu hi: Hai nh u, v c k nhau trn th hay khng v chng ta ch mt ng mt php so snh. Nhc im ln nht ca n l bt k th c bao nhiu cnh ta u mt n2 n v b nh lu tr th. 5.2.2. Danh sch cnh (cung ) Trong trng hp th tha ( th c s cnh m 6n), ngi ta thng biu din th di dng danh sch cnh. Trong php biu din ny, chng ta s lu tr danh sch tt c cc cnh (cung) ca th v hng (c hng). Mi cnh (cung) e(x, y) c tng ng vi hai bin dau[e], cuoi[e]. Nh vy, lu tr th, ta cn 2m n v b nh. Nhc im ln nht ca phng php ny l nhn bit nhng cnh no k vi cnh no chng ta cn m php so snh trong khi duyt qua tt c m cnh (cung) ca th. Nu l th c trng s, ta cn thm m n v b nh lu tr trng s ca cc cnh. V d 4. Danh sch cnh (cung) ca th v hng, th c hng, th trng s: Dau 1 1 2 2 3 4 4 5 Cuoi 2 3 3 4 5 5 6 6 Dau 1 1 2 2 3 5 Cuoi 2 3 4 5 4 1 Dau 1 1 2 2 3 4 4 5 Cuoi 2 3 3 4 5 5 6 6 Trongso 3 7 6 6 3 8 5 9
th c hng 109
Chng 5: th (Graph) 5.2.3. Danh sch k Trong rt nhiu ng dng, cch biu din th di dng danh sch k thng c s dng. Trong biu din ny, vi mi nh v ca th chng ta lu tr danh sch cc nh k vi n m ta k hiu l Ke(v), ngha l Ke(v) = { u V: (u, v)E}, Vi cch biu din ny, mi nh i ca th, ta lm tng ng vi mt danh sch tt c cc nh k vi n v c k hiu l List(i). biu din List(i), ta c th dng cc kiu d liu kiu tp hp, mng hoc danh sch lin kt. V d 5. Danh sch k ca th v hng trong hnh 5.8, th c hng trong hnh 5.9 c biu din bng danh sch k nh sau: List(i) nh 1 2 3 4 5 6 2 1 1 2 3 4 3 3 2 5 4 5 4 5 6 6 nh 1 2 3 5 List(i) 3 4 4 1 2 5
110
Chng 5: th (Graph)
Thm_nh(v); chuaxet[v] = FALSE; for u ke(v) { if (chuaxet[u] ) DFS( v); } }
Th tc DFS() s thm tt c cc nh cng thnh phn lin thng vi v mi nh ng mt ln. m bo duyt tt c cc nh ca th (c th c nhiu thnh phn lin thng), chng ta ch cn thc hin :
for( i=1; in; i++) chuaxet[i] = TRUE; for( i:=1;i n; i++) if (chuaxet[i] ) DFS( i);
Ch : Thut ton tm kim theo chiu su d dng p dng cho th c hng. i vi th c hng, chng ta ch cn thay cc cnh v hng bng cc cung ca th c hng. V d 1. p dng thut ton tm kim theo chiu su vi th trong hnh sau: 2 6 8 7 1 3 11 9 4 5 10
12
Kt qu duyt:
5.3.2. Thut ton tm kim theo chiu rng (Breadth First Search) rng, vi thut ton tm kim theo chiu su, nh thm cng mun s tr thnh nh sm c duyt xong. l kt qu tt yu v cc nh thm c np vo stack trong th tc qui. Khc vi thut ton tm kim theo chiu su, thut ton tm kim theo chiu rng thay th vic s dng stack bng hng i queue. Trong th tc ny, nh c np vo hng i u tin l v, cc nh k vi v l v1, v2, . . ., vk c np vo queue k tip. Qu trnh c thc tng t vi cc nh trong hng i. Thut ton dng khi ta duyt ht cc nh k vi nh trong hng i. Chng ta c th m t thut ton bng th tc BFS nh di y.
111
Chng 5: th (Graph)
chuaxet- mng kim tra cc nh xt hay cha; queue hng i lu tr cc nh s c duyt ca th; void BFS(int u){ queue = ; u <= queue; (*np u vo hng i*) chuaxet[u] = false; while (queue ){ queue<=p; (* ly p ra t stack*) Thm_nh(p); for v ke(p) { if (chuaxet[v] ) { v<= queue; (*np v vo hng i*) chuaxet[v] = false; } } }
Th tc BFS s thm tt c cc nh dng thnh phn lin thng vi u. thm tt c cc nh ca th, chng ta ch cn thc hin gi ti th tc BFS().
for( u=1; un; u++) chuaxet[u] = TRUE; for(u=1; un; u++) if (chuaxet[u]) BFS(u);
V d. p dng thut ton tm kim theo chiu rng vi th trong hnh 5.11 ta nhn c kt qu nh sau: 1, 2, 3, 11, 4, 6, 12, 13, 7, 8, 9, 10, 5; 5.3.3. Kim tra tnh lin thng ca th Mt th c th lin thng hoc c th khng lin thng. Nu th l lin thng (s thnh phn lin thng l 1), chng ta ch cn gi ti th tc DFS() hoc BFS() mt ln. Nu th l khng lin thng, khi s thnh phn lin thng ca th chnh bng s ln gi ti th tc BFS() hoc DFS(). xc nh s cc thnh phn lin thng ca th, chng ta s dng mt bin mi solt nghi nhn cc nh cng mt thnh phn lin thng trong mng chuaxet: - Nu nh i cha c duyt, chuaxet[i] c gi tr 0; - Nu nh i c duyt thuc thnh phn lin thng th j=solt, ta ghi nhn chuaxet[i]=solt; - Cc nh cng thnh phn lin thng nu chng c cng gi tr trong mng chuaxet.
void BFS(int u){
112
Chng 5: th (Graph)
queue= ; u <= queue; (*np u vo hng i*) solt = solt+1; chuaxet[u] = solt;(*solt l bin ton cc thit lp gi tr 0*) while (queue ) { queue<=p; (* ly p ra t stack*) Thm_nh(p); for v ke(p) { if (chuaxet[v] ){ v<= queue; (*np v vo hng i*) chuaxet[v] = solt; } } } }
5.3.4. Tm ng i gia hai nh bt k ca th Th tc BFS(s) hoc DFS(s) cho php ta duyt cc nh cng mt thnh phn lin thng vi nh s. Nh vy, nu trong s cc nh lin thng vi s cha t th chc chn c ng i t nh s n nh t. Nu trong s cc nh lin thng vi nh s khng cha nh t th khng tn ti ng i t nh s n nh t. Do vy, chng ta ch cn gi ti th tc DFS(s) hoc BFS(s) v kim tra xem nh t c thuc thnh phn lin thng vi s hay khng. Di y l ton vn chng trnh tm ng i gia hai nh ca th.
#include <stdio.h> #include <conio.h> #include <io.h> #include <stdlib.h> #include <dos.h> #define MAX #define TRUE #define FALSE 100 1 0int n, truoc[MAX], chuaxet[MAX], queue[MAX];
int A[MAX][MAX]; int s, t; /* Breadth First Search */ void Init(void){ FILE *fp; int i, j; fp=fopen("lienth.IN", "r"); if(fp==NULL){ printf("\n Khong co file input"); delay(2000);return; } fscanf(fp,"%d", &n); printf("\n So dinh do thi:%d",n);
113
Chng 5: th (Graph)
printf("\n Ma tran ke cua do thi:"); for(i=1; i<=n;i++){ printf("\n"); for(j=1; j<=n;j++){ fscanf(fp,"%d", &A[i][j]); printf("%3d", A[i][j]); } } for(i=1; i<=n;i++){ chuaxet[i]=TRUE; truoc[i]=0; } } void Result(void){ printf("\n\n"); if(truoc[t]==0){ printf("\n Khong co duong di tu %d den %d",s,t); getch(); return; } printf("\n Duong di tu %d den %d la:",s,t); int j = t;printf("%d<=", t); while(truoc[j]!=s){ printf("%3d<=",truoc[j]); j=truoc[j]; } printf("%3d",s); } void In(void){ printf("\n\n"); for(int i=1; i<=n; i++) printf("%3d", truoc[i]); } void BFS(int s) { int dauQ, cuoiQ, p, u;printf("\n"); dauQ=1;cuoiQ=1; queue[dauQ]=s;chuaxet[s]=FALSE; while (dauQ<=cuoiQ){ u=queue[dauQ]; dauQ=dauQ+1; printf("%3d",u); for (p=1; p<=n;p++){
114
Chng 5: th (Graph)
if(A[u][p] && chuaxet[p]){ cuoiQ=cuoiQ+1;queue[cuoiQ]=p; chuaxet[p]=FALSE;truoc[p]=u; } } } } void duongdi(void){ int chuaxet[MAX], truoc[MAX], queue[MAX]; Init();BFS(s);Result(); } void main(void){ clrscr(); printf("\n Dinh dau:"); scanf("%d",&s); printf("\n Dinh cuoi:"); scanf("%d",&t); Init();printf("\n");BFS(s); n();getch(); Result();getch(); }
d G1
d G2
c G3
Hnh 5.12. th v hng G1, G2, G3. th G1 l th Euler v n c chu trnh Euler a, e, c, d, e, b, a. th G3 khng c chu trnh Euler nhng cha ng i Euler a, c, d, e, b, d, a, b v th G3 l na Euler. G2 khng c chu trnh Euler cng nh ng i Euler.
115
Chng 5: th (Graph) nh l. th v hng lin thng G=<V, E> l th Euler khi v ch khi mi nh ca G u c bc chn. th v hng lin thng G=<V, E> l th na Euler khi v ch khi n khng c qu hai nh bc l. tm mt chu trnh Euler, ta thc hin theo thut ton sau: To mt mng CE ghi ng i v mt stack xp cc nh ta s xt. Xp vo mt nh tu u no ca th, ngha l nh u s c xt u tin. Xt nh trn cng ca ngn xp, gi s nh l nh v; v thc hin: Nu v l nh c lp th ly v khi ngn xp v a vo CE; Nu v l lin thng vi nh x th xp x vo ngn xp sau xo b cnh (v, x); Quay li bc 2 cho ti khi ngn xp rng th dng. Kt qu ng i Euler c cha trong CE theo th t ngc li. Th tc Euler_Cycle sau s cho php ta tm chu trnh Euler.
void Euler_Cycle(int u){ Stack=; CE=; u=>Stack; { np u vo stack}; while (Stack) { x= top(Stack); { x l phn t u stack } if (ke(x) ) { y = nh u trong danh sch ke(x); Stack<=y; { np y vo Stack}; Ke(x) = Ke(x) \{y}; Ke(y) = Ke(y)\{x}; {loi cnh (x,y) khi th}; } else { x<= Stack; {ly x ra khi stack}; CE <=x; { np x vo CE;} } }
Chng 5: th (Graph) Cc bc thc hin theo thut ton s cho ta kt qu sau: Bc Gi tr trong stack Gi tr trong CE Cnh cn li 1 F 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 2 f, a 2, 3, 4, 5, 6, 7, 8, 9, 10 3 f, a, c 3, 4, 5, 6, 7, 8, 9, 10 4 f,a,c,f 3, 4, 5, 6, 7, 9, 10 5 f, a, c f 3, 4, 5, 6, 7, 9, 10 6 f, a, c, b f 3, 4, 6, 7, 9, 10 7 f, a, c, b, d f 3, 4, 7, 9, 10 8 f, a, c, b, d,c f 3, 4, 7, 10 9 f, a, c, b, d f, c 3, 4, 7, 10 10 f, a, c, b, d, e f, c 3, 4, 7 11 f, a, c, b, d, e, b f, c 3, 4 12 f, a, c, b, d, e, b, a f, c 3 13 f, a, c, b, d, e, b, a, d f, c 14 f, a, c, b, d, e, b, a f, c, d 15 f, a, c, b, d, e, b f,c,d,a 16 f, a, c, b, d, e f,c,d,a,b 17 f, a, c, b, d f,c,d,a,b,e 18 f, a, c, b f,c,d,a,b,e,d 19 f, a, c f,c,d,a,b,e,d,b 20 f, a f,c,d,a,b,e,d,b,c 21 f f,c,d,a,b,e,d,b,c,a 22 f,c,d,a,b,e,d,b,c,a,f Mt th khng c chu trnh Euler nhng vn c th c ng i Euler. Khi , th c ng hai nh bc l, tc l tng cc s cnh xut pht t mt trong hai nh l s l. Mt ng i Euler phi xut pht t mt trong hai nh v kt thc nh kia. Nh vy, thut ton tm ng i Euler ch khc vi thut ton tm chu trnh Euler ch ta phi xc nh im xut pht ca ng i. tm tt c cc ng i Euler ca mt th n nh, m cnh, ta c th dng k thut qui nh sau: Bc 1. To mng b c di m + 1 nh mt ngn xp cha ng i. t b[0]=1, i=1 (xt nh th nht ca ng i); Bc 2. Ln lt cho b[i] cc gi tr l nh k vi b[i-1] m cnh (b[i-1],b[i]) khng trng vi nhng cnh dng t b[0] n b[i-1]. Vi mi gi tr ca b[i], ta kim tra: Nu i<m th tng i ln 1 n v (xt nh tip theo) v quay li bc 2. Nu i=m th dy b chnh l mt ng i Euler. 117
Chng 5: th (Graph)
b G1
d G2
d G3
Hnh 5.14. th thi hamilton G3, na Hamilton G2 v G1. Cho n nay, vic tm ra mt tiu chun nhn bit th Hamilton vn cn m, mc d y l vn trung tm ca l thuyt th. Hn th na, cho n nay cng vn cha c thut ton hiu qu kim tra mt th c phi l th Hamilton hay khng. lit k tt c cc chu trnh Hamilton ca th, chng ta c th s dng thut ton sau:
void Hamilton(int k){ (* Lit k cc chu trnh Hamilton ca th bng cch pht trin dy nh (X[1], X[2], . . ., X[k-1] ) ca th G = (V, E) *) for y Ke(X[k-1]) { if ((k==n+1) && (y == v0)) Ghinhan(X[1], X[2], . . ., X[n], v0); else { X[k]=y; chuaxet[y] = false; Hamilton(k+1); chuaxet[y] = true; }; }
118
Chng 5: th (Graph)
T1
T3
Cy c coi l dng th n gin nht ca th. nh l sau y cho ta mt s tnh cht ca cy. nh l. Gi s G=<V, E> l th v hng n nh. Khi nhng khng nh sau l tng ng a. G l mt cy. b. G l th v hng lin thng khng c chu trnh. c. G lin thng v c ng n-1 cnh. d. Gia hai nh bt k ca G c ng mt ng i. e. G lin thng v mi cnh ca n u l cu. f. G khng cha chu trnh nhng h c thm vo n mt cnh ta thu c ng mt chu trnh. nh ngha 2. Cho G l th v hng lin thng. Ta gi th con T ca G l mt cy bao trm hay cy khung nu T tho mn hai iu kin: g. T l mt cy; h. Tp nh ca T bng tp nh ca G. i vi cy bao trm, chng ta quan tm ti nhng bi ton c bn sau: Bi ton 1. Cho G=<V, E> l th v hng lin thng. Hy xy dng mt cy bao trm ca G.
119
Chng 5: th (Graph) Bi ton 2. Cho G = <V, E> l th v hng lin thng c trng s. Hy tm cy bao trm nh nht ca G. 5.6.2. Tm mt cy bao trm trn th tm mt cy bao trm trn th v hng lin thng, c th s dng k thut tm kim theo chiu rng hoc tm kim theo chiu su thc hin. Gi s ta cn xy dng mt cy bao trm xut pht ti nh u no . Trong c hai trng hp, mi khi ta n c nh v tc (chuaxet[v] = true) t nh u th cnh (u,v) c kt np vo cy bao trm. Hai k thut ny c th hin trong hai th tc STREE_DFS(u) v STREE_BFS(v) nh sau:
void STREE_DFS( int u){ /* Tm kim theo chiu su, p dng cho bi ton xy dng cy bao trm ca th v hng lin thng G=(V, E); cc bin chuaxet, Ke, T l ton cc */ chuaxet[u] = true; for v Ke(u) { if (chuaxet[v]){ T = T (u,v); STREE_DFS(v); } } } void STREE_BFS(int u) { QUUE=; QUEUE<= u; /* a u vo hng i*/ chuaxet[u] = false; while (QUEUE ) { v<= QUEUE; /* ly v khi hng i */ for p Ke(v) { if (chuaxet[u]) { QUEUE<= u; chuaxet[u] = false; T = T(v, p); } } } } /* Main program */ for u V { chuaxet[u] = true; T = ; STREE_BFS(root); }
120
Chng 5: th (Graph) 5.6.3. Tm cy bao trm ngn nht Bi ton tm cy bao trm nh nht l mt trong nhng bi ton ti u trn th c ng dng trong nhiu lnh vc khc nhau ca thc t. Bi ton c pht biu nh sau: Cho G=<V, E> l th v hng lin thng vi tp nh V = {1, 2, . . ., n } v tp cnh E gm m cnh. Mi cnh e ca th c gn vi mt s khng m c(e) c gi l di ca n. Gi s H = <V, T> l mt cy bao trm ca th G. Ta gi di c(H) ca cy bao trm H l tng di cc cnh ca n: c( H ) = c(e) . Bi ton c t ra l,
eT
trong s cc cy khung ca th hy tm cy khung c di nh nht ca th. gii bi ton cy bao trm nh nht, chng ta c th lit k ton b cy bao trm v chn trong s mt cy nh nht. Phng n nh vy thc s khng kh thi v s cy bao trm ca th l rt ln c nn-2, iu ny khng th thc hin c vi th vi s nh c chc. tm mt cy bao trm chng ta c th thc hin theo cc bc nh sau: Bc 1. Thit lp tp cnh ca cy bao trm l . Chn cnh e = (i, j) c di nh nht b sung vo T. Bc 2. Trong s cc cnh thuc E \ T, tm cnh e = (i1, j1) c di nh nht sao cho khi b sung cnh vo T khng to nn chu trnh. thc hin iu ny, chng ta phi chn cnh c di nh nht sao cho hoc i1 T v j1 T, hoc j1 T v i1 T. Bc 3. Kim tra xem T n-1 cnh hay cha? Nu T n-1 cnh th n chnh l cy bao trm ngn nht cn tm. Nu cha n-1 cnh th thc hin li bc 2. V d. Tm cy bao trm nh nht ca th trong hnh 5.16. 2 33 1 17 3 4 5 18 16 9 14 20 4 8 6
Hnh 5.16. th v hng lin thng G=(V, E) Bc 1. t T=. Chn cnh (3, 5) c di nh nht b sung vo T. Buc 2. Sau ba ln lp u tin, ta ln lt b sung vo cc cnh (4,5), (4, 6). R rng, nu b sung vo cnh (5, 6) s to nn chu trnh v nh 5, 6 c mt trong T. Tnh hung tng t cng xy ra i vi cnh (3, 4) l cnh tip theo ca dy. Tip , ta b sung hai cnh (1, 3), (2, 3) vo T. 121
Chng 5: th (Graph) Buc 3. Tp cnh trong T n-1 cnh: T={ (3, 5 (2,3)} chnh l cy bao trm ngn nht. 5.6.4. Thut ton Kruskal Thut ton xy dng tp cnh T ca cy khung nh nht H=<V, T> theo tng bc nh sau: a. b. Sp xp cc cnh ca th G theo th t tng dn ca trng s cnh; Xut pht t tp cnh T=, mi bc, ta s ln lt duyt trong danh sch cc cnh c sp xp, t cnh c trng s nh n cnh c trng s ln tm ra cnh m khi b sung n vo T khng to thnh chu trnh trong tp cc cnh c b sung vo T trc ; Thut ton s kt thc khi ta thu c tp T gm n-1 cnh. ), (4,6), (4,5), (1,3),
c.
5.6.5. Thut ton Prim Thut ton Kruskal lm vic km hiu qu i vi nhng th c s cnh khong m=n(n-1)/2. Trong nhng tnh hung nh vy, thut ton Prim t ra hiu qu hn. Thut ton Prim cn c mang tn l ngi lng ging gn nht. Trong thut ton ny, bt u ti mt nh tu s ca th, ni s vi nh y sao cho trng s cnh c[s, y] l nh nht. Tip theo, t nh s hoc y tm cnh c di nh nht, iu ny dn n nh th ba z v ta thu c cy b phn gm 3 nh 2 cnh. Qu trnh c tip tc cho ti khi ta nhn c cy gm n-1 cnh, chnh l cy bao trm nh nht cn tm. Trong qu trnh thc hin thut ton, mi bc, ta c th nhanh chng chn nh v cnh cn b sung vo cy khung, cc nh ca th c s c gn cc nhn. Nhn ca mt nh v gm hai phn, [d[v], near[v]]. Trong , phn th nht d[v] dng ghi nhn di cnh nh nht trong s cc cnh ni nh v vi cc nh ca cy khung ang xy dng. Phn th hai, near[v] ghi nhn nh ca cy khung gn v nht. Thut ton Prim c m t thng qua th tc sau:
122
Chng 5: th (Graph)
void Prim(void) { (*bc khi to*) Chn s l mt nh no ca th; VH = { s }; T = ; d[s] = 0; near[s] = s; For v V\VH { D[v] = C[s, v]; near[v] = s; } (* Bc lp *) Stop = False; While (! stop) { Tm u V\VH tho mn : d[u] = min { d[v] vi uV\VH}; VH = VH {u}; T = T {u, near[u] }; If (| VH | == n ) { H = (VH, T) l cy khung nh nht ca th; Stop := TRUE; } Else For (v V\VH ) { If (d[v] > C[u, v]) { D[v] = C[u, v]; Near[v] = u; } } }
p i =1
A[vi 1 , vi ]
123
Chng 5: th (Graph) khng xc nh, v ta c th i qua chu trnh m mt s ln ln di ca n nh hn bt k mt s thc cho trc no. 5.7.2. Thut ton Dijkstra Thut ton tm ng i ngn nht t nh s n cc nh cn li c Dijkstra ngh p dng cho trng hp th c trng s khng m. Thut ton c thc hin trn c s gn nhn tm thi cho cc nh. Nhn ca mi nh cho bit cn trn ca di ng i ngn nht ti nh . Cc nhn ny s c bin i (tnh li) nh mt th tc lp, m mi bc lp mt s nh s c nhn khng thay i, nhn chnh l di ng i ngn nht t s n nh . Thut ton c th c m t bng th tc Dijkstra nh sau:
void Dijkstra(void) { (*u vo G=(V, E) vi n nh c ma trn trng s A[u,v] 0; sV *) (*u ra l khong cch nh nht t s n cc nh cn li d[v]: vV. Truoc[v] ghi li nh trc v trong ng i ngn nht t s n v*) (* Bc 1: Khi to nhn tm thi cho cc nh*) for (v=1; vn; v++){ d[v] = A[s,v]; truoc[v]=s; } d[s]=0; T = V\{s};(*T l tp nh c nhn tm thi*) while (T!= ) { (* bc lp *) Tm nh uT sao cho d[u] = min { d[z] : zT} T= T\{u}; (*c nh nhn nh u*); For (vT) { (* Gn li nhn cho cc nh trong T*) If ( d[v] > d[u] + A[u, v] ) { d[v] = d[u] + A[u, v]; truoc[v] =u; } } } }
5.7.3. Thut ton Floy tm ng i ngn nht gia tt c cc cp nh ca th, chng ta c th s dng n ln thut ton Ford_Bellman hoc Dijkstra (trong trng hp trng s khng m). Tuy nhin, trong c hai thut ton c s dng u c phc tp tnh ton ln (ch t l O(n3)). Trong trng hp tng qut, ngi ta thng dng thut ton Floy c m t nh sau:
void Floy(){ (* Tm ng i ngn nht gia tt c cc cp nh
124
Chng 5: th (Graph)
Input: th cho bi ma trn trng s a[i, j], i, j = 1, 2, . . ., n.
Output:- Ma trn ng i ngn nht gia cc cp nh d[i, j], i, j = 1, 2, . . .,n; d[i,j] l di ngn nht t i n j. Ma trn ghi nhn ng i p[i, j], i, j = 1, 2, . . ., n p[i, j] ghi nhn nh i trc nh j trong ng i ngn nht;*) (*bc khi to*) for( i=1; i; i++) for( j =1; jn; j++) { d[i,j] = a[i, j]; p[i,j] = i; } (*bc lp *) for (k=1; kn; k++) for( i=1; in; i++) for (j =1; jn; j++) if (d[i,j] > d[i, k] + d[k, j]) { d[i, j] = d[i, k] + d[k, j]; p[i,j] = p[k, j]; } }
Bn c c th tm thy nhng ci t c th cc thut ton trn th thng qua cc ti liu [1], [5].
125
Chng 5: th (Graph)
Nm vng nhng khi nim v nh ngha c bn ca th. Hiu c cc phng php biu din th trn my tnh. Nm vng c cc thut ton tm kim trn th: thut ton tm kim theo chiu rng, thut ton tm kim theo chiu su v ng dng ca n trong bi ton tm ng i gia hai nh ca th cng nh trong tnh ton cc thnh phn lin thng ca th. Nm vng s khc bit gia th Euler v th Hamilton cng vi thut ton tm ng i v chu trnh trn cc th Euler & Hamilton. Nm vng bi ton tm cy bao trm & tm cy bao trm nh nht. Hiu & ci t nhun nhuyn cc thut ton tm ng i ngn nht gia cc cp nh ca th trng s.
126
Chng 5: th (Graph)
BI TP CHNG 5
Bi 1. Cho trc ma trn k ca th. Hy vit chng trnh to ra danh sch k ca th . Bi 2. Cho trc danh sch k ca th, hy to nn ma trn k ca th. Bi 3. Mt bn c 88 c nh s theo cch sau:
1 9 17 25 33 41 49 57
2 10 18 26 34 42 50 58
3 11 19 27 35 43 51 59
4 12 20 28 36 44 52 60
5 13 21 29 37 45 53 61
6 14 22 30 38 46 54 62
7 15 23 31 39 47 55 63
8 16 24 32 40 48 56 64
Mi c th coi l mt nh ca th. Hai nh c coi l k nhau nu mt con vua t ny c th nhy sang kia sau mt bc i. V d : 1 k vi 2, 9, 10, 11 k vi 2, 3, 4, 10, 12, 18, 19, 20. Hy vit chng trnh to ma trn k ca th, kt qu in ra file king.out. Bi 4. Bn c 88 c nh s nh bi trn. Mi c th coi l mt nh ca th . Hai nh c gi l k nhau nu mt con m t ny c th nhy sang kia sau mt nc i. V d 1 k vi 11, 18, 11 k vi 1, 5, 17, 21, 26, 28. Hy vit chng trnh lp ma trn k ca th, kt qu ghi vo file ma.out. Bi 5. Hy lp chng trnh tm mt ng i ca con m trn bn c t s n t (s, t c nhp t bn phm). Bi 6. Cho C s d liu ghi li thng tin v N Tuyn bay (N<=100) ca mt hng hng khng. Trong , thng tin v mi tuyn bay c m t bi: im khi hnh (departure), im n (destination), khong cch (lenght). Departure, destination l mt xu k t di khng qu 32, khng cha du trng gia, Length l mt s nh hn 32767. Ta gi Hnh trnh bay t im khi hnh A ti im n B l dy cc hnh trnh [A, A1, n1], [A1, A2, n2] . . .[Ak, B,nk] vi Ai l im n ca tuyn i nhng li l im khi
127
Chng 5: th (Graph) hnh ca tuyn i +1, ni l khong cch ca tuyn bay th i (1<=i<k). Trong , khong cch ca hnh trnh l tng khong cch ca cc tuyn m hnh trnh i qua (n1+n2+. .+nk). Cho file d liu kiu text hanhtrinh.in c ghi theo tng dng, s cc dng trong file d liu khng vt qu N, trn mi dng ghi li thng tin v mt tuyn bay, trong departure, destination, length c phn bit vi nhau bi mt hoc vi du trng. Hy tm gii php tho mn nhu cu ca khch hng i t A n B theo mt s tnh hung sau: Tm hnh trnh c khong cch b nht t A n B. In ra mn hnh tng im m hnh trnh qua v khong cch ca hnh trnh. Nu hnh trnh khng tn ti hy a ra thng bo Hnh trnh khng tn ti. V d v C s d liu hanhtrinh.in New_York Chicago New_York New_York Toronto Toronto Toronto Denver Denver Houston Denver Chicago Denver Toronto Denver Calgary Los_Angeles Chicago Urbana Houston Los_Angeles Los_Angeles 1000 1000 800 1900 1500 1800 500 1000 1500 1500 1000
Vi im i : New_York, im n : Los_Angeles ; chng ta s c kt qu sau: Hnh trnh ngn nht: New_York to Toronto to Los_Angeles; Khong cch: 2600. Bi 7. K tc thnh cng vi khi lp phng thn b, Rubik sng to ra dng phng ca tr chi ny gi l tr chi cc vung thn b. l mt bng gm 8 vung bng nhau nh hnh 1. Chng ta qui nh trn mi vung c mt mu khc nhau. Cc mu c k hiu bi 8 s nguyn tng ng vi tm mu c bn ca mn hnh EGA, VGA nh hnh 1. Trng thi ca bng cc mu c cho bi dy k hiu mu cc c vit ln lt theo chiu kim ng h bt u t gc trn bn tri v kt thc gc di bn tri. V d: trng thi trong hnh 1 c cho bi dy cc mu tng ng vi dy s (1, 2, 3, 4, 5 , 6, 7, 8). Trng thi ny c gi l trng thi khi u. Bit rng ch cn s dng 3 php bin i c bn c tn l A, B, C di y bao gi cng chuyn c t trng thi khi u v trng thi bt k:
128
Chng 5: th (Graph) A : i ch dng trn xung dng di. V d sau php bin i A, hnh 1 s tr thnh hnh 2: B : thc hin mt php hon v vng quanh t tri sang phi trn tng dng. V d sau php bin i B hnh 1 s tr thnh hnh 3: C : quay theo chiu kim ng h bn gia. V d sau php bin i C hnh 1 tr thnh hnh 4: Hnh 1 1 2 8 7 3 6 4 5 Hnh 2 Hnh 3 8 7 1 2 6 3 5 4 4 5 1 8 2 7 3 6 Hnh 4 1 7 2 3 4 5
8 6
Cho file d liu Input.txt ghi li 8 s nguyn trn mt dng, mi s c phn bit vi nhau bi mt du trng ghi li trng thi ch. Hy tm dy cc php bin i s bn a trng thi khi u v trng thi ch sao cho s cc php bin i l t nht c th c. D liu ra c ghi li trong file Output.txt, dng u tin ghi li s cc php bin i, nhng dng tip theo ghi li tn ca cc thao tc c bn thc hin, mi thao tc c bn c vit trn mt dng. Bn s c thm 20 im nu s dng bng mu thch hp ca mn hnh m t li cc php bin i trng thi ca tr chi. V d vi trng thi ch di y s cho ta kt qu nh sau: Input.txt 2 6 8 4 5 7 3 1 Output.txt 7 B C A B C C B Bi 8. Cho mt mng thng tin gm N nt. Trong , ng truyn tin hai chiu trc tip t nt i n nt j c chi ph truyn thng tng ng l mt s nguyn A[i,j] = A[j,i], vi A[i,j]>=0, i j. Nu ng truyn tin t nt i1 n nt ik phi thng qua cc nt i2, . . ik-1 th chi ph truyn thng c tnh bng tng cc chi ph truyn thng A[i1,i2], A[i2,i3], . . . A[ik-1,ik]. Cho trc hai nt i v j. Hy tm mt ng truyn tin t nt i n nt j sao cho chi ph truyn thng l thp nht. 129
Chng 5: th (Graph) D liu vo c cho bi file TEXT c tn INP.NN. Trong , dng th nht ghi ba s N, i, j, dng th k + 1 ghi k-1 s A[k,1], A[k,2], . . , A[k,k-1], 1<=k<=N. Kt qu thng bo ra file TEXT c tn OUT.NN. Trong , dng th nht ghi chi ph truyn thng thp nht t nt i n nt j, dng th 2 ghi ln lt cc nt trn ng truyn tin c chi ph truyn thng thp nht t nt i ti nt j. Bi 9. Cho mt mng thng tin gm N nt. Trong , ng truyn tin hai chiu trc tip t nt i n nt j c chi ph truyn thng tng ng l mt s nguyn A[i,j] = A[j,i], vi A[i,j]>=0, i j. Nu ng truyn tin t nt i1 n nt ik phi thng qua cc nt i2, . . ik-1 th chi ph truyn thng c tnh bng tng cc chi ph truyn thng A[i1,i2], A[i2,i3], . . . A[ik-1,ik]. Bit rng, gia hai nt bt k ca mng thng tin u tn ti t nht mt ng truyn tin. tit kim ng truyn, ngi ta tm cch loi b i mt s ng truyn tin m vn m bo c tnh lin thng ca mng. Hy tm mt phng n loi b i nhng ng truyn tin, sao cho ta nhn c mt mng lin thng c chi ph ti thiu nht c th c. D liu vo c cho bi file TEXT c tn INP.NN. Trong , dng th nht ghi s N, dng th k + 1 ghi k-1 s A[k,1], A[k,2], . . , A[k,k-1], 1<=k<=N. Kt qu thng bo ra file TEXT c tn OUT.NN trong dng th nht ghi chi ph truyn thng nh nht trong ton mng. T dng th 2 ghi ln lt cc nt trn ng truyn tin, mi ng truyn ghi trn mt dng. Bi 10. Cho file d liu c t chc ging nh bi 6.6. Hy tm tt c cc hnh trnh i t im s n t. Bi 11. Cho file d liu c t chc ging nh bi 6.6. Hy tm hnh trnh i t im s n t sao cho hnh trnh i qua nhiu node nht. Bi 12. Cho file d liu c t chc ging nh bi 6.6. Hy tm hnh trnh i t im s n t sao cho hnh trnh i qua t node nht. Bi 13. Tm hiu thut ton leo i trn th v ng dng ca n trong lnh vc tr tu nhn to.
130
Sp xp & tm kim l bi ton c bn nht ca tin hc. C th ni, mi tng tc gia con ngi v h thng my tnh v bn cht u l tm kim v thu thp thng tin. n sau cc qu trnh tm kim l vic sp xp cc i tng theo mt trt t no qu trnh tm kim din ra nhanh nht, chnh xc v hiu qu nht l ngha c bn ca qu trnh sp xp. Ni dung chnh ca chng ny tp chung vo cc gii thut sp xp v tm kim c bn di y: Gii thut Selection Sort, Gii thut Insert Sort, Gii thut Bubble Sort, Gii thut Shaker Sort, Gii thut Quick Sort, Gii thut Heap Sort, v gii thut Merge Sort. Tm kim tun t (Sequential), tm kim nh phn (Binary Search) & tm kim trn cy nh phn (Binary Search). Bn c c th tm thy nhng ci t c th v nhng kin thc su hn trong ti liu [1] & [6].
6.1. T BI TON
Sp xp l qu trnh b tr li cc phn t ca mt tp i tng no theo mt th t n nh tng dn (increasing), hoc gim dn (decreasing). Bi ton sp xp xut hin trong bt k lnh vc no ca tin hc, phc v nhng ng dng ring ca h thng, t nhng ng dng n bn trong ca H iu hnh nh bi ton iu khin qu trnh ( Proccess Control Problem), bi ton lp lch cho CPU (CPU Schedulling), bi ton qun l b nh (Memory Management) . . . cho ti nhng ng dng thng thng nh sp xp dy s, sp xp cc t, cc cu, cc bn ghi theo th t u c lin quan ti qu trnh sp xp. Tp i tng cn c sp xp c th xut hin di nhiu dng khc nhau, cc i tng c th l cc i tng d liu kiu c bn nh sp xp dy s, sp xp k t, sp xp string hoc l cc i tng tng qut nh mt cu trc bao gm mt s trng thng tin phn nh i tng. Chng ta qui c i tng cn c sp xp l cc cu trc, v qu trnh sp xp c thc hin trn mt trng no gi l trng kho. C nhiu thut ton sp xp khc nhau sp xp cc i tng. Tuy nhin, la chn mt thut ton sp xp tt, chng ta cn nh gi thut ton theo cc hai kha cnh: l s chim dng b nh khi p dng gii thut v thi gian thc hin gii thut. i vi thi gian thc hin gii thut, chng ta cng cn nh gi chi ph thi gian trong trng hp tt nht, trung bnh v xu nht i vi ngun d liu vo. Chng ta cng ch a ra nhng
131
Chng 6: Sp xp v tm kim (sorting and searching) k thut lp trnh, thng qua gii thut v kt qu nh gi thut ton m khng chng minh li nhng kt qu , v n c trnh by trong mt chuyn khc ca tin hc. Nhng thut ton sp xp v tm kim s c bn lun trong chng ny bao gm cc thut ton sp xp n gin nh : chn trc tip (Selection), thut ton si bt (Bubble), thut ton chn trc tip (Insertion), cc thut ton sp xp nhanh nh quick sort, merge sort, heap sort. Trong tt c cc v d minh ha cho gii thut sp xp v tm kim, chng ta s s dng tp cc s nguyn di y lm v d sp xp. Dy s nguyn ny s khng c nhc li trong khi gii thch mi thut ton sp xp. 42 23 74 11 65 58 94 36 99 87
132
133
134
94
74 94 99
74 87 95 99
135
136
137
138
Ta chn cht u tin l 42. pht hin ra hai kho cn i ch cho nhau, ta dng hai bin i, j vi gi tr ban u i=2, j=10. Nu ki < 42 th tip tc tng i v lp li cho ti khi gp phn t th ki >42. Duyt cc phn t th kj vi 42 nu kj > 42 th j gim i mt, cho ti khi gp phn t th kj <42 th phn t th ki v kj c i ch cho nhau. Qu trnh s c lp li vi ki v kj cho ti khi i=j chnh l v tr dnh cho kho 42. Cui cng chng ta i ch 42 cho kho cho kj. 42 42 42 42 42 11 23 23 23 23 23 23 74 74 36 36 36 36 11 11 11 11 11 42 65 65 65 65 65 65 58 58 58 58 58 58 94 94 94 94 94 94 36 36 74 74 74 74 99 99 99 99 99 99 87 87 87 87 87 (i>j) 87
Nh vy, kt thc ln th nht, chng ta c hai on c phn bit bi kho 42 nh sau: (11 23 36) [42] (65 58 94 74 99 87)
Qu trnh c lp li tng t cho tng phn on cho ti khi dy c sp xp hon ton. Chng ta c th ci t gii thut bng vic s dng stack hoc qui. phc tp tnh ton ca gii thut Quick Sort: Trng hp tt nht Cmax = Ctb = O (n log2n) Trung hp xu nht Cmin= k.O(n2) 139
Chng 6: Sp xp v tm kim (sorting and searching) Sau y l chng trnh ci t gii thut Quick Sort bng phng php qui.
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <alloc.h> #include <dos.h> void qs(int *, int ,int); void Quick(int *,int ); void Init(int *, int); void In(int *, int); void Init(int *A, int n){ int i; printf("\n Tao lap day so:"); for (i=0; i<n;i++){ A[i]=random(1000); printf("%5d",A[i]); } delay(1000); } void Quick(int *A, int n){ qs(A,0,n-1); } void qs(int *A, int left,int right) { register i,j;int x,y; i=left; j=right; x= A[(left+right)/2]; do { while(A[i]<x && i<right) i++; while(A[j]>x && j>left) j--; if(i<=j){ y=A[i];A[i]=A[j];A[j]=y; i++;j--; } } while (i<=j); if (left<j) qs(A,left,j); if (i<right) qs(A,i,right); } void In(int *A, int n){ register int i; for(i=0;i<n;i++) printf("%5d",A[i]);
140
36
99
87
58
74
chuyn cy nh phn 6.1a thnh cy nh phn 6.1b l mt heap, chng ta thc hin duyt t di ln (bottom up). Node l ng nhin l mt heap. Nu cy con bn tri v cy con bn phi u l mt heap th ton b cy cng l mt heap. Nh vy, to thnh heap, chng ta thc hin so snh ni dung node bn tri, ni dung node bn phi vi node cha ca n, node no c gi tr ln hn s c thay i lm ni dung ca node cha. Qu trnh ln ngc li cho ti khi gp node gc, khi ni dung node gc chnh l kho c gi tr ln nht. Giai on th hai ca gii thut l a ni dung ca node gc v v tr cui cng v ni dung ca node cui cng c thay vo v tr node gc, sau coi nh node cui cng nh b loi b v thc t node cui cng l gi tr ln nht trong dy s. 141
Chng 6: Sp xp v tm kim (sorting and searching) Cy mi c to ra (khng k phn t loi b) khng phi l mt heap, chng ta li thc hin vun thnh ng v thc hin tng t nh trn cho ti khi ng cn mt phn t l phn t b nht ca dy. phc tp thut ton ca Heap Sort Cmax = Ctb = O (n log2n ) Gii thut Heap Sort c ci t nh sau:
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <alloc.h> #include <dos.h> void Heap(int *, int ); void Init(int *, int); void In(int *, int); void Init(int *A, int n){ int i; printf("\n Tao lap day so:"); for (i=0; i<n;i++){ A[i]=random(1000); printf("%5d",A[i]); } delay(1000); } void Heap(int *A, int n) { int k,x,s,f,ivalue; for(k=1;k<n;k++){ x=A[k]; s=k; f=(s-1)/2; while(s>0 && A[f]<x){ A[s]=A[f]; s=f; f=(s-1)/2; } A[s]=x; } for(k=n-1;k>0;k--){ ivalue=A[k]; A[k]=A[0]; f=0; if(k==1) s=-1;
142
Chng 6: Sp xp v tm kim (sorting and searching) ...................................................... Bc th i: Lm tng t nh bc i- 1. Qu trnh c tip tc khi chng ta nhn c danh sch c n phn t c sp xp. V d vi dy: 42 23 74 42] 23 23 11 [11 42 42 68 74] 74] 36 58 [58 [36 58 94 68] 58 68 36 [94 68 74 36] 94] 94]
144
145
Chng 6: Sp xp v tm kim (sorting and searching) Nu chng ta tm c bn ghi c gi tr kha l X th php tm kim c tho (successful). Nu khng c gi tr kha no l X th qu trnh tm kim l khng tho (unsuccessful). Sau qu trnh tm kim, c th xut hin yu cu b xung thm bn ghi mi c gi tr kha l X th gii thut c gi l gii thut tm kim b sung. 6.9.1. Tm kim tun t (Sequential Searching) Tm kim tun t l k thut tm kim c in trn mt danh sch cha c sp xp. Ni dung c bn ca phng php tm kim tun t l duyt t bn ghi th nht cho ti bn ghi cui cng, v so snh ln lt gi tr ca kho vi gi tr X cn tm. Trong qu trnh duyt, nu c bn ghi trng vi gi tr X th chng ta a ra v tr ca bn ghi trong dy, nu duyt ti cui dy m khng c bn ghi no c gi tr ca kho trng vi X th qu trnh tm kim tr li gi tr -1 (-1 c hiu l gi tr kho X khng thuc dy). Chng trnh ci t phng php tm kim tun t c thc hin nh sau:
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <alloc.h> #include <dos.h> int Sequential(int *, int, int); void Init(int *, int); void Init(int *A, int n){ int i; printf("\n Tao lap day so:"); for (i=0; i<n;i++){ A[i]=random(1000); printf("%5d",A[i]); } delay(1000); } int Bubble(int *A, int x, int n){ register i,temp; for (i=0; i<n ; i ++){ if (A[i] == X) return(i); } return(-1); } void main(void){ int *A,n, x, k;clrscr(); printf("\n Nhap n="); scanf("%d",&n); printf(\n S x cn tm:); scanf(%d, &x);
146
6.9.2. Tm kim nh phn (Binary Searching) Tm kim nh phn l phng php tm kim ph bin c thc hin trn mt dy c sp th t. Ni dung ca gii thut c thc hin nh sau: ly kha cn tm kim X so snh vi ni dung ca kha ca phn t gia, v tr ca phn t gia l mid = (low + hight )/ 2, trong cn di low =0, cn trn hight = n-1. V dy c sp xp nn nu ni dung ca kha ti v tr gia ln hn X th phn t cn tm thuc khong [mid+1, hight], nu ni dung ca kha ti v tr gia nh hn X th phn t cn tm thuc khong [low, mid1], nu ni dung ca kha ti v tr gia trng vi X th chnh l phn t cn tm. bc tip theo, nu ni dung ca kha ti v tr gia ln hn X th ta dch chuyn cn di low ln v tr mid+ 1, nu ni dung ca kha ti v tr gia nh hn X th ta dch chuyn cn trn v v tr mid- 1. Qu trnh c lp li cho ti khi gp kha c ni dung trng vi X hoc cn di vt qu cn trn hay X khng thuc dy. Thut ton tm kim nh phn c minh ha nh sau:
int Binary_Search( int *A, int X, int n){ int mid, low=0, hight = n-1; while ( low<=hight ){ // lp nu cn di vn nh hn cn trn mid = (low + hight) /2; // xc nh v tr phn t gia if (X > A[mid] ) low = mid +1; // X thuc [mid+1, hight] else if (X < A[mid] ) hight = mid- 1; // X thuc [low, mid-1] else } return(-1); // X khng thuc dy } return(mid);
147
148
149
Hiu c ngha vai tr ca bi ton sp xp v tm kim trong tin hc. Ci t nhun nhuyn cc gii thut sp xp v tm kim trn cc cu trc d liu khc nhau. Gii quyt cc bi tp thc hnh km theo lm thng tin k nng gii quyt bi ton sp xp & tm kim.
150
BI TP CHNG 6
Bi 1. Ci t chng trnh theo thut ton Quick Sort khng dng phng php qui m dng cu trc stack. Bi 2. Tm hiu v gii thut Shell-Sort l phng php ci tin ca Insertion Sort. Bi 3. Ci t li gii thut Bubble Sort sao cho cc node nh c y dn v pha trc. Bi 4. Mt Ternary Heap l cy tam phn gn y c ci t bng mng mt chiu, mi node c ba node con. Ni dung ca node cha bao gi cng ln hn hoc bng ni dung ca node con, cc node c nh s t 0 n n-1, node i c 3 con l 3i+1, 3i+2, 3i+3. Hy ci t gii thut Ternary Heap. Bi 5. Ci t gii thut Bubble Sort trn file. Bi 6. Ci t gii thut Insertion Sort trn file. Bi 7. Ci t gii thut Quick Sort trn file. Bi 8. Ci t cc gii thut sp xp theo nhiu kho khc nhau. Bi 9. Nghin cu v ci t thut ton tm kim tam phn. Bi 10. Nghin cu v ci t thut ton sp xp kiu ho nhp thc hin trn file. Bi 11. Vit chng trnh chuyn i mt file d liu c t chc theo khun dng *.DBF thnh file kiu text. Ngc li, chuyn i file d liu kiu text thnh mt file d liu theo khun dng DBF. Bi 12. Tm hiu cch sp xp v tm kim theo kiu index ca cc h qun tr c s d liu nh foxprol hoc access.
151
[1] L Hu Lp - Nguyn Duy Phng. Gio trnh K thut lp trnh. NXB Bu in, 2002. [2] Xun Li. Cu trc d liu v gii thut. NXB Khoa Hc K Thut, 2000. [3] ng Huy Run. L thuyt th. NXB Khoa Hc K Thut, 2003 [4] William Ford, William Topp. Data Structures with C++. Prentice Hall, 1996. [5] Mark Allen Weiss. Data Structures and Algorithm Analysis In C. Prentice Hall, 1996. [6] Phan ng Cu. Cu trc d liu v Gii thut (Ti liu ging dyHc Vin Cng ngh BCVT), 2003.
152
Mc lc
MC LC
Chng 1: I CNG V K THUT LP TRNH CU TRC ..................................3 1.1. 1.2. S lc v lch s lp trnh cu trc...............................................................3 Cu trc lnh, lnh c cu trc, cu trc d liu ............................................5 Cu trc lnh (cu trc iu khin) ........................................................5 Lnh c cu trc .....................................................................................7 Cu trc d liu......................................................................................7
Nguyn l ti thiu .........................................................................................8 Tp cc php ton ..................................................................................8 Tp cc lnh vo ra c bn...................................................................11 Thao tc trn cc kiu d liu c cu trc............................................11
Nguyn l a phng ..................................................................................13 Nguyn l nht qun.....................................................................................15 Nguyn l an ton.........................................................................................16 Phng php Top-Down ..............................................................................18 Phng php Bottom - Up............................................................................22
Chng 2: DUYT V QUI ..........................................................................................29 2.1. 2.2. 2.3. 2.4. 2.5. nh ngha bng qui ................................................................................29 Gii thut qui ...........................................................................................30 Thut ton sinh k tip .................................................................................31 Thut ton quay lui (Back track) .................................................................34 Thut ton nhnh cn ...................................................................................37
Chng 3: NGN XP, HNG I V DANH SCH MC NI (STACK, QUEUE, LINK LIST)...........................................................................................................................51 3.1. Kiu d liu ngn xp v ng dng..............................................................51 nh ngha v khai bo ........................................................................51 Cc thao tc vi stack ..........................................................................53 ng dng ca stack..............................................................................53
153
Mc lc 3.2. Hng i (Queue) .........................................................................................55 nh ngha v khai bo ........................................................................55 ng dng hng i...............................................................................57
Danh sch lin kt n .................................................................................62 Gii thiu v nh ngha.......................................................................62 Cc thao tc trn danh sch mc ni....................................................63
Chng 4: CU TRC D LIU CY (TREE).................................................................77 4.1. 4.2. 4.3. nh ngha v khi nim ..............................................................................77 Cy nh phn.................................................................................................78 Biu din cy nh phn .................................................................................81 Biu din cy nh phn bng danh sch tuyn tnh ..............................81 Biu din cy nh phn bng danh sch mc ni .................................82
Cc thao tc trn cy nh phn......................................................................83 nh ngha cy nh phn bng danh sch tuyn tnh............................83 nh ngha cy nh phn theo danh sch lin kt:...............................83 Cc thao tc trn cy nh phn .............................................................83
Cc php duyt cy nh phn (Traversing Binary Tree)...............................88 Duyt theo th t trc (Preorder Travesal)........................................88 Duyt theo th t gia (Inorder Travesal) ...........................................89 Duyt theo th t sau (Postorder Travesal) .........................................89
Ci t cy nh phn tm kim......................................................................90
Chng 5: TH (GRAPH) ............................................................................................103 5.1. Nhng khi nim c bn ca th............................................................103 Cc loi th ....................................................................................103 Mt s thut ng c bn ca th....................................................106 ng i, chu trnh, th lin thng................................................107
Biu din th trn my tnh ....................................................................107 Ma trn k, ma trn trng s ..............................................................107 Danh sch cnh (cung )......................................................................109 Danh sch k ......................................................................................110 154
Mc lc 5.3. Cc thut ton tm kim trn th ............................................................110 Thut ton tm kim theo chiu su ...................................................110 Thut ton tm kim theo chiu rng (Breadth First Search).............111 Kim tra tnh lin thng ca th.....................................................112 Tm ng i gia hai nh bt k ca th ....................................113
ng i v chu trnh Euler .......................................................................115 ng i v chu trnh Hamilton.................................................................118 Cy bao trm ..............................................................................................119 Khi nim v nh ngha ....................................................................119 Tm mt cy bao trm trn th.......................................................120 Tm cy bao trm ngn nht...............................................................121 Thut ton Kruskal.............................................................................122 Thut ton Prim..................................................................................122
Bi ton tm ng i ngn nht ................................................................123 Pht biu bi ton...............................................................................123 Thut ton Dijkstra.............................................................................124 Thut ton Floy ..................................................................................124
6.9.1. 6.9.2.