1. Trang chủ
  2. » Luận Văn - Báo Cáo

TÀI LIỆU GIÁO KHOA CHUYÊN TIN QUYỂN 1

219 4 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

TÀI LIỆU GIÁO KHOA CHUYÊN TIN QUYỂN 1

!" # $% & ' Công ty Cổ phần dịch vụ xuất Giáo dục H Nội Nh xuất Giáo dục Việt Nam giữ quyền công bố tác phẩm 349 2009/CXB/43 644/GD M4 sè : 8I746H9 L I NÓI ð U B Giáo d c ðào t o ban hành chương trình chun tin h c cho l p chuyên 10, 11, 12 D(a theo chun đ* chun sâu chương trình nói trên, tác gi biên so n b sách chuyên tin h c, bao g/m v1n ñ* b.n nh1t v* c1u trúc d3 li4u, thu5t tốn cài đ6t chương trình B sách g/m ba quy8n, quy8n 1, C1u trúc m;i quy8n bao g/m: ph=n lí thuy?t, gi i thi4u khái ni4m b.n, c=n thi?t tr(c ti?p, thưAng dùng nh1t; ph=n áp d ng, trình bày tốn thưAng g6p, cách gi.i cài đ6t chương trình; cuDi t5p Các chuyên ñ* b sách ñưEc l(a ch n mang tính h4 thDng tF b.n đ?n chun sâu V i tr.i nghi4m nhi*u năm tham gia gi.ng d y, b/i dưIng h c sinh chuyên tin h c cJa trưAng chun có truy*n thDng uy tín, tác gi ñã l(a ch n, biên so n n i dung b.n, thi?t y?u nh1t mà sK d ng đ8 d y h c v i mong muDn b sách ph c v không chM cho giáo viên h c sinh chuyên PTTH mà c cho giáo viên, h c sinh chuyên tin h c THCS làm tài li4u tham kh.o cho vi4c d y h c cJa V i kinh nghi4m nhi*u năm tham gia b/i dưIng h c sinh, sinh viên tham gia kì thi h c sinh giRi QuDc gia, QuDc t? H i thi Tin h c trT Toàn quDc, Olympiad Sinh viên Tin h c Tồn quDc, Kì thi l5p trình viên QuDc t? khu v(c ðơng Nam Á, tác gi l(a ch n gi i thi4u t5p, lAi gi.i có ñYnh hư ng ph c v cho không chM h c sinh mà c sinh viên làm tài li4u tham kh.o tham gia kì thi L=n đ=u t5p sách đưEc biên so n, thAi gian trình đ có h n ch? nên ch[c ch[n cịn nhi*u thi?u sót, tác gi mong nh5n đưEc ý ki?n ñóng góp cJa b n ñ c, ñ/ng nghi4p, sinh viên h c sinh ñ8 b sách ñưEc ngày hoàn thi4n Các tác gi Chun đ THU T TỐN VÀ PHÂN TÍCH THU T TỐN Thu t tốn Thu t tốn m t nh ng khái ni m quan tr ng nh t tin h c Thu t ng thu t toán xu t phát t nhà khoa h c Ar p Abu Ja'far Mohammed ibn Musa al Khowarizmi Ta có th+ hi+u thu t tốn dãy h u h n bư c, m i bư c mơ t xác phép tốn ho c hành ñ ng c"n th#c hi$n, ñ% gi i quy't m t v)n ñ* ð+ hi+u ñ.y ñ0 ý nghĩa c0a khái ni m thu t toán xem xét đ5c trưng sau c0a thu t tốn: • ð.u vào (Input): Thu t toán nh n d li u vào t m t t p • ð.u (Output): V>i m?i t p d li u đ.u vào, thu t tốn đưa d li u tương Bng v>i lCi giDi c0a toán • Chính xác: Các bư>c c0a thu t tốn đưGc mơ tD xác • H u hJn: Thu t tốn c.n phDi đưa đưGc đ.u sau m t sK h u hJn (có th+ r t l>n) bư>c v>i m i đ.u vào • ðơn trL: Các kMt quD trung gian c0a t ng bư>c thNc hi n thu t tốn đưGc xác đLnh m t cách đơn trL chO phP thu c vào ñ.u vào kMt quD c0a bư>c trư>c • TQng quát: Thu t tốn có th+ áp dPng đ+ giDi m i tốn có dJng cho ð+ bi+u diSn thu t tốn có th+ bi+u diSn bTng danh sách bư>c, bư>c đưGc diSn đJt bTng ngơn ng thơng thưCng kí hi u tốn h c; ho5c có th+ bi+u diSn thu t tốn bTng sơ ñV khKi Tuy nhiên, ñ+ ñDm bDo tính xác ñLnh c0a thu t tốn, thu t tốn c.n đưGc viMt bTng ngơn ng l p trình M t chương trình sN bi+u diSn c0a m t thu t tốn ngơn ng l p trình ch n Trong tài li u này, sY dPng ngôn ng tNa Pascal đ+ trình bày thu t tốn Nói tNa Pascal, b\i nhi]u trưCng hGp, đ+ cho ng^n g n, khơng hồn tồn tn theo quy đLnh c0a Pascal Ngơn ng Pascal ngơn ng đơn giDn, khoa h c, đưGc giDng dJy nhà trưCng phQ thơng Ví dP: Thu t tốn ki+m tra tính nguyên tK c0a m t sK nguyên dương viMt ngơn ng l p trình Pascal , is_prime(n):boolean; k:=2 to n (n mod k=0) exit(true); ; exit(false); Phân tích thu t tốn 2.1 Tính hi u qu c a thu t toán Khi giDi m t toán, c.n ch n sK thu t toán m t thu t toán mà cho “tKt” nh t V y dNa s\ ñ+ ñánh giá thu t tốn “tKt” thu t tốn kia? Thơng thưCng ta dNa hai ti+u chudn sau: Thu t tốn đơn giDn, dS hi+u, dS cài đ5t (dS viMt chương trình) Thu t tốn hi u quD: Chúng ta thưCng ñ5c bi t quan tâm ñMn thCi gian thNc hi n c0a thu t toán (g i đ phBc tJp tính tốn), bên cJnh quan tâm t>i dung lưGng không gian nh> c.n thiMt ñ+ lưu gi d li u vào, kMt quD trung gian q trình tính tốn Khi viMt chương trình chO đ+ sY dPng m t sK l.n tiêu chudn (1) quan tr ng, nMu viMt chương trình đ+ sY dPng nhi]u l.n, cho nhi]u ngưCi sY dPng tiêu chudn (2) lJi quan tr ng Trong trưCng hGp này, dù thu t tốn có th+ phDi cài đ5t phBc tJp, ta vin sj lNa ch n ñ+ nh n đưGc chương trình chJy nhanh hơn, hi u quD 2.2 T!i c#n thu t tốn có tính hi u qu ? Kĩ thu t máy tính tiMn b r t nhanh, ngày máy tính l>n có th+ đJt tKc đ tính tốn hàng nghìn tO phép tính m t giây V y có c.n phDi tìm thu t tốn hi u quD hay khơng? Chúng ta xem l!i ví d, tốn ki+m tra tính nguyên tK c0a m t sK nguyên dương is_prime(n):boolean; k:=2 to n (n mod k=0) exit(true); ; exit(false); DS dàng nh n th y rTng, nMu m t sK nguyên tK phDi m t phép phép toán GiD sY m t siêu máy tính có th+ tính đưGc trăm nghìn tO 10 m t giây, v y ñ+ ki+m tra m t sK khoDng 25 ch sK m t khoDng đMn ~3170 năm Trong đó, nMu ta có nh n xét vi c thY khơng c.n thiMt mà chO c.n thY is_prime(n):boolean; t ñMn √ , ta có: t for k:=2 to trunc(sqrt(n)) if (n mod k=0) (false); exit(true); ; {hàm sqrt(n) hàm tính √ , trunc(x) hàm làm trịn x } Như v y ñ+ ki+m tra m t sK khoDng 25 ch sK m t khoDng !" # ~0.03 giây! 2.3 ðánh giá th0i gian th1c hi n thu t tốn Có hai cách tiMp c n đ+ đánh giá thCi gian thNc hi n c0a m t thu t toán Cách thB nh t bTng thNc nghi m, viMt chương trình cho chJy chương trình v>i d li u vào khác m t máy tính Cách thB hai bTng phương pháp lí thuyMt, coi thCi gian thNc hi n thu t toán hàm sK c0a cp d li u vào (cp c0a d li u vào m t tham sK đ5c trưng cho d li u vào, có Dnh hư\ng quyMt đLnh đMn thCi gian thNc hi n chương trình Ví dP đKi v>i tốn ki+m tra sK nguyên tK cp c0a d li u vào sK c.n ki+m tra; hay v>i toán s^p xMp dãy sK, cp c0a d li u vào sK ph.n tY c0a dãy) Thông thưCng cp c0a d li u vào m t sK nguyên dương , ta sY dPng hàm sK % cp c0a d li u vào ñ+ bi+u diSn thCi thNc hi n c0a m t thu t toán Xét ví dP tốn ki+m tra tính ngun tK c0a m t sK nguyên dương (cp d li u vào ), nMu m t sK chrn & chO c.n m t l.n thY chia đ+ kMt lu n không phDi sK nguyên tK NMu & không chia hMt cho lJi chia hMt cho c.n l.n thY (chia chia 3) đ+ kMt lu n khơng ngun tK Cịn nMu m t sK ngun tK thu t toán phDi thNc hi n nhi]u l.n thY nh t Trong tài li u này, hi+u hàm sK % thCi gian nhi]u nh t c.n thiMt đ+ thNc hi n thu t tốn v>i m i b d li u ñ.u vào cp SY dPng kí hi u tốn h c l>n đ+ mơ tD đ l>n c0a hàm % GiD sY m t sK nguyên dương, % ' hai hàm thNc không âm Ta viMt % () ' nMu chO nMu tVn tJi hTng sK dương * , cho % + * ' , v>i m i NMu m t thu t toán có thCi gian thNc hi n % thu t tốn có thCi gian thNc hi n c p ' Ví d,: GiD sY % V y% c p () ( , , ta có ,2 + () ' ,2 nói rTng (3 v>i m i , trưCng hGp ta nói thu t tốn có thCi gian thNc hi n 2.4 Các quy t5c ñánh giá th0i gian th1c hi n thu t tốn ð+ đánh giá thCi gian thNc hi n thu t tốn đưGc trình bày bTng ngơn ng tNa Pascal, ta c.n biMt cách ñánh giá thCi gian thNc hi n câu l nh c0a Pascal Trư>c tiên, xem xét câu l nh Pascal Các câu l nh Pascal ñưGc ñLnh nghĩa ñ quy sau: Các phép gán, ñ c, viMt câu l nh (ñưGc g i l nh ñơn) NMu S1, S2, , Sm câu l nh Begin S1; S2; …; Sm; End; câu l nh (ñưGc g i l nh hGp thành hay khKi l nh) NMu S1 S2 câu l nh E bi+u thBc lơgic If E then S1 else S2; câu l nh (ñưGc g i l nh rj nhánh hay l nh If) NMu S câu l nh E bi+u thBc lơgic E S; câu l nh (ñưGc g i l nh l5p ñi]u ki n trư>c hay l nh While) NMu S1, S2,…,Sm câu l nh E bi+u thBc lơgic Repeat S1; S2; …; Sm; Until E; câu l nh (ñưGc g i l nh l5p ñi]u ki n sau hay l nh Repeat) NMu S l nh, E1 E2 bi+u thBc m t ki+u thB tN đMm đưGc For i:=E1 to E2 S; câu l nh (ñưGc g i l nh l5p v>i sK l.n xác ñLnh hay l nh For) ð+ đánh giá, phân tích chương trình xu t phát t l nh đơn, rVi ñánh giá l nh phBc tJp hơn, cuKi ñánh giá ñưGc thCi gian thNc hi n c0a chương trình, cP th+: ThCi gian thNc hi n l nh ñơn: gán, ñ c, viMt ) L nh hGp thành: giD sY thCi gian thNc hi n c0a S1, S2,…,Sm tương Bng ,) ' , , ) ' Khi thCi gian thNc hi n c0a l nh hGp ) ' ,' , … , ' thành là: ) /0 ' L nh If: giD sY thCi gian thNc hi n c0a S1, S2 tương Bng ) ' ,) ' Khi thCi gian thNc hi n c0a l nh If là: ) /0 ' ,' L nh l5p While: giD sY thCi gian thNc hi n l nh S (thân c0a l nh While) ) ' sK l.n l5p tKi đa thNc hi n l nh S Khi thCi gian thNc hi n l nh While ) ' L nh l5p Repeat: giD sY thCi gian thNc hi n khKi l nh ) ' Repeat ) ' Begin S1; S2;…; Sm; End; sK l.n l5p tKi ña Khi ñó thCi gian thNc hi n l nh L nh l5p For: giD sY thCi gian thNc hi n l nh S ) ' l.n l5p tKi ña Khi ñó thCi gian thNc hi n l nh For ) ' 2.5 M:t s; ví d, 2 sK Ví d, 1: Phân tích thCi gian thNc hi n c0a chương trình sau: var i, j, n :longint; s1, s2 :longint; BEGIN {1} readln(n); {2} s1:=0; {3} for i:=1 to n {4} s1:=s1 + i; {5} s2:=0; {6} {7} {8} {9} END for j:=1 to n s2:=s2 + j*j; writeln('1+2+ +',n,'=',s1); writeln('1^2+2^2+ +',n,'^2=',s2); ThCi gian thNc hi n chương trình phP thu c vào sK Các l nh {1}, {2}, {4}, {5}, {7}, {8}, {9} có thCi gian thNc hi n ) L nh l5p For {3} có sK l.n l5p , v y l nh {3} có thCi gian thNc hi n ) Tương tN l nh l5p For {6} có thCi gian thNc hi n ) V y thCi gian thNc hi n c0a chương trình là: max ) , ) , ) ,) ,) ,) ,) () Ví d, 2: Phân tích thCi gian thNc hi n c0a đoJn chương trình sau: {1} {2} {3} {4} {5} {6} c:=0; for i:=1 to 2*n c:=c+1; for i:=1 to n for j:=1 to n c:=c+1; ThCi gian thNc hi n chương trình phP thu c vào sK Các l nh {1}, {3}, {6} có thCi gian thNc hi n ) L nh l5p For {2} có sK l.n l5p , v y l nh {2} có thCi gian thNc hi n ) L nh l5p For {5} có sK l.n l5p , v y l nh {5} có thCi gian thNc hi n ) L nh l5p For {4} có sK l.n l5p , v y l nh {4} có thCi gian thNc hi n ) V y thCi gian thNc hi n c0a ñoJn chương trình là: max ) , ) ,) () Ví d, 3: Phân tích thCi gian thNc hi n c0a đoJn chương trình sau: {1} {2} {3} for i:=1 to n for j:=1 to i c:=c+1; ThCi gian thNc hi n chương trình phP thu c vào sK Các l nh {3} có thCi gian thNc hi n ) 10 Sample Input Sample Output 1 2 3 4 5 3 5 5 1 4 Ngoài thao tác đ i v8i ngăn xAp, thu t tốn tìm chu trình Euler cịn u cWu cài đ*t hai thao tác sau m t cách hi$u qu=: • V8i m`i đ/nh ki m tra xem có t n t5i c5nh liên thu c v8i hay khơng, nAu có ch/ m t c5nh liên thu c Lo5i bb m t c5nh khbi ñ th Các c5nh c;a ñ th ñư c ñánh s tD t8i I, sau m`i c5nh vơ hư8ng J, K sa đư c thay thA bei hai cung có hư8ng ngư c chiBu: J, K K, J M`i cung m t b=n ghi g m hai ñ/nh ñWu mút ch/ s c5nh vơ hư8ng tương Kng • const maxM = 1000000; type TArc = record x, y: Integer; //cung (x, y) edge: Integer; //ch s c nh vô hư:ng tương 1ng end; var a: array[1 * maxM] of TArc; Danh sách liên thu c ñư c xây dLng theo ki u reverse star: M`i ñ/nh cho tương Kng v8i m t danh sách cung ñi vào Các danh sách ñư c cho bei hai m=ng lm1 … n s 4m1 … 2In đó: • • lm n ch/ s cung đWu tiên danh sách liên thu c cung ñi vào , trưTng h p đ/nh khơng cịn cung vào, lm n ñư c gán bZng s 4m n ch/ s cung kA tiAp cung / danh sách liên thu c chKa cung / , trưTng h p / cung cu i m t danh sách liên thu c, s 4m n ñư c gán bZng 205 ð thLc hi$n thao tác xố c5nh, ta trì m t m=ng đánh dCu l s lm1 … In l s lm n True nAu c5nh vơ hư8ng thK b xố M`i c5nh vơ hư8ng b xố, c= hai cung có hư8ng tương Kng đBu khơng cịn t n t5i, vi$c ki m tra m t cung có hư8ng / cịn t n t5i hay khơng có th thLc hi$n bZng vi$c ki m tra: l s lm / lă n ? False Chỳng ta sa ci ủ*t thao tác sau cCu trúc d% li$u: • • • Hàm : Tr= vB phWn tX nZm e ñ/nh ngăn xAp Hàm Pop: Tr= vB phWn tX nZm e đ/nh ngăn xAp rút phWn tX khbi ngăn xAp Th; tRc Push v : ð•y m t ñ/nh vào ngăn xAp TCt c= thao tác trên ngăn xAp có th cài đ*t đ thLc hi$n thTi gian ¬ Thu t tốn tìm chu trình Euler có th viAt cR th hơn: Stack := (1); //Khli t3o ngăn xLp ch0 chwa m8t ñ0nh repeat u := Get; //ðSc ñ0nh u tP ngăn xLp i := head[u]; //Xét cung a[i] ñwng ñ5u danh sách liên thu8c cung ñi vào u while (i > 0) and (deleted[a[i].edge]) //cung a[i] wng vOi c3nh vô hưOng xố i := link[i]; //D]ch sang cung kL tiLp head[u] := i; //Nhrng cung ñã duyTt qua b] lo3i ngay, c~p nh~t l3i ch0 s2 ñ5u danh sách liên thu8c if i > then //u cung vào wng vOi c3nh vơ hưOng chưa xố begin Push(a[i].x); //ðsy ñ0nh n2i tOi u vào ngăn xLp (ñi ngưmc cung a[i]) Deleted[a[i].edge] := True; //Xố c3nh vơ hưOng wng vOi cung a[i] end else Output ← Pop; until Top = 0; //Lop tOi ngăn xLp rpng Xét vịng l*p repeat…until, m`i bư8c l*p có m t thao tác ( ho*c ( ñư c thLc hi$n M`i lWn thao tác ( đư c thLc hi$n ph=i có m t c5nh vơ hư8ng b xố ngăn xAp có thêm m t đ/nh M`i lWn thao tác ( ñư c thLc hi$n ngăn xAp b b8t ñi m t đ/nh Vì thu t tốn in I đ/nh chu trình Euler nên sa ph=i có t_ng c ng I thao tác ( Trư8c vào vịng l*p ngăn xAp có m t 206 ñ/nh vòng l*p kAt thúc ngăn xAp tre thành r`ng, suy s thao tác ( ph=i I TD đó, vịng l*p repeat…until thLc hi$n 2I lWn TiAp theo ta ñánh giá s thao tác duy$t danh sách liên thu c c;a ñ/nh Bei sau vịng l*p while có l$nh c p nh t lm n x nên có th thCy rZng l$nh gán x s 4m n ñư c thLc hi$n lWn danh sách liên thu c c;a b gi=m ñúng chDng ñó cung T_ng s phWn tX c;a danh sách liên thu c 2I thu t toán kAt thúc, danh sách liên thu c ñBu r`ng Suy t_ng thTi gian thLc hi$n phép duy$t danh sách liên thu c (vòng l*p while) tồn b thu t tốn Θ I Suy thTi gian thLc hi$n gi=i thu t Θ I EULER.PAS Tìm chu trình Euler đa đ4 th5 Euler vô hư ng {$MODE OBJFPC} program EulerTour; const maxN = 100000; maxM = 1000000; type TArc = record //C$u trúc m t cung x, y: Integer; //Đ nh ñ2u ñ nh cu i edge: Integer; //Ch s c nh vô hư:ng tương 1ng end; var n, m: Integer; a: array[1 * maxM] of TArc; //Danh sách cung link: array[1 * maxM] of Integer; //link[i]: Ch s cung k ti p a[i] danh sách liên thu c head: array[1 maxN] of Integer; //head[u]: ch s cung ñ2u tiên danh sách cung vào u deleted: array[1 maxM] of Boolean; //Đánh d$u c nh vơ hư:ng b% xố hay chưa Stack: array[1 maxM + 1] of Integer; //Ngăn x p Top: Integer; //Ph2n ta ñ nh ngăn x p procedure Enter; //Nh)p d* li+u xây dNng danh sách liên thu c var i, j, u, v: Integer; begin ReadLn(n, m); j := * m; for i := to m 207 begin ReadLn(u, v); //Đ,c m t c nh vơ hư:ng, thêm cung có hư:ng tương 1ng a[i].x := u; a[i].y := v; a[i].edge := i; a[j].x := v; a[j].y := u; a[j].edge := i; Dec(j); end; FillChar(head[1], n * SizeOf(head[1]), 0); //KhAi t o danh sách liên thu c rBng for i := * m downto with a[i] //Duy+t t5ng cung (x, y) begin //Đưa cung vào danh sách liên thu c cung ñi vào y link[i] := head[y]; head[y] := i; end; FillChar(deleted[1], n * SizeOf(deleted[1]), False); //Các c nh vơ hư:ng đ!u chưa xố end; procedure FindEulerTour; var u, i: Integer; begin Top := 1; Stack[1] := 1; //KhAi t o ngăn x p ch1a ñ nh repeat u := Stack[Top]; //ð,c ph2n ta A ñ nh ngăn x p i := head[u]; //Cung a[i] ñang ñ1ng ñ2u danh sách liên thu c while (i > 0) and (deleted[a[i].edge]) i := link[i]; //D%ch ch s i d,c danh sách liên thu c đQ tìm cung 1ng v:i c nh vơ hư:ng chưa xố head[u] := i; //C)p nh)t l i head[u], "nh"y" qua cung 1ng v:i c nh vơ hư:ng xố if i > then //u cung vào 1ng v:i c nh vơ hư:ng chưa xố begin Inc(Top); Stack[Top] := a[i].x; //Đi ngư=c cung a[i], đGy ñ nh n i t:i u vào ngăn x p Deleted[a[i].edge] := True; //Xoá c nh vô hư:ng tương 1ng v:i a[i] end else //u khơng cịn cung vào begin Write(u, ' '); //In u chu trình Euler Dec(Top); //L$y u khMi ngăn x p end; until Top = 0; //L^p t:i ngăn x p rBng WriteLn; 208 end; begin Enter; FindEulerTour; end d) Vài nh(n xét BZng vi$c quan sát ho5t đ ng c;a ngăn xAp, có th sXa mơ hình cài đ*t c;a thu t tốn nhZm t n dRng ngăn xAp c;a chương trình ñ$ quy chK không cWn cài ñ*t cCu trúc d% li$u ngăn xAp ñ chKa ñ/nh: procedure Visit(u: Integer); var i: Integer; begin i := head[u]; while i ≠ begin //Xét cung a[i] vào u if not deleted[a[i].edge] then //C nh vô hưYng tương Sng chưa b xố begin deleted[a[i].edge] := True; //Xố c nh vơ hưYng tương Sng Visit(a[i].x); //ði ngưZc chi u cung a[i] thăm ñ%nh n1i tYi u end; end; Output ← u; //T\ u khơng th= ngưZc chi u cung nJa, in u chu trình Euler end; begin «Nh~p ñ\ th] xây d‚ng danh sách liên thu8c»; Visit(1); //KhHi đ"ng thu(t tốn tìm chu trình Euler end Cách cài đ*t đơn gi=n thao tác ngăn xAp ñư c thLc hi$n tL nhiên qua chA g4i th; tRc đ$ quy Tuy nhiên cWn ý rZng ñ sâu c;a dây chuyBn ñ$ quy có th lên t8i I cCp nên v8i m t s cơng cR l p trình cWn ñ*t l5i dung lư ng b nh8 Stack1 Chúng ta có th liên h$ thu t tốn v8i thu t tốn tìm kiAm theo chiBu sâu: TD mơ hình DFS, nAu thay thăm đ)nh thăm c/nh (m t c5nh có th tiAp sang c5nh chung đWu mút v8i nó) ð ng thTi ta ñánh dCu c5nh ñã qua/chưa Trong Free Pascal 32 bit, dung lư ng b nh8 Stack dành cho biAn ñ a phương tham s chương trình m*c ñ nh 64 KiB Có th ñ*t l5i bZng d•n hư8ng biên d ch {$M…} 209 qua thay cho chA ñánh dCu m t ñ/nh ñã thăm/chưa thăm Khi th= tZ duyLt xong (finish) c;a c5nh cho ta m t chu trình Euler Thu t tốn khơng có sai nAu ta xây dLng danh sách liên thu c ki u forward star thay ki u reverse star Tuy nhiên ta ch4n ki u reverse star bei cách bi u di n thích h p đ tìm chu trình Euler c= đ th vơ hư8ng có hư8ng NgưTi ta cịn có thu t tốn Fleury (1883) đ tìm chu trình Euler bZng tay: B@t ñWu tD m t ñ/nh, ñi tho=i mái theo c5nh theo nguyên t@c: xoá bb c5nh ñi qua ch/ ñi qua cWu khơng cịn cách khác đ ch4n Khi khơng th ñi tiAp ñư c n%a ñưTng ñi tìm ñư c chu trình Euler BZng cách “l5m dRng thu t ng%”, ta có th mơ t= đư c thu t tốn tìm Fleury cho c= đ th Euler có hư8ng vơ hư8ng: • • Dư8i nAu ta nói c5nh , hi u c5nh , đ th vơ hư8ng, hi u cung , đ th có hư8ng Ta g4i c5nh , “m t khơng tre l5i” nAu tD t8i , sau xố c5nh khơng có cách tD quay l5i Thu t tốn Fleury tìm chu trình Euler: XuCt phát tD m t ñ/nh, ta ñi m t cách tuỳ ý theo c5nh tuân theo hai nguyên t@c: Xoá bb c5nh vDa ñi qua ch/ ch4n c5nh “m t ñi khơng tre l5i” nAu khơng cịn c5nh khác ñ ch4n Thu t toán Fleury m t thu t tốn thích h p cho vi$c tìm chu trình Euler bZng tay (v8i nh%ng ñ th va ñư c m*t phhng vi$c ki m tra cWu bZng m@t thưTng tương ñ i d dàng) Tuy v y cài đ*t thu t tốn máy tính thu t tốn tb khơng hi$u qu= 6.2 ð th Hamilton a) Bài toán Khái ni$m vB đưTng chu trình Hamilton đư c đưa bei William Rowan Hamilton (1856) ông thiAt kA m t trị chơi kh i đa di$n 20 ñ/nh, 30 c5nh, 12 m*t, m`i m*t m t ngũ giác ñBu ngưTi chơi cWn ch4n c5nh ñ thành l p m t ñưTng ñi qua ñ/nh cho trư8c (Hình 5Q30) ð th , ñư c g4i ñ th Hamilton (Hamiltonian graph) nAu t n t5i chu trình đơn qua tCt c= đ/nh Chu trình đơn qua tCt c= đ/nh đư c g4i chu trình Hamilton (Hamiltonian Circuit/Hamiltonian Circle) ð thu n ti$n, ngưTi ta quy ư8c rZng ñ th ch/ g m ñ/nh ñ th Hamilton, ñ th g m ñ/nh liên thông không ph=i ñ th Hamilton 210 ð th , ñư c g4i ñ th n#a Hamilton (traceable graph) nAu t n t5i ñưTng ñi ñơn qua tCt c= ñ/nh ðưTng ñi ñơn ñi qua tCt c= ñ/nh ñư c g4i đư8ng Hamilton (Hamiltonian Path) Hình 30 b c a b e d d c a b c e d a + f D Trong Hình 5Q31, ð th + có chu trình Hamilton ) , , , l, , khơng có chu trình Hamilton có đưTng Hamilton ) , , , l D khơng có c= chu trình Hamilton l•n đưTng Hamilton Hình 31 b) Các đ nh lí liên quan TD ñ nh nghĩa ta suy ñư c ñ th ñưTng c;a ñ th Euler m t đ th Hamilton Ngồi nh%ng đ nh lí sau ñây cho vài cách nh n biAt ñ th Hamilton ð nh lí 20 ð th vơ hư ng G, t n t/i ñ)nh cho n9u xoá ñi ñ)nh v i nhhng c/nh liên thu c c7a chúng ñ th nh n ñư:c s+ có nhi u thành ph-n liên thơng kh

Ngày đăng: 18/01/2023, 13:14

Xem thêm: