Các đặc trưng của thuật toán Tính kết thúc: Một thuật toán phải kết thúc sau một số hữu hạn thao tác Tính rõ ràng: theo nghĩa nhiều người khác nhau thực hiện thì phải cho cùng một kết qu
Trang 1Thuật toán là gì?
Thuật toán để giải một bài toán là một dãy hữư hạn các thao tác được sắp xếp theo một trình tự xác định sao cho sau khi thực hiện dãy thao tác ấy, từ input của bài toán, ta nhận được output cần tìm.
Các đặc trưng của thuật toán Tính kết thúc: Một thuật toán phải kết thúc sau một số hữu hạn thao tác
Tính rõ ràng: theo nghĩa nhiều người khác nhau thực hiện thì phải cho cùng một kết quả Tình phổ dụng: Thuật toán nào dùng được rộng rãi hơn tổng quát hơn thì tính phổ dụng cao
hơn
Tính hiệu quả: Ít tốn kém về số lượng thao tác, về vùng nhớ, về thời gian
Cách biểu diễn thuật toán
Người ta thường dùng hai phương pháp sau đây để mô tả thuật toán
a)Phương pháp liệt kê
b) Phương pháp sơ đồ khối ( Lưu đồ)
Hình O van thể hiện thao tác nhập xuất dữ liệu
Hình chữ nhật thể hiện các phép tính toán
Các mũi tên quy định trình tự thực hiện thao tác
Mũi tên ngược được hiểu là phép gán
Hình thoi thể hiện thao tác so sánh
Một số thuật toán đơn giản thường gặp 1)Hoán vị hai giá trị x,y có dùng biến trung gian
Bước 1: Dùng một biến trung gian tam và thực hiện tam ← x
Bước 2: x ←y
Bước 3: y← tam
Bước 4: kết thúc
2)Hoán vị hai giá trị x,y không dùng biến trung gian
Bước 1: x← x+y
Bước 2: y ←x-y
Bước 3: x← x-y
Bước 4: kết thúc
3)Tìm phần tử nhỏ nhất trong dãy a1 an
Bước 1: Nhập giá trị N và a1 an
Bước 2: I ← 1; Min← a1
Bước 3: i←i+1
Bước 4: nếu i> n thì xuất Min và chuyển đến bước 7 để kết thúc ngược lại thực hiện bước 5 Bước 5: Nếu ai<min thì min← ai
Bước 6 lặp lại bước 3
Bước 7 Kết thúc
4)Kiểm tra k có trong dãy a1 an không?
( Thuật toán tìm kiếm)
Bước 1: Nhập các giá trị n, a1 an, k
Bước 2: i←1
Bước 3: Nếu i> n thì sang bước 5, trái lại đến bước 4
Trang 2Bước 4: Nếu k=ai thì sang bước 5, trái lại i←i+1 và quay về bước3
Bước 5: Nếu i>n thì thông báo k không thuộc dãy, trái lại thông báo k là phần tử thứ I của dãy
Bước 6: kết thúc
Trang 3Tìm giá trị lớn nhất của một dãy số nguyên Xác định
bài toán
Input:
Số n và dãy a1 an
Output: Giá trị lớn nhất của dãy số nguyên
Y tưởng
Khởi tạo giá trị Max=a1;
Lần lượt với I từ 2 đến n so sánh các giá trị số hạng ai với Max, nếu ai>Max thì Max nhận giá trị mới là ai
Mô tả
thuật toán
bằng
liệt kê
Bước 1: Nhập N và dãy a1,,an
Bước 2: Max <- a1; i<-2;
Bước 3: Nếu i> N thì đưa ra giá trị Max rồi kết thúc Bước 4;
Bước 4.1 Nếu ai>Max thì Max<-ai Bước 4.2 i<-i+1 rồi quay lại bước 3
Mô tả
thuật toán
bằng Sơ đồ
khối
Và minh
họa bằng
chương
trình
Pascal
program bt;
uses crt;
var a:array[1 100] of integer; n,i, max:integer;
begin clrscr;
write('nhap n');readln(n); for i:=1 to n do
begin write('a[',i,']=');
readln(a[i]);
end;
Max:=0;
for i:=2 to n do
if a[i]>max then max:=a[i]; write('gia tri lon nhat la ',max);
readln;
end.
Ví dụ N=11 và dãy số 5,1,4,7,6,3,15,8,4,9,12
Mô phỏng
theo ví dụ
Giá trị lớn nhất là : 15
Trang 4Kiểm tra tính nguyên tố của một số nguyên dương Xác
định
bài
toán
Input: N là một số nguyên dương
Output: “N là số nguyên tố” hoặc “N không là số nguyên tố”
Ý
tưởng
Một số nguyên dương N là một số nguyên tố nếu nó có đúng hai ước số khác nhau là 1 và chính nó.
Nếu N=1 thì N không là số nguyên tố;
Nếu 1<N<4 thì N là số nguyên tố;
Nếu n>= 4 và không có ước số trong phạm vi từ 2 đến phần nguyên căn bậc 2 của
N thì N là số nguyên tố
Mô tả
thuật
toán
bằng
liệt kê
Bước 1: Nhập số nguyên dương N
Bước 2: Nếu N=1 thì thông báo N không nguyên tố rồi kết thúc
Bước 3: Nếu N<4 thì thông báo N là nguyên tố rồi kết thúc
Bước 4; i <-2;
Bước 5 Nếu i>[ ]N thì thông báo N là số nguyên tố rồi kết thúc
Bước 6 Nếu N chia hết cho I thì thông báo N không nguyên tố rồi kết thúc
Bước 7 i<- i+1 rồi qua lại bước 5
Mô tả
thuật
toán
bằng
Sơ đồ
khối
Và
minh
họa
bằng
chương
trình
Pascal
program bt;
uses crt;
var N,i:integer; kt:boolean ; begin
clrscr;
write('nhap N');readln(n);
if n=1 then write('N khong la so nguyen to')
else
if n<4 then write('N la so nguyen to')
else begin for i:=2 to trunc(sqrt(n)) do
if n mod i=0 then kt:=true;
if kt then write ('N khong la so nguyen to')
else write('N la so nguyen to'); end;
readln;
end.
Ví dụ a) N= 29 phần nguyên ([ ]N =5) b) N =45 ([ ]N =6)
Mô
phỏng
theo ví
dụ
Chia hết
không? Không Không Không Không Chia hết không? Không hết
29 là số nguyên tố 45 không là số nguyên tố
Trang 5Thuật toán tìm kiếm tuần tự Xác định
bài toán
Input:Số n và dãy a1 an và số nguyên k
Output: Chỉ số i có giá trị bằng khóa k
Ý tưởng
Tìm kiếm tuần tự được thực hiện một cách tự nhiên Lần lượt từ số hạng thứ nhất, ta so sánh giá trị số hạng đang xét với khóa cho đến khi hoặc gặp một số hạng bằng khóa hoặc dãy đã được xét hết và không co giá trị nào bằng khóa Trong trường hợp thứ 2 dãy A không có số hạng nào bằng khóa
Mô tả
thuật toán
bằng cách
liệt kê
Bước 1: Nhập N và dãy a1 an và số nguyên k ( khóa) Bước 2: i<-1;
Bước 3: Nếu ai=k thì thông báo chỉ số i rồi kết thúc Bước 4 i=i+1
Bước 5 Nếu i>N thì thông báo dãy A không có số hạng nào có giá trị bằng k rồi kết
thúc
Bước 6 Quay lại bước 3
Mô tả
thuật toán
bằng Sơ
đồ khối
Và minh
họa bằng
chương
trình
Pascal
program bt;
uses crt;
var a:array[1 100] of integer; n,i, max,k,m:integer;
kt:boolean;
begin clrscr;
write('nhap n'); readln(n);
for i:=1 to n do begin
write('a[',i,'] =');
readln(a[i]);
end;
write('nhap khoa k');
readln(k);
for i:=1 to n do
if a[i]=k then begin
kt:=true ; m:=i;
end;
if kt then write('chi so i la ',m) else
write('khong co gia tri bang khoa k');
readln;
end.
Mô phỏng
theo ví dụ
Với i=5 thì a5=2 Với mọi i từ 1 đến 8 không có ai
có giá trị bằng 6
Trang 6Thuật toán tìm kiếm nhị phân ( Binary Search) Xác định
bài toán
Input:Số n và dãy a1 an và số nguyên k ( Dãy đã sắp tăng)
Output: Chỉ số i có giá trị bằng khóa k
Ý tưởng
Dãy A đã sắp tăng, ta tìm cách thu hẹp nhanh phạm vi tìm kiếm sau mỗi lần so sánh với số hạng được chọn Để thực hiện điều này, ta chọn số hạng
a giua ở “giữa dãy” để so sánh với k, trong đó giua= +2
1
n
Khi đó chỉ xảy ra một trong ba trường hợp sau:
-Nếu a giua=k thì Giua là chỉ số cần tìm và kết thúc việc tìm kiếm Nếu a giua>k thì việc tìm kiếm thuộc khoảng từ a1 đến a giua-1 Nếu a giua<k thì việc tìm kiếm thuộc khoảng từ a giua+1 đến cuối dãy Quá trình trên sẽ lặp lại một số lần cho đến khi tìm thấy giá trị bằng k hoặc không
Mô tả
thuật toán
bằng cách
liệt kê
Bước 1: Nhập N và dãy a1 an và số nguyên k ( khóa) ( dạy a đã sắp tăng)
Bước 2: Dau<-1, Cuoi<- N;
Bước 3: giua<- +2
Cuoi Dau
;
Bước 4: Nếu a giua=k thì thông báo chỉ số Giua rồi kết thúc;
Bước 5: a giua>k thì đặt cuoi=giua+1, rồi chuyển đến bước 7;
Bước 6: Dau<- Giua+1;
Bước 7: Nếu Dau>Cuoi thì thông báo dãy A không có số hạng nào có giá
trị bằng k rồi kết thúc;
Bước 8 Quay lại bước 3.
Mô tả
thuật toán
bằng Sơ
đồ khối
minh họa
bằng
chương
trình
Pascal
minh họa program bt;
Trang 7chương
trình
Pascal
uses crt;
var a: array[1 100] of integer; i, n,k,dau,giua,cuoi: integer;
begin clrscr;
write('nhap n'); readln(n);
for i:=1 to n do begin
write('a[',i,'] =');
readln(a[i]);
end;
write('nhap khoa k'); readln(k);
dau:=1;
cuoi:=n;
repeat giua:=(dau+cuoi)div 2;
if a[giua]<k then dau:=giua+1 else
if a[giua]>k then cuoi:=giua-1 else
cuoi:= -1;
until dau>cuoi;
if cuoi=-1 then write(‘ giua la’, giua) else write('khong co gia tri bang khoa k');
readln;
end.
Ví dụ K=21, N=10
Mô phỏng
theo ví dụ
Ở lần duyệt thứ 3 a giua=21=k tại i=giua=6
Mô phỏng
theo ví dụ
Ở lần duyệt thứ 5 Dau> Cuoi kết luận không có số hạng =k
Trang 8Thuật toán sắp xếp tráo đổi ( Exchange Sort) (Sắp xếp nổi bọt ( Bubble Sort) Xác
định
bài
toán
Input:Số n và dãy a1 an
Output: Dãy A được sắp xếp lại thành dãy tăng ( không giảm)
Ý
tưởng
Với mỗi cặp số hạng đứng liền kề trong dãy, nếu số trước lớn hơn số sau ta đổi chỗ chúng cho nhau, việc đó được lặp lại cho đến khi không có sự đổi chỗ nào xảy ra nữa
Sau mỗi lần đổi chỗ giá trị lớn nhất của dãy chuyển dần về cuối dãy, và tiếp đến giá trị lớn thứ hai chuyển về gần cuối dãy cứ thế giống bọt nước nổi từ
đáy lên mặt nước gọi là sắp xếp nổi bọt
Mô tả
thuật
toán
bằng
liệt kê
Bước 1: Nhập N và dãy a1 an
Bước 2: M<-N
Bước 3: Nếu M<2 thì đưa ra dãy A đã được sắp xếp rồi kết thúc
Bước 4; M<-M-1; i<-0;
Bước 5 i<-i+1;
Bước 6 Nếu i>M thì quay lại bước 3
Bước 7 Nếu ai>ai+1 thì tráo đổi ai và ai+1 cho nhau
Bước 8 Quay lại bước 5
Mô tả
thuật
toán
bằng
Sơ đồ
khối
Và
minh
họa
bằng
chương
trình
Pascal
program bt;
uses crt;
var a:array[1 100] of integer;
n,i, tam,j,m:integer; kt:boolean;
begin clrscr;
write('nhap n'); readln(n); for i:=1 to n do
begin write('a[',i,']=');readln(a[i]); end;
for i:=1 to n do for j:=n downto 1+1 do
If a[ j ] < a[ j-1] Then Begin
tam :=a[ j ];
a[ j ] := a[j-1]; a[ j-1] := tam; End;
for i:=1 to n do write(a[ i ]:5);
readln;
end.
Ví dụ a) N= 10 dãy A= 6, 1, 5, 3, 7, 8, 10, 7, 12, 4
Mô 6 1 5 3 7 8 10 7 12 4 1 3 5 6 7 7 4 8 10 12
Trang 9theo ví
dụ
1 6 5 3 7 8 10 7 12 4 lần 4 1 3 5 6 7 4 7 8 10 12 Lần 1 1 5 6 3 7 8 10 7 12 4
1 5 3 6 7 8 10 7 12 4 lần 5 1 3 5 6 7 4 7 8 10 12
1 5 3 6 7 8 7 10 4 12 1 3 5 6 4 7 7 8 10 12
1 5 3 6 7 8 7 10 4 12
1 5 3 6 7 8 7 10 4 12 lần 6 1 3 5 6 4 7 7 8 10 12
1 3 5 6 7 8 7 10 4 12 1 3 5 4 6 7 7 8 10 12 Lần 2 1 3 5 6 7 7 8 10 4 12
1 3 5 6 7 7 8 4 10 12 lần 7 1 3 5 4 6 7 7 8 10 12
1 3 4 5 6 7 7 8 10 12
1 3 5 6 7 7 8 4 10 12 lần 8 1 3 4 5 6 7 7 8 10 12 Lần 3 1 3 5 6 7 7 4 8 10 12 lần 9 1 3 4 5 6 7 7 8 10 12 Lần 10 1 3 4 5 6 7 7 8 10 12
Trang 10Thuật toán tìm ươc chung của hai số ( dạng 1) Xác định
bài toán
Input: nhập hai số a,b Output: ucln của hai số
Ý tưởng
Ý tưởng của thuật tốn Euclide l UCLN của 2 số a,b cũng l UCLN của 2 số
b v a mod b, vậy ta sẽ đổi a l b, b l a mod b cho đến khi b bằng 0 Khi đĩ
UCLN l a
Mô tả
thuật toán
bằng cách
liệt kê
Bước 1: Nhập hai số a và b Bước 2: du<-a chia b
Bước 3: Nếu b = 0 chuyển qua bước 5 Bước 4 Nếu b<>0 thì a<-b; b<- du quay lại bước 2 Bước 5 đưa ra uớc chung lớn nhất của hai số và kết thúc
Mô tả
thuật toán
bằng Sơ
đồ khối
Và minh
họa bằng
chương
trình
Pascal
program bt;
uses crt;
var a,b,du:integer;
begin clrscr;
write('nhap so a');readln(a);
write('nhap so b');readln(b);
repeat du:=a mod b;
a:=b;
b:=du;
until b=0;
write(a);
readln;
end.
Ví dụ A=125; b=35
Mô phỏng
theo ví dụ
Lần
Khi b bằng 0 UCLN là giá trị của a lúc đó
Thuật toán tìm ươc chung của hai số ( dạng 2)
Trang 11Xác định
bài toán
Input: nhập hai số a,b Output: ucln của hai số
Ý tưởng
Nếu a=b thì gi trị chung đó l UCLN của a v b Nếu a<b thì UCLN(a,b) = UCLN(a, a-b) Nếu a>b thì UCLN(a,b)=UCLN(a-b,b)
Mô tả
thuật toán
bằng cách
liệt kê
Bước 1: Nhập hai số a và b;
Bước 2: Nếu a=b thì lấy giá trị chung này làm UCLN rồi chuyển đến bước
5;
Bước 3: Nếu a>b thì a<-a-b rồi quay lại bước 2;
Bước 4 b<-b-a rồi quay lại bước 2 ; Bước 5 đưa ra uớc chung lớn nhất của hai số và kết thúc
Mô tả
thuật toán
bằng Sơ
đồ khối
Và minh
họa bằng
chương
trình
Pascal
program bt;
uses crt;
var a,b:integer;
begin clrscr;
write('nhap so a');readln(a); write('nhap so b');readln(b);
repeat
if a>b then a:=a-b else
b:=b-a;
until a=b;
write(‘UCLN’,a);
readln;
end.
Ví dụ A=125; b=35
Mô phỏng
theo ví dụ
Lần duyệt A B So sánh a-<a-b b<-b-a
Khi a=b UCLN là giá trị của a lúc đó là 5
( sử dụng 8 lần duyệt)
Trang 12Thuật toán tìm ươc chung của hai số ( dạng 3) Xác định
bài toán
Input: nhập hai số a,b Output: ucln của hai số
Ý tưởng UCLN của hai số là hai số đó chia hết cho một số k nào đó trong khoảng từ 1 đến số thứ nhất ( với k cần tìm l số lớn nhất )
Mô tả
thuật toán
bằng cách
liệt kê
Bước 1: Nhập hai số a và b;
Bước 2: Nếu k>a thì lấy giá trị k này làm UCLN rồi chuyển đến bước 6; Bước 3: k<-k+1 ;
Bước 4: nếu a và b cùng chia hết cho k UCLN<-k quay lại bước 2 ;
Bước 5: a và b không chia hết cho k quay lại bước 2;
Bước 6 đưa ra uớc chung lớn nhất của hai số là k và kết thúc.
Mô tả
thuật toán
bằng Sơ
đồ khối
Và minh
họa bằng
chương
trình
Pascal
program bt;
uses crt;
var a,b,k,UCLN:integer; begin
clrscr;
write('nhap so a');readln(a); write('nhap so b');readln(b);
repeat k:=k+1;
if (a mod k=0) and (b mod k=0) then UCLN:=k;
until k>a;
write(‘uoc chung lon nhat ’, UCLN);
readln;
end.
Ví dụ A=125; b= 35
Mô phỏng
theo ví dụ
Khi k=5 UCLN là giá trị của k lúc đó là 5
( sử dụng 126 lần duyệt)
Thuật toán tìm BCNN của hai số ( dạng 1)
Trang 13Xác định
bài toán
Input: nhập hai số a,b Output: BCNN của hai số
Ý tưởng
Bội chung nhỏ nhất của hai số bằng tích của a và b chia cho UCLN của hai
số đó Từ đó muốn tìm BCNN của hai số ta cần tìm UCLN trước
Thuật tốn ny l viết tiếp thuật tốn tìm UCLN chỉ khc l cần phải gn a v b bằng một giá trị khác để thực hiện tính toán sau này vì khi tính tốn UCLN
gi trị a v b lc đó đ thay đổi
Mô tả
thuật toán
bằng cách
liệt kê
Bước 1: Nhập hai số a và b gán M<-a; N<-b;
Bước 2: du<-a chia b Bước 3: Nếu b = 0 chuyển qua bước 5 Bước 4 Nếu b<>0 thì a<-b; b<- du quay lại bước 2 Bước 5 đưa ra uớc chung lớn nhất (UCLN) của hai số
Bước 6: BC<-(M*N)/ UCLN Bước 7: xuất BCNN và kết thúc
Mô tả
thuật toán
bằng Sơ
đồ khối
Và minh
họa bằng
chương
trình
Pascal
program bt;
uses crt;
var a,b,du,M,N,bc:integer; begin
clrscr;
write('nhap so a');readln(a); write('nhap so b');readln(b);
repeat du:=a mod b;
a:=b;
b:=du;
until b=0;
Bc:=(M*N) div a Write (BC);
readln;
end.
Ví dụ A=125; b=35 ; gán M cho a và N cho b
Mô phỏng
theo ví dụ
Lần
Khi b bằng 0 UCLN là giá trị của a lúc đó và BC=(M*N)/a=875 Thuật toán tìm Bội chung nhỏ nhất của hai số ( dạng 2)
Xác định Input: nhập hai số a,b
Trang 14bài toán Output: BCNN của hai số
Ý tưởng BCNN của hai số là một số k nào đó chia hết cho hai số đ cho trong lần gặpđầu tiên trong khoảng từ 1 đến vô cùng.
Mô tả
thuật toán
bằng cách
liệt kê
Bước 1: Nhập hai số a và b;
Bước 2: k<-k+1 Bước 3: Nếu k không chia hết cho a và b thì chuyển đến bước 2 Bước 4: xuất k là BCNN và kết thúc.
Mô tả
thuật toán
bằng Sơ
đồ khối
Và minh
họa bằng
chương
trình
Pascal
program bt;
uses crt;
var a,b,k:integer;
begin clrscr;
write('nhap so a');readln(a);
write('nhap so b');readln(b);
repeat k:=k+1;
until (k mod a=0) and (
k mod b=0);
write(‘ Bọi chung nho nhat
la ’, k);
readln;
end.
Ví dụ A=5; b= 15
Mô phỏng
theo ví dụ
Lần duyệt A B k K chia hết cho a và b ?
Khi k=15 BCNN là giá trị của k lúc đó là 15
( sử dụng 15 lần duyệt)
Thuật toán đếm số thoả mãn điều kiện Xác định Input:Số n và dãy a1 an và số nguyên k
Trang 15bài toán Output: Có bao nhiêu giá trị bằng k
Ý tưởng
Tìm kiếm tuần tự được thực hiện một cách tự nhiên Lần lượt từ số hạng thứ nhất, ta so sánh giá trị số hạng đang xét với khóa cho đến khi hoặc gặp một số hạng bằng khóa thực hiện đếm hoặc dãy đã được xét hết và không
co giá trị nào bằng khóa Trong trường hợp thứ 2 dãy A không có số hạng nào bằng khóa đếm sẽ bằng không
Mô tả
thuật toán
bằng cách
liệt kê
Bước 1: Nhập N và dãy a1 an và số nguyên k ( khóa)
Bước 2: i<-1; dem<-0;
Bước 3: i=i+1
Bước 3: Nếu ai=k thì dem<- dem+1 quay lại bước 3
Bước 4 ai<> k quay lại bước 3 Bước 5 Nếu i>N thì đưa giá trị dem rồi kết thúc
Mô tả
thuật toán
bằng Sơ
đồ khối
Và minh
họa bằng
chương
trình
Pascal
program bt;
uses crt;
var a:array[1 100] of integer;
n,i, max,k,m, dem:integer; begin
clrscr;
write('nhap n'); readln(n); for i:=1 to n do
begin write('a[',i,'] =');
readln(a[i]);
end;
write('nhap khoa k');
readln(k);
for i:=1 to n do
if a[ i ]=k then dem:=dem+1;
write(' co ',dem , ‘so’) ; readln;
end.
Mô phỏng
theo ví dụ
Dem=2
Thuật toán tính tổng các số thoả mãn điều kiện Xác định Input:Số n và dãy a1 an và số nguyên k