Các chiến lược phân tích thiết kế giải thuật
Trang 1ĐẠI HỌC SÀI GÒN
PHÂN TÍCH VÀ THIẾT KẾ
GIẢI THUẬT
Giảng viên hướng dẫn : Th.S Nguyễn Hòa
Nhóm sinh viên thực hiện:
Nguyễn Xuân Vũ – 3109410224 Ngô Văn Chơn – 3109410016
Lê Thị Diễm Trinh – 3109410196 Đặng Anh Đào – 3109410030
Trang 2I Chiến lược thiết kế trực tiếp
1 Bài toán tìm cặp điểm gần nhau
for ( int i = 0; i < d.Length; i++)
for ( int j = i + 1; j < d.Length; j++) {
double k = Math Sqrt((d[i].x - d[j].x) * (d[i].x - d[j].x) + (d[i].y- d[j].y) * (d[i].y - d[j].y));
if (k < Dmin) {
Dmin = k;
A.x = i; A.y = j;
} }
Thời gianMảng
d Giao diện chương trình demo
Trang 32 Bài toán tìm chuỗi mẫu
a Thuật toán
public int BruteForceStringMatch()
{
int lchuoi = chuoi.Length;
int lchuoimau = chuoimau.Length;
for ( int i = 0; i < lchuoi-lchuoimau+1; i++) {
Trang 4- Trường hợp xấu nhất thực hiện n-m+1 chuyến so sánh mỗi chuyến thực hiện m lần so các ký tự, T(n) = O(nm)
d Giao diện chương trình demo
II Chiến lược thiết kế quy hoạch động
1 Bài toán Fibonacci
Trang 5a[1] = a[2];
a[2] = a[0] + a[1];
- Thời gian tính toán thao tác cơ bản là C
- Độ phức tạp bài toán là T(n) = O(n)
Trang 63 Bài toán Robot
Trang 7b[i, j] = Max(b[i - 1, j], b[i, j - 1]) + a[i, j];
- Thời gian tinhs toán thao tác cơ bản là C
d Giao diện chương trình demo
4 Bài toán người đi du lịch
a Thuật toán
public void TravelingSalesman()
Trang 8{
Queue < int > T = new Queue < int >(); // mảng chứa chu trinh
Stack < int > Road = new Stack < int >(); // Mảng đường đi
for ( int i = 1; i < _N; i++)
Random ran = new Random ();
for ( int i = 0; i < n; i++)
/* Tạo n! đường và tìm chi phí nhỏ nhất */
private void Compute( Queue < int > T, Stack < int > Road)
Trang 9for ( int i = 1; i < Road.Count; i++)
tong += a[_Road[i], _Road[i - 1]];
Trang 105 Bài toán Dijsktra
a Giải thuật
public bool Dijkstra(int s)
{
int[] Mark = new int[n]; // dùng để! lưu lại đỉ!nh chưa dc chọn
int[] d = new int[n]; // lưu độ dài đường đi
int[] pr = new int[n]; // dùng để! lưu lại đỉ!nh trước
for (int i = 0; i < n; i++)
if (Mark[i] == 0 && d[i] < min)
for(int i=0;i<n;i++)
if (Mark[i] == 0 && a[s, i] > 0 && (d[k] + a[k,i] < d[i]))
Trang 11{ //kho!i tạo max values
for (int i = 0; i < n; i++) {
d[i] = 1000000;
mark[i] = 0; // đỉ!nh chưa dc chọn
pr[i] = s; // đỉ!nh trước là s
} // khở!i tạo đường đi đau tiển
for (int i = 0; i < n; i++) {
if (a[s, i] > 0) d[i] = a[s, i];
} d[s] = 0; mark[s] = 1; // đã lấ@y dc đỉ!nh s
}
b Độ phức tạp
- Kích thước đầu vào là n
- Phép toán cơ bản là phép so sánh
if (Mark[i] == 0 && a[s, i] > 0 && (d[k] + a[k, i] < d[i]))
- g i C là th i gian th c hi n thao tác c b n ọi C là thời gian thực hiện thao tác cơ bản ời gian thực hiện thao tác cơ bản ực hiện thao tác cơ bản ện thao tác cơ bản ơ bản ản T(n) = O(n2)
- Thời gian truy tìm đường đi sau khi có kết quả là O(n)
d Giao diện chương trình demo
Trang 12PHÂN TÍCH THIẾT KẾ GIẢI THUẬT
1 Tìm kiếm Sequential Search
Trang 13- Output: Vị trí của k trong mảng hoặc -1 nếu không tìm thấy
- Phép toán cơ bản là phép so sánh “i < arr.Length-1
d Giao diện chương trình demo
2 Binary Search
Trang 14- Input: mảng A, khóa key
- Output: vị trí key trong mảng hoặc trả về giá trị -1 nếu không tìm thấy.
d Giao diện chương trình demo
Trang 15- Input: mảng arr chưa được sắp xếp
- Output: mảng arr được sắp xếp
- Thao tác cơ bản là thao tác so sánh “ if (arr[j] < arr[min])”
Trang 16100000 20.3945745
020000
for (int i = 0; i < arr.Length - 1; i++)
for (int j = 0; j < arr.Length - 1; j++)
- Input: mảng arr chưa được sắp xếp
- Output: mảng arr được sắp xếp tăng dần
- Thao tác cơ bản là so sánh if (arr[j + 1] < arr[j])
Trang 18}
}
b Độ phức tạp
- Input: mảng arr chưa sắp xếp.
- Output: mảng arr được sắp xếp
- Thao tác cơ bản la so sánh “arr[j]> temp”
Trang 19int i,j,k;
int[] L= new int [n1+1];
int[] R= new int [n2+1];
- Độ phức tạp của giải thuật Merge() là O(n),
- Thời gian chạy của giải thuật MergeSort() là T(n)= 2T(n/2)+O(n) ,n>1
Áp dụng định lý Master suy ra độ phức tạp T(n)= O(nlog2n).
Trang 229 Bài toán cái túi.
Trang 23}
b Độ phức tạp
- Kích thước đầu vào là n và W
- Thao tác cơ bản là so sánh if (w[i] <= j)
Trang 24for (int i = 2; i < C.Length; i++)
- Kích thước đầu vào là n
- Thao tác cơ bản là so sánh if (C[i] + F[i - 2] > F[i - 1])
Trang 2511 Thuật toán tháp hà nội
b Độ phức tạp
T(n)= 2n -1