Thuat Toan
Upcoming SlideShare
Loading in...5
×
 

Thuat Toan

on

  • 15,549 views

 

Statistics

Views

Total Views
15,549
Views on SlideShare
15,521
Embed Views
28

Actions

Likes
3
Downloads
234
Comments
0

2 Embeds 28

http://www.slideshare.net 26
http://localhost 2

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Thuat Toan Thuat Toan Presentation Transcript

  • THUẬT TOÁN
    • Thuật toán
    • Đị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ữu
    • hạ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ữa
    • và cực đại tạm thời tại thời điểm này chính là số nguyên lớn
    • nhấ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ừ đây
    • Về sau ta sẽ dùng C++ để mô tả thuật toán.
    • Ví dụ Thuật toán tìm phần tử lớn nhất trong dãy viết theo ngôn
    • ngữ 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án
    • Đầu vào(input): Thuật toán có các giá trị đầu vào lấy từ một
    • tậ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ủa
    • bài toán.
  • 3.Tính xác định: Các bước của thuật toán phải được xác định một cá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ính Xá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ốn theo 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ện mộ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ài toán có dạng như yêu cầu chứ không chỉ cho một tập đặc biệt các giá 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án Int 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;} }; } } }
    • B. Thuật toán tìm kiếm
    • Bà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ử a 1 , a 2 , …,
    • a n , hoặc xác định rằng nó không có mặt trong danh sách đó. Lời
    • giải của bài toán này là vị trí của số hạng có giá trị bằng x trong
    • danh 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.
    • Thuật toán tìm kiếm tuyến tính
    • int timkiemtuyentinh(int x; billy[100]; int n)
    • {
    • int i= 0 ;
    • while ((x!=billy[i])&&(i<=n-1))
    • i++;
    • if i<= n-1
    • cout<< “vi tri la :”<< i;
    • else cout<<“ khong tim thay”;
    • }
  • b. Thuật toán tìm kiếm nhị phân: thuật toán này được dùng khi mả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ếm int j= n-1 ;//j là điểm mút phải của khoảng tìm kiếm while i<j { int m= (i+j)/2; if x>billy[m] i=m+1; else j=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”; }
  • C. Các thuật toán sắp xếp
    • 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;
    • }
    • }
    • }
    • }
  • 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í i a[i]=m; } }
  • *Thuật toán tham lam đổi tiền Bà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); }
  • D. Thuật toán số nguyên
    • 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 b
    • a=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)
  • 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ài toá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ũng như vậy nhưng có đầu vào nhỏ hơn. Ví dụ 1: Thuật toán đệ quy tính a n 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); }
  • 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 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 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ên hoặc bất kì một phép tính sơ cấp nào khác.
    • Ví dụ:
    • 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ật toá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).
    • 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).