Tải bản đầy đủ (.docx) (23 trang)

Các chiến lược phân tích thiết kế giải thuật

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (905.69 KB, 23 trang )

ĐẠI HỌC SÀI GÒN
1
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
I. 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
a. Thuật toán
private void BruteForce(Pairs []d,ref Pairs A)
{
double Dmin = 9999;
A = new Pairs();
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;
}
}
}
b. Độ phức tạp
- Thao tác cơ bản là : 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));
- Gọi thời gian tính thao tác cơ bản là C
- T(n) = O(n
2
)
c. Test
Mảng Thời gian
100 0.002 (s)
1000 0.025 (s)
10000 2.795 (s)
d. Giao diện chương trình demo
2
2. 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++)
{
int j = 0;
while ((j < lchuoimau) && (chuoimau[j] == chuoi[i + j]))
j = j + 1;
if (j == lchuoimau)
return i+1;
}
return -1;
}
b. Độ phức tạp
3

- Trường hợp tốt nhất T(n) = O(n)
- 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)
- Trường hợp trung bình T(n) = (

i=0
n−m
(
1
)
mcp/(n-m+1) + (1-p)(n-m+1)mc
c. Test
Mảng Thời gian
100 0000289 (?)
2000 0005001 (?)
5000 0007068 (?)
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
a. Giải thuật
public double Values()
{
double[] a = { 0, 1, 1 };
if (_n < 0) return 0;
if (_n < 3) return a[_n];
for (int i = 3; i <= _n; i++)
{
a[0] = a[1];
4
a[1] = a[2];

a[2] = a[0] + a[1];
}
return a[2];
}
e. Độ phức tạp
- Kích thước đầu vào là n
- Thao tác cơ bản là phép gán
a[0] = a[1];
a[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)
f. Test
Mảng Thời gian
100 1ms
1000 1ms
10000 3ms
g. Giao diện chương trình demo
3. Bài toán Robot
a. Thuật toán
public int RoadRobot()
{
5

×