12
THUẬT TOÁN oán hĩa: Thuật toán là một tập hữu hạn các lệnh chính x hiện một tính toán, hoặc để giải một bài toán. tả thuật toán dùng để tìm giá trị lớn nhất trong m ố nguyên. Chúng ta thực hiện theo các bước sau: ạm thời lấy số nguyên đầu tiên của dãy làm giá trị o sánh số nguyên tiếp sau của dãy với cực đại tạm ếu nó lớn hơn cực đại tạm thời trước thì lấy số ngu c đại tạm thời sau. ặp lại bước trên nếu trong dãy còn số nguyên. ừng lại khi trong dãy không còn số nguyên nào nữa i tạm thời tại thời điểm này chính là số nguyên lớn dãy. oán cũng có thể mô tả bằng ngôn ngữ máy tính. Từ đâ sẽ dùng C++ để mô tả thuật toán.

Thuat Toan

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Thuat Toan

THUẬT TOÁN

A. Thuật toána. Định nghĩa: Thuật toán là một tập hữu hạn các lệnh chính xác

để thực hiện một tính toán, hoặc để giải một bài toán.Ví dụ: Mô tả thuật toán dùng để tìm giá trị lớn nhất trong một hữuhạn các số nguyên.Solution: Chúng ta thực hiện theo các bước sau:Bước 1: Tạm thời lấy số nguyên đầu tiên của dãy làm giá trị cựcđại.Bước 2: So sánh số nguyên tiếp sau của dãy với cực đại tạm thời và nếu nó lớn hơn cực đại tạm thời trước thì lấy số nguyênđó làm cực đại tạm thời sau.Bước 3: Lặp lại bước trên nếu trong dãy còn số nguyên.Bước 4: Dừng lại khi trong dãy không còn số nguyên nào nữavà cực đại tạm thời tại thời điểm này chính là số nguyên lớnnhất của dãy.• Thuật toán cũng có thể mô tả bằng ngôn ngữ máy tính. Từ đâyVề sau ta sẽ dùng C++ để mô tả thuật toán.

Page 2: Thuat Toan

Ví dụ Thuật toán tìm phần tử lớn nhất trong dãy viết theo ngônngữ C++ là:int max(billy[100], int n)

{int max= billy[0];for(i=1;i<=n-1;i++){

if (max<billy[i])max=billy[i];

}return(max);

};b. Tính chất của thuật toán1. Đầu vào(input): Thuật toán có các giá trị đầu vào lấy từ mộttập đã xác định.2. Đầu ra(output): Từ mỗi tập có giá trị đầu vào, thuật toán sẽTạo tập các giá trị đầu ra. Các giá trị đầu ra này là lời giải củabài toán.

Page 3: Thuat Toan

3.Tính xác định: Các bước của thuật toán phải được xác định mộtcách chính xác.4. Tính chính xác: Thuật toán phải tạo những giá trị đầu ra chínhXác ứng với mỗi tập giá trị đầu vào.5. Tính hữu hạn: Thuật toán phải tạo các giá trị đầu ra mong muốntheo một số hữu hạn bước ứng với mỗi tập giá trị đầu vào.6. Tính hiệu quả: Mỗi bước của thuật toán phải được thực hiệnmột cách chính xác, và trong một khoảng thời gian hữu hạn.7. Tính tổng quát: Thủ tục phải áp dụng được cho tất cả các bàitoán có dạng như yêu cầu chứ không chỉ cho một tập đặc biệt cácgiá trị đầu vào.

Ví dụ: Các hàm sau có và thiếu những đặc tính nào của Thuật toánInt gapdoi(int n) void chia(int n) void tong(int n) { while n>0 { while n>=0 { int sum=0;

n=2n; {int m=1/n; while (int i<10) return(n); n=n-1; {sum+=i;} }; } }

}

Page 4: Thuat Toan

B. Thuật toán tìm kiếmBài toán tìm kiếm tổng quát có thể được phát biểu như sau: Xácđịnh vị trí của phần tử x trong danh sách các phần tử a1, a2, …, an, hoặc xác định rằng nó không có mặt trong danh sách đó. Lờigiải của bài toán này là vị trí của số hạng có giá trị bằng x trongdanh sách và là 0 nếu x không có trong danh sách.Ta sẽ xét hai thuật toán: Thuật toán tìm kiếm tuyến tính và Thuật

toán tìm kiếm nhị phân.a. Thuật toán tìm kiếm tuyến tínhint timkiemtuyentinh(int x; billy[100]; int n){

int i=0;while ((x!=billy[i])&&(i<=n-1))

i++;if i<=n-1cout<< “vi tri la :”<< i;else cout<<“ khong tim thay”;

}

Page 5: Thuat Toan

