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

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

Đ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

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

ĐẠ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 TimKiem(); TruyTim(_n - 1, _n - 1); return list.Count; } private void TimKiem() { for (int i = 1; i < _n; i++) { b[i, 0] = 0; b[0, i] = 0; for (int j = 1; j < _n; j++) b[i, j] = Max(b[i - 1, j], b[i, j - 1]) + a[i, j]; } } private void TruyTim(int x,int y) { if (x == 0 || y == 0) return; int _x = x, _y = y; if (b[x - 1, y] > b[x, y - 1]) _x = x - 1; else _y = y - 1; TruyTim(_x, _y); if (b[x, y] > b[_x, _y]) list.Add(" (" + x + "," + y + ")"); } b. Độ phức tạp - Kích thước đầu vào là n - Thao tác cơ bản là b[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 T(n) = O(n 2 ) - Thời gian truy tìm đường đi khi có kết quả là O(n) c. Test Mảng Thời gian 100 4 (ms) 500 36 (ms) 1000 119(ms) d. Giao diện chương trình demo 6 4. Bài toán người đi du lịch a. Thuật toán public void TravelingSalesman() { 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++) T.Enqueue(i); Road.Push(0); Compute(T, Road); } private void Create(int n) { Random ran = new Random(); for (int i = 0; i < n; i++) { for (int j = 0; j < i; j++) { a[i, j] = ran.Next(i + 100, 100001 + i + j) % 199 + 1; a[j, i] = a[i, j]; } a[i, i] = 0; } } /* Tạo n! đường và tìm chi phí nhỏ nhất */ 7 private void Compute(Queue<int> T,Stack<int> Road) { for (int i = 0; i < T.Count; i++) { Road.Push(T.Dequeue()); Compute(T,Road); T.Enqueue(Road.Pop()); } /* Tính chi phí đường đi vừa tìm được */ if (T.Count == 0) { int k = CostsTraveling(Road); if (k < _Costs_Min) { _Road_Min = Road.ToArray(); _Costs_Min = k; } } } /*chi phí đi*/ private int CostsTraveling(Stack<int> Road) { int[] _Road = Road.ToArray(); int tong = 0; // tính chi phí trong mảng [0-n] for (int i = 1; i < Road.Count; i++) tong += a[_Road[i], _Road[i - 1]]; // tính chi phí trở về return tong + a[_Road[Road.Count - 1], _Road[0]]; } b. Độ phức tạp - Thao tác cơ bản là xác định một hoán vị trong (n-1)! Hoán vị đường đi - Gọi C là thời gian tính toán 1 thao tác cơ bản T(n) = O((n-1)!) c. Test Mảng Thời gian 10 0.324s 8 d. Giao diện chương trình demo 5. 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 Initialize(s, d, pr, Mark); int dem = n - 1; while (dem > 0) { int k=-1,min =1000000; for (int i = 0; i < n; i++) if (Mark[i] == 0 && d[i] < min) { k = i; min = d[i]; } if (k == -1) return false; // đồ thị không lien thông Mark[k] = 1; 9 for(int i=0;i<n;i++) if (Mark[i] == 0 && a[s, i] > 0 && (d[k] + a[k, i] < d[i])) { d[i] = d[k] + a[s, i]; pr[i] = k; } dem--; } return true; } private void Initialize(int s,int [] d,int []pr,int [] mark) { //khỏ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 T(n) = O(n 2 ) - Thời gian truy tìm đường đi sau khi có kết quả là O(n) c. Test Mảng Thời gian 1000 0,0750043 (s) 5000 1,8211041 (s) 10000 6,1153498 (s) d. Giao diện chương trình demo 10 [...]...PHÂN TÍCH THIẾT KẾ GIẢI THUẬT 1 Tìm kiếm Sequential Search a Giải thuật public static int SequentialSearch2(int[] arr, int k) { arr[arr.Length -1] = k; int i = 0; while (arr[i] != k) { i = i + 1; } if

Ngày đăng: 08/04/2013, 00:43

Từ khóa liên quan

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

Tài liệu liên quan