A - Gi¶i thuËt I / §Þnh nghÜa gi¶i thuËt : Gi¶i thuËt lµ mét hÖ thèng chÆt chÏ vµ râ rµng c¸c qui t¾c nhằm xác định một dãy các động tác trên những đối tợng , sao cho sau một số hữu hạn [r]
Trang 1CHUYấN ĐỀ I Một số khái niệm mở đầu
A - Giải thuật
I / Định nghĩa giải thuật : Giải thuật là một hệ thống chặt chẽ và rõ ràng các qui tắc
nhằm xác định một dãy các động tác trên những đối tợng , sao cho sau một số hữu hạn
b-ớc thực hiện các động tác này ta thu đợc kết quả mong muốn
II / Các đặc tr ng của giải thuật :
- Tính kết thúc
- Tính rõ ràng , chặt chẽ
- Tính phổ dụng
- Tính hiệu quả
III / Biểu diễn giải thuật :
1 / Phơng pháp dùng ngôn ngữ liệt kê các động tác :
Trong đó có các động tác cơ bản :
+ Bắt đầu , thông báo yêu cầu
+ Lệnh gán trị
+ Lệnh thực hiện các phép tính số học , phép tính lô gíc
+ Lệnh kiểm tra điều kiện
+ Lệnh chuyển không điều kiện , lệnh chuyển có điều kiện
+ Lệnh lặp lại
+ Kết thúc
2 / Phơng pháp sơ đồ khối :
+Dùng các hình vẽ mô tả các động tác , các mũi tên chỉ thứ tự thực hiện các động tác
Thí dụ về một số thuật giải thờng gặp :
1 / Trao đổi giá trị của 2 biến A và B thông qua biến trung gian C :
B0 Bắt đầu
B1 Nhập giá trị cho A và B
B2 C lấy giá trị của A
B3 A lấy giá trị của B
B4 B lấy giá trị của C
B5 Thông báo kết quả
B6 Kết thúc
2 / Tìm phần tử nhỏ nhất trong dãy số A 1 ,A 2 , ,A n :
.F
Bắt đầu Nhóm lệnh
2,3
Điều
kiện
Lệnh 1 Kết thúc
.T
Trang 2B0 Bắt đầu
B1 Nhập các giá trị N , A 1 ,A 2 , ,A n
B2 Gán i = 2
B3 Nếu A i < A 1 thì A 1 = A i
B4 Tăng i lên 1 đơn vị
B5 Nếu i<=N thì quay về B3 ( Lệnh lặp )
B6 Nếu i > N thì A 1 nhỏ nhất
B7 Thông báo kết quả
B8 Kết thúc
3 / Duyệt dãy A 1 , A 2 , , A n xem có phần tử X hay không :
B0 Bắt đầu
B1 Nhập các giá trị N, A 1 ,A 2 , ,A n
B2 Gán trị i=1
B3 Nếu i >N thì chuyển sang B6
B4 Nếu A i <> X thì tăng i lên 1 đơn vị , Chuyển về B3
B5 Thông báo kết quả : có X trong dãy A 1 ,A 2 , ,A n , rồi chuyển sang B7 B6 Thông báo kết quả : Không có X trong dãy A 1 ,A 2 , ,A n ,
B7 Kết thúc chơng trình
4 / Sắp xếp dãy A 1 ,A 2 , ,A n , theo thứ tự tăng dần :
B0 Bắt đầu
B1 Nhập N, A 1 ,A 2 , ,A n
B2 Gán i=1
B3 Gán k=i+1
B4 Nếu A i <= A k thì B6
B5 Thực hiện thuật toán đổi giá trị A i và A j
B6 Tăng j lên 1 đơn vị
B7 Nếu j <= N thì chuyển về B4
B8 Tăng i lên 1 đơn vị
B9 Nếu i < N thì chuyển về B3
B10 Thông báo dãy đã sắp tăng là A 1 ,A 2 , ,A n
B11 Kết thúc
5 / Thuật toán “ Lùa bò vào chuồng “ : Tìm số nguyên dơng bé nhất không có trong
dãy A 1 ,A 2 , ,A n nguyên dơng không lớn hơn 32.000
B0 Bắt đầu
B1 Nhập N , A 1 ,A 2 , ,A n
B2 Trên trục số đánh dấu các điểm A 1 ,A 2 , ,A n
B3 x = 1
B4 Duyệt trên trục số , nếu thấy x là điểm nguyên cha đợc đánh dấu thì chuyển sang
b-ớc B6
B5 Tăng x lên 1 đơn vị
B6 Thông báo số nguyên dơng bé nhất cha có trong dãy là X
B7 Kết thúc
6 / Thuật toán tìm Ước chung lớn nhất của 2 số nguyên A và B :
B0 Bắt đầu
B1 Nhập 2 số nguyên A và B
B2 Gán A = A , B = B
B3 Nếu A =0 và B=0 thì B9
B4 Nếu A=0 và B <>0 thì B10
B5 Nếu B=0 và A <>0 thì B11
B6 Gán d của phép chia A cho B vào biến D ( D = A mod B )
B7 Nếu D = 0 thì chuyển sang B10
Trang 3B8 Gán A = B ; B = D ; D = A mod B chuyển về B7
B9 Thông báo UCLN không tồn tại , chuyển về Bkt
B10 Thông báo kết quả : Ước số chung lớn nhất là số B , chuyển về Bkt
B11 Thông báo kết quả : Ước số chung lớn nhất là số A
Bkt Kết thúc
7 / Thuật toán tìm số nguyên tố :
B0 Bắt đầu
B1 Nhập số N
B2 Nếu N=2 hoặc N=3 thì chuyển sang B8
B3 Gán i=-1
B4 Nếu (N mod 2 =0) hoặc (N Mod 3 =0) thì chuyển sang B 9
B5 Tăng i lên 6 đơn vị
B6 Nếu (N mod i <> 0) và (N mod (i+2) <>0) và ( i*i <= N ) chuyển sang B 5 B7 Nếu i*i <= N thì chuyển sang B 9
B8 Thông báo : N là số nguyên tố , chuyển tới B10
B9 Thông báo : N là hợp số
B10 Kết thúc chơng trình
Biểu diễn thuật toán : Tìm ớc chung lớn nhất của 2 số nguyên bằng sơ đồ khối
A := A Bắt Đầu
B := B
A=0 và B=0 T Không có
UCLN
T
T UCLN là B
B<>0 và A=0
Trang 4
.T.
D = 0 Kết thúc
A := B
8 / Thuật toán tìm căn bậc 2 của số không âm A :
B0 Bắt đầu
B1 Nhập số không âm A và sai số cho phép
B2 X 0 = 1 ( X là giá trị gần đúng đầu tiên của căn bậc 2 của A )
B3 X = X 0
B4 X o = ( X + A/X ) / 2
B5 Kiểm tra : X 0 - X < thì chuyển sang B6 còn không thì chuyển về bớc B3
B6 Thông báo căn bậc hai của A là X 0
B7 Kết thúc
9 / Tìm nghiệm gần đúng của một đa thức F(x) bằng thuật toán chia đôi :
B0 Bắt đầu
B1 Nhập các hệ số của đa thức và độ sai số cho phép
B2 Nhập 2 giá trị A và B sao cho F(A) <0 và F(B) >0
B3 Nếu B - A < thì chuyển tới B10
B4 X = ( A+B )/2
B5 Tính F(X)
B6 Nếu F(X) >0 thì B = X , chuyển về B3
B7 Nếu F(X) <0 thì A=X , chuyển về B3
B8 Nếu F(X) = 0 thì Chuyển tới B10
B10 Thông báo nghiệm là X
B11 Kết thúc
10 / Thuật toán Greedy Algorithm với bài toán tô màu
Bài toán : Cho tập n điểm gọi là tập G , các điểm này đợc đánh số từ 1 đến N và đợc nối
với nhau bởi một số đoạn thẳng Hãy tô màu cho các điểm theo nguyên tắc : 2 điểm có
đoạn thẳng nối chúng phải tô bằng 2 màu khác nhau Nêu cách tô màu cho các điểm sao cho càng dùng ít màu càng tốt
Gợi ý xây dựng thuật toán : Cần tổ chức 2 tập : Tập điểm đã tô màu D và tập điểm cha tô
màu C Mỗi lần có 1 đỉnh đợc tô màu thì kết nạp thêm đỉnh đó vào D , tập C loại trừ đỉnh
đó Dùng màu 1 tô cho đỉnh 1 Số lợng lớn nhất các màu đã dùng là MD=1 Chọn đỉnh i cha tô màu , cho tập màu T là rỗng , tìm tất cả các đỉnh k nối với i , nếu đỉnh k đã đợc tô màu thì ghi lại màu của đỉnh k vào tập màu T , so T với tập màu đã dùng TMD gồm các màu từ 1 tới MD , nếu có màu của TMD không thuộc T thì chọn nó làm màu của đỉnh i , ngợc lại phải chọn màu MD+1 làm màu cho đỉnh i ; tăng MD lên 1 đơn vị ; thoát khỏi việc chọn màu cho đỉnh i Quá trình tiếp tục cho đến khi tất cả các đỉnh đều đợc tô màu
Rõ ràng thuật toán trên đã tìm mọi khả năng tốt nhất để gán màu cho 1 đỉnh Song lời giải theo thuật toán này cha tối u ( Cha là lời giải tốt nhất ) vì việc chọn màu tốt nhất cho 1 đỉnh i cha chắc bảo đảm có lợi cho việc chọn màu của các đỉnh tiếp sau i
Sau này chúng ta sẽ đề cập tới một thuật toán khác có tính tối u để giải bài toán tô màu này
11 / Tìm kiếm nhị phân trên mảng đã đợc sắp thứ tự
Trang 5B0 Bắt đầu
B1 Nhập số X và dãy A gồm N phần tử
B2 Gán đầu := 1 ; cuối := N
B3 Kiểm tra đầu <= cuối nếu sai thì chuyển về B 8
B4 giữa := ( đầu + cuối ) div 2
B5 Nếu X > A[giữa] thì đầu := giữa +1
B6 Nếu X < A[giữa] thì cuối := giữa -1
B7 Nếu X= A[giữa] thì cuối := -1
B8 Nếu cuối = -1 thì thông báo có X trong mảng ,còn ngợc lại thì thông báo không có
X trong mảng
B9 Kết thúc
Bài tập về nhà
1 ) Nêu thuật toán giải phơng trình bậc 2
2 ) Nêu thuật toán giải hệ phơng trình bậc nhất 2 ẩn
3 ) Nêu thuật toán sắp xếp giảm 1 dãy số
4 ) Để tìm Ước số chung lớn nhất của 2 số , có thể dùng thuật toán Ơclit nh sau :
(a,b) = ( a,b-a) = = ( d,0) = d ( Ta luôn giả sử b>a) Hãy trình bày thuật toán này
5 ) Vẽ sơ đồ khối cho các thuật toán ( 2,3,4,7, 11 ) đã diễn tả bằng ngôn ngữ nêu ở trên
6 ) Để khẳng định số N có là số nguyên tố hay không có thể dùng định nghĩa số nguyên
tố : Cho i nhận các giá trị từ 2 đến N div 2 , nếu N mod i=0 thì N là hợp số , ngợc lại nếu không có một giá trị i nào để N mod i = 0 thì N là nguyên tố Trình bày thuật toán bằng sơ đồ khối
7 ) Để tìm số nguyên tố < N có thể dùng thuật toán sàng érastosthène nh sau : Xoá 1, trong phạm vi từ 2 tới căn bậc hai của N , tìm số nguyên dơng k nhỏ nhất cha bị xoá rồi xoá các bội của k nhỏ hơn N bắt đầu từ bình ph ơng của k Các số còn lại cha bị xoá chính là các số nguyên tố nhỏ hơn N Trình bày thuật toán bằng sơ đồ khối
8 ) Có 6 đội bóng A,B,C,D,E,F thi đấu để tranh giải vô địch ( đấu vòng 1 )
Đội A đã đấu với đội B và C
Đội B đã đấu với đội D và F
Đội E đã đấu với đội F và C
Mỗi đội chỉ đấu với đội khác 1 trận trong 1 tuần Hãy nêu thuật toán lập lịch thi đấu sao cho các trận còn lại sẽ đợc thực hiện trong thời gian ngắn nhất
Trang 6Mét sè ch¬ng tr×nh minh ho¹ thuËt to¸n
{ Bµi 1 ThuËt to¸n tr¸o cèc }
Uses Crt;
Var A,B,C : Integer;
Begin
Clrscr;
Write('Nhap so A : ');
Readln(A);
Write('Nhap so B : ');
Readln(B);
C := A;
A := B;
B := C;
Writeln('A = ',A:5,#13#10'B = ',B:5);
Readln;
End
{ Bµi 2 T×m phÇn tö nhá nhÊt trong d·y }
Uses Crt;
Const Max = 10;
Var j : Integer;
A : Array[1 Max] of Integer;
Begin
Clrscr;
For j:=1 to Max do
Begin
Write('A[',j:2,'] = ');
Readln(A[j]);
End;
j := 2;
Repeat
If A[j] < A[1] then A[1] := A[j];
Inc(j);
Until j>Max;
Writeln('So nho nhat la ',A[1]);
Readln;
End
{ Bµi 3 DuyÖt d·y theo thø tù , t×m phÇn tö X }
Uses Crt;
Const Max = 10;
Var i,X : Integer;
A : Array[1 Max] of Integer;
Procedure Baoco;
Begin
Writeln(X,' co trong day ');
Readln;
Halt;
End;
Procedure Khongco;
Begin
Writeln(X,' khong co trong day ');
Readln;
End;
Trang 7Clrscr;
Write('Nhap X = '); Readln(X);
Writeln('Nhap day A ');
For i:=1 to Max do
Begin
Write('A[',i:2,'] = ');
Readln(A[i]);
End;
i := 1;
While i<= Max do
Begin
If A[i] = X then Baoco { Trong Baoco co lenh Halt }
Else Inc(i);
End;
If i>max then Khongco;
End
{ Bµi 4 S¾p xÕp d·y b»ng ph¬ng ph¸p Næi bät - Ph¬ng ph¸p s¾p xÕp kÐm nhÊt }
Uses Crt;
Const Max = 10;
Var N : Integer;
A : Array[1 Max] of Integer;
Procedure Nhap;
Var i : Integer;
Begin
Write('Nhap N = ');
Readln(N);
For i:=1 to N do
Begin
Write('A[',i:2,'] = ');
Readln(A[i]);
End;
End;
Procedure Hien;
Var i : Integer;
Begin
For i:=1 to N do
Write(A[i]:5);
Writeln;
End;
Procedure Traococ( Var x,y : Integer);
Var c : Integer;
Begin
c := x;
x := y;
y := c;
End;
Procedure KieuFor;
Var i,j : Integer;
Begin
For i:=1 to N-1 do
For j:=i+1 to N do
If A[i] > A[j] then Traococ(A[i],A[j]);
Hien;
End;
BEGIN
KieuFor;
Trang 8Readln;
END
{ Bµi 5 Ph¬ng ph¸p Lïa bß vµo chuång ! }
Uses Crt;
Const Max = 32000;
M = 10;
Var x,N : Integer;
A : Array[1 M] of Integer;
B : Array[1 Max] of Boolean;
Procedure Nhap;
Var i : Integer;
Ok : Boolean;
Begin
Write('Nhap N = ');
Repeat
{$I-} Readln(N); {$I+}
Until (IoResult=0) and (N<=10) and (N>0);
Writeln('Nhap mang ',N,' so nguyen duong : ');
For i:=1 to N do
Begin
Write('A[',i:2,'] = ');
Repeat
Readln(A[i]);
Ok := (IoResult=0) and (A[i]<=32000) and (A[i]>0); Until Ok;
End;
End;
Procedure Thuchien;
Var i,j : Integer;
Begin
FillChar(B,Sizeof(B),False);
For i:=1 to Max do
For j:= 1 to N do
If i=A[j] then B[i]:= true;
For x:=1 to Max do
If B[x]=False then
Begin
Write('So nguyen duong nho nhat khong thuoc mang: '); Writeln(x);
Readln;
Halt;
End;
End;
BEGIN
Clrscr;
Nhap;
Thuchien;
Readln;
END
{ Bµi 6 ThuËt to¸n t×m USCLN cña 2 sè }
Uses Crt;
Var A,B,La,Lb : Integer;
Procedure Nhap(i : Char;Var x : Integer);
Var Ok : Boolean;
Begin
Write('Nhap so nguyen ',i,' = ');
Repeat
Trang 9{$I-} Readln(x); {$I+}
Ok := (IoResult=0);
Until Ok;
End;
Procedure Hien(x : Integer);
Begin
Write('UCLN(',LA:5,',',LB:5,') = ',x);
Readln;
Halt;
End;
Procedure Hien2;
Begin
Writeln(' Moi so nguyen deu = UCLN(0, 0) ');
Readln;
Halt;
End;
Procedure Tim;
Var D : Integer;
Begin
A := Abs(A);
B := Abs(B);
If (A=0) and (B<>0) then Hien(B);
If (B=0) and (A<>0) then Hien(A);
If (A=0) and (B=0) then Hien2;
D := A mod B;
While D<>0 do { Chu y neu dung Repeat can tranh chia cho 0 }
Begin
A := B;
B := D;
D := A mod B;
End;
Hien(B);
End;
BEGIN
Clrscr;
Nhap('A',A);
Nhap('B',B);
La := A;
Lb := B;
Tim;
Readln;
END
{ Bµi 7 T×m sè nguyªn tè - ThuËt to¸n tèt }
Uses Crt,dos;
Const Max = 400000; { 192/100 giay > 50000 & 2269/100 giay > 400000 } Var N , i : LongInt;
h,m,s,p : Word;
T : LongInt;
Begin
Clrscr;
Gettime(h,m,s,p);
t := 6000*m + 100*s +p;
Write(2:8);
Write(3:8);
For N := 5 to Max do
If (N mod 2 <> 0) and (N mod 3 <> 0) then
Begin
i := -1;
Trang 10Repeat
Inc(i,6);
Until (N mod i =0) or (N mod (i+2)=0) or (sqr(i)>N);
If sqr(i)>N then Write(N:8);
End;
Gettime(h,m,s,p);
t := 6000*m + 100*s +p - t;
Writeln;
Writeln('Mat thoi gian la : ', T);
Readln;
End
{ Bµi 8 T×m c¨n bËc hai cña 1 sè }
Uses Crt;
Var A,E,X0 : Real;
Procedure Baoloi;
Begin
Writeln('Loi du lieu nhap : ');
Readln;
Halt;
End;
Procedure Nhap;
Var Ok : Boolean;
Begin
Write('Nhap so trong can bac 2 : ');
Repeat
{$I-} Readln(A); {$I+}
Ok := (IoResult=0) and (A>=0);
If not Ok then BaoLoi;
Until Ok;
Write('Nhap do chinh xac : ');
Repeat
{$I-} Readln(E); {$I+}
Ok := (IoResult=0) and (E>=0.000001) ;
If not Ok then BaoLoi;
Until Ok;
End;
Procedure Lam;
Var X : Real;
Begin
X0 := 1;
Repeat
X := X0;
X0 := (X + A/X)/2;
Until Abs(X0-X) < E;
End;
Procedure Hien;
Begin
Writeln('can bac 2 cua ',A:8:2,' la ',X0:8:2,' voi do chinh xac ',E:8:6); End;
BEGIN
Clrscr;
Nhap;
Lam;
Hien;
Readln;
END
Trang 11{ Bài 9 Tìm nghiệm đa thức bằng thuật toán chia đôi cung }
Uses Crt;
Const Max = 10;
e = 0.0001;
Type Mang = Array[1 Max] of Real;
Var A : Mang;
x1,x2 : Real;
N : Byte;
Procedure Nhap1;
Var i : Byte;
Begin
Clrscr;
Write('N = ');
Repeat
{$I-} Readln(N); {$I+}
Until (IoResult=0) and (N>0) and (N<Max);
For i:=N downto 0 do
Repeat
Write('A[',i:2,']=');
{$I-} Readln(A[i]); {$I+}
Until (IoResult=0);
End;
Function F(x:Real):Real;
Var i : Byte;
p : Real;
Begin
p := A[n]*x+A[n-1];
For i:=2 to n do
p := p*x+A[n-i];
F := p;
End;
Procedure Nhap2;
Var dem : Byte;
Ok : Boolean;
Begin
Writeln;
dem := 0;
Repeat
Write('Nhap x1 : F(x1)<0 x1 = ');
{$I-} Readln(x1); {$I+}
Ok := (IoResult=0) and (F(x1)<0);
If not Ok then
Begin
Inc(dem);
Writeln('Nhap sai yeu cau lan thu ',dem); End;
Until Ok or (dem =3);
Writeln;
dem := 0;
Repeat
Write('Nhap x2 : F(x2)>0 x2 = ');
{$I-} Readln(x2); {$I+}
Ok := (IoResult=0) and (F(x2)>0);
If not Ok then
Begin
Inc(dem);
Writeln('Nhap sai yeu cau lan thu ',dem); End;
Until Ok or (dem =3);
End;