b. Thuật toán tìm kiếm nhị phân: thuật toán này được dùng khimảng(dãy) đã được sắp xếp(tăng dần).int timkiemnhiphan(int x; billy[100]; int n){

int i=0;//i là điểm mút trái của khoảng tìm kiếmint j=n-1;//j là điểm mút phải của khoảng tìm kiếmwhile i<j{ int m= (i+j)/2;

if x>billy[m] i=m+1;elsej=m;

}if x=billy[i]cout<<“ vị trí của ”<<x<<“ là: “<< i;else cout<<“ không tìm thấy “<<x<<” trong mảng”;

}

Page 6: Thuat Toan

C. Các thuật toán sắp xếp

a) Sắp xếp kiểu nổi bọt( bulle sort)Void bulle sort(int a[100]; int n)//n là số phần tử của mảng{

for(int i=0; i<=n-2; i++){

for(int j=0; j<=n-2-i; j++){

if a[j] > a[j+1]{

int m=a[j+1];a[j+1] = a[j]; // đổi chỗ a[j+1] và a[j]a[j] = m;

}}

}}

Page 7: Thuat Toan

b) Sắp xếp kiểu chèn(insertion sort)Void insertion sort(int a[100]; int n){

for(int j=1; j<=n-1; j++){

int i=0;while(a[j] > a[i]) //so sánh a[j] với các phần tử{ // trước nó trong dãy

i++;}int m=a[i];for(int k=0; k<=j-i-1; k++){

a[j-k]=a[j-k-1]; // chèn phần tử a[j] vào

} // vị trí ia[i]=m;

}}

Page 8: Thuat Toan

*Thuật toán tham lam đổi tiềnBài toán đổi tiền đặt ra vấn đề đổi một số lượng tiền m thành các loại tiền xu

sao cho số lượng các đồng xu là ít nhất. int change(int a[100]; int n; int m)//mãng sắp sếp theo thứ tự giảm dần

{ //n là số các loại tiền(quarter, penny, nikel…

int k=0; //m là số tiền cần đổi

for(int i=0; i<=n-1; i++) //a[i] là mệnh giá đồng tiền thứ i

{while(a[i]<=m){

k++;m=m-a[i];

}}

return(k);}

Page 9: Thuat Toan

D. Thuật toán số nguyêna) Thuật toán tìm ước số chung lớn nhất(UCLN)(thuật toán EUCLID)Định lý: Cho a=bq+r với a, b, q, r là các số nguyên. Khi đó (a, b)=(b, r). Trong đó (x, y) là ước chung lớn nhất của hai số nguyên x và y.*Thuật toán EUCLID tìm UCLN của hai số a và b nguyên

int UCLN(int a; int b){

while (b!=0){

int r=a%b;//số dư của a chia cho ba=b;b=r;

}return(a);

}b) Thuật toán khai triển cơ số b (xem giáo trình)c) Thuật toán cộng hai số nguyên (xem giáo trình)d) Thuật toán nhân hai số nguyên (xem giáo trình)

Page 10: Thuat Toan

D. Các Thuật Toán Đệ Quy Định nghĩa: Một thuật toán được gọi là đệ quy nếu nó giải bàitoán bằng cách rút gọn liên tiếp bài toán gốc thành bài toán cũngnhư vậy nhưng có đầu vào nhỏ hơn.Ví dụ 1: Thuật toán đệ quy tính an float luythua(float a; int n){

if (n==0)return(0);else return(a*luythua(a,n-1));

}hoặc float luythua(float a; int n){ if (n==0)

float ketqua=0;else ketqua=a*luythua(a,n-1);return(ketqua);

}

Page 11: Thuat Toan

Ví dụ 2: Thuật toán đệ quy tính n!long giaithua(int n){

if (n==0)return (1);

return( n*giaithua(n-1));}

D. Độ phức tạp của thuật toán

Độ phức tạp tính toán của thuật toán

Độ phức tạp tính toán của thuật toán

Độ phức tạp thời gian của thuật toán Độ phức tạp thời gian của thuật toán

Độ phức tạp về không gian của thuật toán(bộ nhớ cần thiết)

Độ phức tạp về không gian của thuật toán(bộ nhớ cần thiết)

Page 12: Thuat Toan

Độ phức tạp thời gian của một thuật toán có thể được biểu diễn bằng số lượng các phép toán mà thuật toán đó phải thực hiện ứng với một quy mô xác định các giá trị đầu vào.Các phép toán đo độ phức tạp thời gian có thể là phép so sánh các số nguyên hay các phép cộng, trừ, nhân, chia số nguyênhoặc bất kì một phép tính sơ cấp nào khác.

Ví dụ:a)Trong thuật toán tìm phần tử cực đại trong dãy n phần tử,phép toán so sánh là phép toán sơ cấp được dùng trong thuậttoán này nên số lượng các phép so sánh sẽ là thước đo độphức tạp thời gian của thuật toán này. Số lượng các phép toán so sánh là 2n-1 do đó độ phức tạp thời gian của thuật toán này là O(n).b)Tương tự trong thuật toán tìm kiếm tuyến tính, số lượng các phép so sánh tối đa là 2n+2 do đó độ phức tạp thời gian của thuật toán này là O(n).