1. Trang chủ
  2. » Thể loại khác

ĐÁNH GIÁ THUẬT TOÁN=Cấu trúc dữ liệu và giải thuật

20 3 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 20
Dung lượng 557,46 KB

Nội dung

Trung tâm Đào tạo E-learning   Cơ hội học tập cho người   BÀI 1: CÁC KHÁI NIỆM CƠ BẢN Mục tiêu: Trong này, Anh/Chị cần đạt mục tiêu sau: Nắm khái niệm Cấu trúc liệu thuật toán Biết cách đánh giá độ phức tạp thuật toán xác định ký hiệu Olớn cho thuật toán Biết cách biểu diễn thuật tốn Nắm bước thiết kế thuật toán Nắm khái niệm biết cách xây dựng thuật toán đệ quy Nội dung: Trong chương tập trung trình bày khái niệm giải thuật phương pháp biểu diễn giải thuật Chương nêu phương pháp phân tích đánh giá thuật toán, khái niệm liên quan đến việc tính tốn thời gian thực chương trình I CÁC KHÁI NIỆM CƠ BẢN Việc giải tốn thực tế máy tính ln ln bắt đầu việc xây dựng mơ hình tốn học, tức đưa dạng thích hợp để giải máy tính Mà tốn thực tế bao gồm đối tượng liệu yêu cầu xử lý đối tượng Như vậy, để xây dựng mơ hình tin học phản ánh toán thực tế cần trọng đến hai vấn đề: *Tổ chức biểu diễn đối tượng thực tế: Các đối tượng liệu thực tế đa dạng, phong phú thường chứa đựng quan hệ với nhau, mơ hình tin học tốn, cần phải tổ chức, xây dựng cấu trúc thích hợp cho vừa phản ánh xác liệu thực tế đó, vừa dễ dàng dùng máy tính để xử lý Công việc gọi xây dựng cấu trúc liệu cho toán *Xây dựng thao tác xử lý liệu: Từ yêu cầu xử lý thực tế, cần tìm giải thuật tương ứng để xác định trình tự thao tác máy tính phải tác động lên liệu kết mong muốn, bước xây dựng giải thuật cho toán Trên thực tế giải tốn máy tính thường có khuynh hướng trọng đến việc xây dựng giải thuật mà quên tầm quan trọng việc tổ chức liệu toán Cần nhớ rằng: Giải thuật phản ánh phép xử lý, đối tượng xử lý giải thuật lại liệu, liệu chứa đựng thơng tin cần Cấu trúc liệu giải thuật - Bài Trang Trung tâm Đào tạo E-learning   Cơ hội học tập cho người   thiết để thực giải thuật Vì để xác định giải thuật phù hợp cần phải biết tác động đến loại liệu (ví dụ để làm nhuyễn hạt đậu, người ta dùng cách xay không băm dao, đậu văng ngồi thời gian nhiều) chọn lựa cấu trúc liệu cần phải hiểu rõ thao tác tác động đến (ví dụ để biểu diễn điểm số sinh viên người ta dùng số thực thay chuỗi ký cịn phải thực thao tác tính trung bình từ điểm số đó) Như đề án tin học, giải thuật cấu trúc liệu có mối quan hệ với nhau, chúng thể qua công thức tiếng nhà toán học người Thụy sĩ Niklaus Wirth - tác giả ngơn ngữ lập trình Pascal sau: Cấu trúc liệu + Giải thuật = Chương trình Với cấu trúc liệu chọn, có giải thuật tương ứng, phù hợp Khi cấu trúc liệu thay đổi thường giải thuật phải thay đổi theo để tránh việc xử lý gượng ép, thiếu tự nhiên cấu trúc không phù hợp Hơn nữa, cấu trúc liệu tốt giúp giải thuật xử lý phát huy tác dụng tốt hơn, vừa đáp ứng nhanh vừa tiết kiệm tài nguyên, đồng thời giải thuật dễ hiểu đơn giản Ví dụ 0.1 Một chương trình quản lý điểm thi sinh viên cần lưu trữ điểm số sinh viên Do sinh viên có điểm số ứng với mơn học khác nên liệu có dạng bảng sau: Sinh viên Môn Môn Môn SV1 SV2 SV3 SV4 Chỉ xét thao tác xử lý xuất điểm số môn học sinh viên Giả sử có phương án tổ chức lưu trữ sau: Phương án 1: Sử dụng mảng chiều Có tất 4(Sv) x 4(mơn) = 12 điểm số cần lưu trữ, khai báo mảng diem sau: int diem [12] = { }; Khi mảng diem phần tử lưu trữ sau: Cấu trúc liệu giải thuật - Bài Trang Trung tâm Đào tạo E-learning   Cơ hội học tập cho người   Và truy xuất điểm số môn j sinh viên i – (là phần tử dòng i, cột j S sử dụng S công thức xác định sốStương ứng mảng diem: bảng) - phải bảngđiểm(dòng i, cột j) tương đương với diem[((i-1)*số cột) +j] Ngược lại, với phần tử mảng, muốn biết điểm số sinh viên nào, mơn gì, phải dùng cơng thức xác định sau: diem[i] tương đương với diem[((i-1)*số cột) + j] Ở phương án này, thao tác xử lý cài đặt sau: void indiem() { const int somon = 3; int sv, mon; for (int i=0; i0 ∃n0>0 để T(n) ≤ C.f(n) + C.g(n), ∀n≥n0 Vậy T(n) ≤ C.f(n) + C.g(n) ≤ 2C.max(f(n).g(n)) ∀n≥n0 Từ định nghĩa ta suy T(n) = O(max(f(n),g(n)) c Quy tắc cộng Nếu đoạn chương trình P1 có thời gian thực T1(n) = O(f(n)) đoạn chương trình P2 có thời gian thực T2(n) = O(g(n)) thời gian thực P1 đến P2 là: T1(n) + T2(n) = O( max( f(n), g(n) )) Chứng minh: T1(n) = O(f(n)) nên ∃n1 c1 để T1(n) ≤ c1.f(n) với ∀n≥n1 T2(n) = O(g(n)) nên ∃n2 c2 để T2(n) ≤ c2.g(n) với ∀n≥n2 Chọn n0 = max(n1, n2) c = max( c1, c2) Ta có: ∀n≥n0 T1(n) + T2(n) ≤ c1.f(n) + c2.g(n) ≤ c.f(n) + c.g(n) ≤ c(f(n) + g(n)) ≤ 2c max(f(n), g(n)) Vậy, T1(n) + T2(n) = O( max( f(n), g(n) )) d Quy tắc nhân Nếu đoạn chương trình P có thời gian thực T(n) = O(f(n)) Khi đó, thực k(n) lần đoạn chương trình P với k(n) = O(g(n)) độ phức tạp O(g(n).f(n)) Chứng minh: Thời gian thực k(n) lần đoạn chương trình P k(n) Theo định nghĩa: ∃nk ck để k(n)≤ck.g(n) với ∀n≥nk ∃nT cT để T(n)≤cT.f(n) với ∀n≥nT Vậy với ∀n≥max(nT, nk) ta có k(n).T(n)≤cT.ck(g(n).f(n)) Độ phức tạp tính tốn với tình trạng liệu vào Có nhiều trường hợp, thời gian thực giải thuật không phụ thuộc vào kích thước liệu mà cịn phụ thuộc vào tình trạng liệu Chẳng hạn thời gian xếp dãy số theo thứ tự tăng dần mà dãy đưa vào chưa có thứ tự khác với thời gian xếp dãy số xếp xếp theo thứ tự ngược lại Lúc này, phân tích thời gian thực giải thuật ta phải xét tới trường hợp tốt nhất, trường hợp trung bình trường hợp xấu v Phân tích thời gian thực giải thuật trường hợp xấu (worstcase analysis): với kích thước liệu n, tìm T(n) thời gian lớn thực giải thuật liệu kích thước n phân tích thời gian thực giải thuật dựa hàm T(n) Cấu trúc liệu giải thuật - Bài Trang 14 Trung tâm Đào tạo E-learning   Cơ hội học tập cho người   v Phân tích thời gian thực trường hợp tốt (best-case analysis): với kích thước liệu n, tìm T(n) thời gian thực liệu kích thước n phân tích thời gian thực giải thuật dựa hàm T(n) v Phân tích thời gian trung bình thực giải thuật (average-case analysis): giả sử liệu vào tuân theo phân phối xác suất (chẳng hạn phân bố nghĩa khả chọn liệu vào nhau) tính tốn giá trị kỳ vọng (trung bình) thời gian chạy cho kích thước liệu n (T(n)), sau phân tích thời gian thực giải thuật dựa hàm T(n) Phân lớp toán Như ý trên, hầu hết thuật tốn có tham số N, thơng thường số lượng phần tử liệu xử lý Tham số ảnh hưởng nhiều tới thời gian chạy Tham số N bậc đa thức, kích thước tập tin xếp hay tìm kiếm, số nút đồ thị, v.v, … Hầu hết tất thuật tốn giáo trình có thời gian chạy tiệm cận tới hàm sau: Hằng số: Hầu hết thị chương trình thực lần hay nhiều vài lần Nếu tất thị chương trình có tính chất nói thời gian chạy số Điều hiển nhiên hồn cảnh phấn đấu để đạt việc thiết kế thuật tốn logN: Khi thời gian chạy chương trình logarit tức thời gian chạy chương trình tiến chậm N lớn dần Thời gian chạy thuộc loại xuất chương trình mà giải tốn lớn cách chuyển thành tốn nhỏ hơn, cách cắt bỏ kích thước bớt số Với mục đích chúng ta, thời gian chạy có xem nhỏ số “lớn“ Cơ số logarit làm thay đổi số khơng nhiều: Khi N 1000 logN số 10, 10 số 2; N triệu, logN nhân gấp N nhân đôi, logN tăng lên thêm số N: Khi thời gian chạy chương trình tuyến tính, nói chung trường hợp mà số lượng nhỏ xử lý làm cho phần tử liệu nhập Khi N triệu thời gian chạy cỡ Khi N nhân gấp đơi thời gian chạy nhân gấp đơi Đây tình tối ưu cho thuật toán mà phải xử lý N liệu nhập (hay sản sinh N liệu xuất) NlogN: Đây thời gian chạy tăng dần lên cho thuật toán mà giải toán cách tách thành tốn nhỏ hơn, giải chúng cách độc lập sau tổ hợp lời giải Bởi thiếu tính từ tốt (có lẽ “tuyến tính logarit”?), nói thời gian chạy thuật toán Cấu trúc liệu giải thuật - Bài Trang 15 Trung tâm Đào tạo E-learning   Cơ hội học tập cho người   “NlogN” Khi N triệu, NlogN có lẽ khoảng 20 triệu N nhân gấp đôi, thời gian chạy bị nhân lên nhiều gấp đôi (nhưng không nhiều lắm) N2: Khi thời gian chạy thuật tốn bậc hai, trường hợp có ý nghĩa thực tế cho toán tương đối nhỏ Thời gian bình phương thường tăng dần lên thuật toán mà xử lý tất phần tử liệu (có thể hai vịng lặp lồng nhau) Khi N tăng gấp đơi thời gian chạy tăng lên gấp lần N3: Tương tự, thuật toán mà xử lý ba phần tử liệu (có thể vịng lặp lồng nhau) có thời gian chạy bậc ba chí ý nghĩa thực tế toán nhỏ Khi N tăng gấp đơi thời gian chạy tăng lên gấp lần N: Một số thuật tốn có thời gian chạy lũy thừa lại thích hợp số trường hợp thực tế, thuật toán “sự ép buộc thô bạo” để giải tốn Khi N tăng gấp đơi thời gian chạy nâng lên luỹ thừa hai! Thời gian chạy chương trình cụ thể đơi hệ số nhân với số hạng nói (“số hạng dẫn đầu”) cộng thêm số hạng nhỏ Giá trị hệ số số hạng phụ thuộc vào kết phân tích chi tiết cài đặt Hệ số số hạng dẫn đầu liên quan tới số thị bên vòng lặp: Ở tầng tùy ý thiết kế thuật tốn phải cẩn thận giới hạn số thị Với N lớn số hạng dẫn đầu đóng vai trị chủ chốt; với N nhỏ số hạng đóng góp vào so sánh thuật tốn khó khăn Trong hầu hết trường hợp, gặp chương trình có thời gian chạy “tuyến tính”, “NlogN”, “bậc ba”,… với hiểu ngầm phân tích hay nghiên cứu thực tế phải làm trường hợp mà tính hiệu quan trọng V ĐỆ QUY Giới thiệu Đối tượng gọi đệ quy định nghĩa qua đối tượng khác dạng với quy nạp Ví dụ 0.9 Ta đặt hai dương đối diện nhau, sau đặt vật thể vào hai gương, ta thấy gương có hình ảnh gương vật thể ngược lại Hoặc trường hợp toán học ta gặp định nghĩa đệ quy tốn tính giai thừa số n Giai thừa tính theo ngun tắc: n = giai thừa ngược lại giai thừa (n) = n * giai thừa (n-1) Giải thuật đệ quy Giải thuật đệ quy lời giải toán P thực lời giải toán P’ khác có dạng giống P với P’ phải “nhỏ” P Cấu trúc liệu giải thuật - Bài Trang 16 Trung tâm Đào tạo E-learning   Cơ hội học tập cho người   Tùy thuộc cách diễn đạt tác vụ đệ quy mà có loại đệ quy sau: Đệ quy tuyến tính trường hợp thân hàm có lời gọi đến nó, Đệ quy nhị phân trường hợp thân hàm có lời gọi đến nó, Đệ quy phi tuyến trường hợp thân hàm lặp lời gọi nhiều lần đến nó, Đệ quy hỗ tương trường hợp có hai hàm đệ quy khác mà thân hàm đệ quy có lời gọi đến hàm đệ quy khác Để định nghĩa hàm đệ quy hay thủ tục đệ quy phải tiến hành xác định hai phần sau: • Phần neo (anchor): o Phần lời giải toán thực trường hợp đơn giản, o Có thể giải trực tiếp không cần phải nhờ đến tốn khác • Phần đệ quy: o Xác định tốn có toán cần giải thực gọi đệ quy giải tốn đó, o Chỉ để giải tốn phối hợp các tốn có lời giải lại với theo ngun tắc Ví dụ 0.10 Tính giai thừa n với n>=0 - Phần tử neo: n = Giai thừa = - Phần đệ quy: Giai thừa (n) = n * Giai thừa (n-1) Các bước để giải toán lời giải đệ quy: • Thơng số hóa tốn, • Tìm điều kiện biên (chặn) – lời giải với giá trị cụ thể Có nghĩa tìm giải thuật cho tình này, xác định phần tử neo tốn, • Tìm giải thuật tổng qt theo hướng đệ quy lui dần tình bị chặn Ví dụ 0.11 Tính tổng n phần tử mảng a số ngun Thơng số hóa: int *a, int n Điều kiện biên: Mảng phần tử tổng Giải thuật chung: Sum(a,n) = a[0] + a[1] + a[2] + + a[n-2] + a[n-1] = Sum(a, n-1) + a[n-1] Vậy công thức đệ quy là: Sum (a,n) = với n=0 a[n-1] + Sum(a, n-1) với n>0 Cấu trúc liệu giải thuật - Bài Trang 17 Trung tâm Đào tạo E-learning   Cơ hội học tập cho người   Ví dụ minh họa a Tính n! * Cách tính giá trị: n = 0: 0! = n = 1: 1! = n = 2: 2! = * = 1! * n = 3: 3! = * * = 2! * n = 4: 4! = * * * = 3! * n = 5: 5! = * * * * = 4! * * Công thức đệ quy: Giaithua(n) = với n = Giaithua(n-1) * n với n>0 * Cài đặt đệ quy long Giaithua( int n ) { if (n==0) return 1; else return Giaithua(n-1)* n; } b Dãy số Fibonaci * Cách tính giá trị - Phát biểu toàn: Dãy số Fibonaci bắt nguồn từ toán cổ sinh sản cặp thỏ Bài tốn phát biểu sau: Các thỏ khơng chết Hai tháng sau đời cặp thỏi sinh cặp thỏ (một đực cái) Khi sinh tiếp tục tháng chúng lại sinh cặp Câu hỏi đặt ra, ban đầu có cặp đời đến tháng thứ n có thêm cặp thỏ Ví dụ 0.12 Cho n = 5, Tính cặp thỏ sinh sản tháng n tương ứng Với n = 5, ta có: Tháng thứ 1: cặp (cặp ban đầu) Tháng thứ 2: cặp (cặp ban đầu chưa sinh thêm) Tháng thứ 3: cặp (có thêm cặp mới) Tháng thứ 4: cặp (cặp ban đầu tiếp tục đẻ thêm cặp chưa đẻ thêm) Cấu trúc liệu giải thuật - Bài Trang 18 Trung tâm Đào tạo E-learning   Cơ hội học tập cho người   Tháng thứ 5: cặp (cặp ban đầu tiếp tục để cặp bắt đầu đẻ mới) Hình 0.2 Minh họa dãy số Fibonaci Như vậy, để tính số cặp thỏ tháng thứ n trở tốn tính Fibonaci(n) với ngun tắc tính Fibonaci(n) = Fibonaci(n-2) + Fibonaci(n-1) * Cơng thức đệ quy: Fibonaci(n) = n = n = Fibonaci(n-2) + Fibonaci(n-1) với n>2 * Cài đặt đệ quy int Fibonaci( int n ) { if (n==1 or n==2) return 1; else return Fibonaci(n-2) + Fibonaci(n-1); } c Tính tổng phần tử mảng * Cách tính giá trị: Giả sử cho mảng a gồm n số khác nhau, để tính tổng phần tử mảng áp dụng theo nguyên tắc sau: n = 0: Tong(0) = n = 1: Tong(1) = a[0] = Tong(0) + a[0] n = 2: Tong(2) = a[0] + a[1] = Tong(1) + a[1] n = 3: Tong(3) = a[0] + a[1] + a[2] = Tong(2) + a[2] n = 4: Tong(4) = a[0] + a[1] + a[2] + a[3] = Tong(3) + a[3] … Cấu trúc liệu giải thuật - Bài Trang 19 Trung tâm Đào tạo E-learning   Cơ hội học tập cho người   Vậy xét tính tổng phần tử mảng a có n phần tử thực theo công thức TongMang(a,n) = TongMang(a,n-1) + a[n-1] * Công thức đệ quy: TongMang( a, n ) = với n = TongMang( a, n-1 ) + a[n-1] * Cài đặt đệ quy: int TongMang( int a[], int n ) { if (n==0) return 0; else return TongMang(a,n-1) + a[n-1]; }   Cấu trúc liệu giải thuật - Bài Trang 20

Ngày đăng: 23/03/2022, 03:48

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w