Thuật toán là gì

18 436 0
Thuật toán là gì

Đ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

sơ đồ khối và thao tác trên máy tính của các bài toán cơ bản.

Thuật toán gì? Thuật toán để giải một bài toán 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 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 Bướ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 phần tử thứ I của dãy Bước 6: kết thúc Tì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 a 1 a n 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 ai Mô tả thuật toán bằng liệt kê Bước 1: Nhập N và dãy a 1 ,,a n 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ụ dã y 5 1 4 7 6 3 15 8 4 9 12 i 2 3 4 5 6 7 8 9 10 11 Max 5 5 5 7 7 7 15 15 15 15 15 Giá trị lớn nhất : 15 Kiể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 một số nguyên dương Output: “N số nguyên tố” hoặc “N không số nguyên tố” Ý tưởng Một số nguyên dương N một số nguyên tố nếu nó có đúng hai ước số khác nhau 1 và chính nó.  Nếu N=1 thì N không số nguyên tố;  Nếu 1<N<4 thì N 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 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 nguyên tố rồi kết thúc Bước 4; i <-2; Bước 5 Nếu i> thì thông báo N 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 ( =5) b) N =45 ( =6) Mô phỏng theo ví dụ i 2 3 4 5 6 i N/i 29/2 29/3 29/4 29/5 N/i [ ] N [ ] N [ ] N Chia hết không? Không Không Không Không Chia hết không? 29 số nguyên tố 45 không số nguyên tố Thuật toán tìm kiếm tuần tự Xác định bài toán Input:Số n và dãy a 1 a n 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 a 1 a n và số nguyên k ( khóa) Bước 2: i<-1; Bước 3: Nếu a i =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. Ví dụ K=2 và N=10 k=6 và N=8 Mô phỏng theo ví dụ A 5 7 1 4 2 9 8 9 6 5 A 5 7 1 4 2 i 1 2 3 4 5 - - - - - i 1 2 3 4 5 Với i=5 thì a5=2 Với mọi i từ 1 đến 8 không có a có giá trị bằng 6 Thuậ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 a 1 a n 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= Khi đó chỉ xảy ra một trong ba trường hợp sau: -Nếu a giua=k thì Giua 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 a 1 a n 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<- ; 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.       + 2 1n       + 2 CuoiDau Mô tả thuật toán bằng Sơ đồ khối minh họa bằng chương trình Pascal minh họa bằng chương trình Pascal program bt; 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ụ 1 2 3 4 5 6 7 8 9 2 4 5 6 9 21 22 30 31 Dau 1 6 6 Cuoi 10 10 7 Giua 5 8 6 A giua 9 30 21 Lần duyệt 1 2 3 Ở lần duyệt thứ 3 a giua=21=k tại i=giua=6 Ví dụ K=25, N=10 Mô phỏng theo ví dụ 1 2 3 4 5 6 7 8 9 2 4 5 6 9 21 22 30 31 1 6 6 7 8 10 10 7 7 7 5 8 6 7 giua 9 30 21 22 Lần duyệt 1 2 3 4 5 Ở lần duyệt thứ 5 Dau> Cuoi kết luận không có số hạng =k Thuậ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 a 1 a n 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 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 a 1 a n 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 a i >a i+1 thì tráo đổi a i và a i+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ô phỏng theo ví dụ 6 1 5 3 7 8 10 7 12 4 1 3 5 6 7 7 4 8 10 12 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 Thuậ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 [...]... không không Hết … không không Khi k=5 UCLN giá trị của k lúc đó 5 ( sử dụng 126 lần duyệt) Xác định bài toán Ý tưởng Thuật toán tìm BCNN của hai số ( dạng 1) Input: nhập hai số a,b Output: BCNN của hai số 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... ’, k); readln; end Mô tả thuật toán bằng Sơ đồ khối Và minh họa bằng chương trình Pascal Ví dụ A=5; b= 15 k Lần duyệt Mô phỏng theo ví dụ 1 2 3 4 5 … 15 A 5 5 5 5 5 … B 15 15 15 15 15 … 1 2 3 4 5 15 K chia hết cho a và b ? không không không không không … Hết Khi k=15 BCNN giá trị của k lúc đó 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 bài toán Input:Số n và dãy a1... b; a:=b; b:=du; until b=0; write(a); readln; end Mô tả thuật toán bằng Sơ đồ khối Và minh họa bằng chương trình Pascal Ví dụ A=125; b=35 Mô phỏng theo ví dụ Lần duy ệt 1 2 3 4 5 A B du 125 35 20 15 5 35 20 15 5 0 20 15 5 0 Khi b bằng 0 UCLN giá trị của a lúc đó Thuật toán tìm ươc chung của hai số ( dạng 2) Xác định Input: nhập hai số a,b bài toán Output: ucln của hai số Nếu a=b thì gi trị chung đó... b');readln(b); Mô tả thuật toán bằng Sơ đồ khối repeat du:=a mod b; a:=b; b:=du; until b=0; Bc:=(M*N) div a Write (BC); readln; end Và minh họa bằng chương trình Pascal Ví dụ A=125; b=35 Mô phỏng theo ví dụ ; gán M cho a và N cho b Lần duy ệt 1 2 3 4 5 A B du 125 35 20 15 5 35 20 15 5 0 20 15 5 0 Khi b bằng 0 UCLN giá trị của a lúc đó và BC=(M*N)/a=875 Xác định bài toán Ý tưởng Thuật toán tìm Bội chung... write(‘UCLN’,a); readln; end Mô tả thuật toán bằng Sơ đồ khối Và minh họa bằng chương trình Pascal Ví dụ A=125; b=35 Mô phỏng theo ví dụ Lần duyệt 1 2 3 4 5 6 7 8 A 125 90 60 25 25 15 5 5 B 35 35 35 35 10 10 10 5 So sánh a>b a>b a>b ab a>b a . Thuậ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, . là giá trị của a lúc đó là 5 ( sử dụng 8 lần duyệt) Thuậ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à. 15 Giá trị lớn nhất là : 15 Kiể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

Ngày đăng: 11/05/2014, 11:07

Tài liệu cùng người dùng

Tài liệu liên quan