Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 77 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
77
Dung lượng
139,55 KB
Nội dung
PHÂN TÍCH THUẬT TỐN 15.1 THUẬT TỐN VÀ CÁC VẤN ĐỀ LIÊN QUAN 15.2 TÍNH HIỆU QUẢ CỦA THUẬT TỐN 15.3 KÝ HIỆU Ơ LỚN VÀ BIỂU DIỄN THỜI GIAN CHẠY BỞI KÝ HIỆU Ô LỚN 15.4 ĐÁNH GIÁ THỜI GIAN CHẠY CỦA THUẬT TOÁN Với vấn đề đặt có nhiều thuật tốn giải, ch ẳng hạn người ta tìm nhiều thuật toán xếp mảng d ữ liệu (chúng ta nghiên cứu thuật toán xếp ch ương 17) Trong trường hợp thế, cần sử dụng thuật toán người ta th ường ch ọn thuật tốn có thời gian thực thuật tốn khác Mặt khác, bạn đưa thuật toán để giải vấn đề m ột câu h ỏi đ ặt thuật tốn có ý nghĩa thực tế khơng? Nếu thuật tốn có th ời gian thực lớn chẳng hạn hàng năm, hàng kỷ đương nhiên khơng thể áp dụng thuật tốn thực tế Như cần đánh giá thời gian thực thuật tốn Phân tích thuật tốn, đánh giá th ời gian chạy thuật toán lĩnh vực nghiên cứu quan c khoa học máy tính Trong chương này, nghiên c ứu ph ương pháp đánh giá thời gian chạy thuật toán cách s d ụng ký hiệu l ớn, cách đánh gía thời gian chạy thuật tốn ký hiệu l ớn Tr ước tới mục tiêu trên, thảo luận ngắn gọn s ố v ấn đ ề liên quan đến thuật tốn tính hiệu thuật tốn 15.1 THUẬT TỐN VÀ CÁC VẤN ĐỀ LIÊN QUAN Thuật toán hiểu đặc tả xác dãy b ước có th ể thực cách máy móc để giải quy ết vấn đề C ần nh ấn mạnh rằng, thuật tốn có liệu vào (Input) d ữ li ệu (Output); thực thuật tốn (thực bước mơ tả), thuật toán cần cho liệu tương ứng với liệu vào Biểu diễn thuật tốn Để đảm bảo tính xác, có th ể hiểu cách nhất, thụât toán cần mơ tả ngơn ngữ lập trình thành chương trình (hoặc hàm, thủ tục), tức thu ật tốn cần mơ tả dạng mã (code) Tuy nhiên, trình bày m ột thuật tốn ngắn gọn đảm bảo đủ xác, ng ười ta thường biểu diễn thuật toán dạng giả mã (pseudo code) Trong cách biểu diễn này, người ta sử dụng câu lệnh ngôn ngữ lập trình (pascal C++) ký hiệu tốn học, mệnh đề ngơn ng ữ tự nhiên (tiếng Anh tiếng Việt chẳng hạn) T ất thu ật toán đưa sách trình bày theo cách Trong m ột số trường hợp, để người đọc hiểu ý tưởng khái qt thuật tốn, người ta biểu diễn thuật toán dạng sơ đồ (thường gọi sơ đồ khối) Tính đắn (correctness) thuật tốn Địi hỏi truớc hết thuật tốn phải đắn, tức th ực phải cho liệu mà ta mong muốn tương ứng với liệu vào Chẳng h ạn n ếu thuật toán thiết kế để tìm ước chung lớn số nguyên dương, đưa vào số nguyên dương (dữ liệu vào) th ực thuật toán phải cho số nguyên dương (dữ liệu ra) ước chung l ớn nh ất số nguyên Chứng minh cách chặt chẽ (bằng tốn học) tính đ ắn c thu ật toán cơng việc khó khăn Tuy nhiên đối v ới ph ần l ớn thu ật tốn trình bày sách này, thấy (bằng cách l ập luận khơng hồn tồn chặt chẽ) thuật tốn đ ắn, không đưa chứng minh chặt chẽ tốn h ọc M ột tính ch ất quan khác thuật tốn tính hiệu (efficiency), thảo luận tính hiệu thuật tốn mục Đến đặt câu hỏi: có ph ải đối v ới v ấn đ ề có thuật tốn giải (có thể tìm lời giải thu ật tốn)? câu trả lời khơng Người ta phát số vấn đề không th ể đ ưa thuật tốn để giải Các vấn đề gọi vấn đ ề khơng giải thuật tốn 15.2 TÍNH HIỆU QUẢ CỦA THUẬT TỐN Người ta thường xem xét thuật tốn, lựa chọn thuật toán để áp dụng dựa vào tiêu chí sau: Thuật tốn đơn giản, dễ hiểu Thuật tốn dễ cài đặt (dễ viết chương trình) Thuật tốn cần nhớ Thuật tốn chạy nhanh Khi cài đặt thuật toán để sử dụng số lần, người ta th ường lựa chọn thuật tốn theo tiêu chí Tuy nhiên, có nh ững thu ật tốn sử dụng nhiều lần, nhiều chương trình, ch ẳng hạn thuật tốn xếp, thuật tốn tìm kiếm, thuật toán đồ th ị… Trong trường hợp người ta lựa chọn thuật toán để sử dụng theo tiêu chí Hai tiêu chí nói tới tính hiệu thu ật tốn Tính hiệu thuật tốn gồm hai yếu tố: dung lượng nh mà thuật tốn địi hỏi thời gian thực thuật tốn Dung l ượng nh gồm nhớ dùng để lưu liệu vào, liệu ra, kết trung gian thực thuật toán; dung lượng nhớ mà thuật tốn địi h ỏi cịn gọi độ phức tạp không gian thuật toán Th ời gian th ực hi ện thuật toán nói tới thời gian chạy (running time) độ ph ức tạp thời gian thuật toán Sau ch ỉ quan tâm tới đánh giá thời gian chạy thuật toán Đánh giá thời gian chạy thuật toán cách nào? Với cách ti ếp cận thực nghiệm cài đặt thuật tốn cho ch ạy ch ương trình máy tính với số liệu vào Thời gian chạy mà ta thu phụ thuộc vào nhiều nhân tố: • Kỹ người lập trình • Chương trình dịch • Tốc độ thực phép tốn máy tính • Dữ liệu vào Vì vậy, cách tiếp cận thực nghiệm, ta khơng th ể nói th ời gian chạy thuật toán đơn vị thời gian Chẳng hạn câu nói “th ời gian chạy thuật tốn 30 giây” chấp nhận Nếu có hai thuật tốn A B giải vấn đề, ta không th ể dùng phương pháp thực nghiệm để kết luận thuật toán chạy nhanh h ơn, ta chạy chương trình với số liệu vào Một cách tiếp cận khác để đánh giá thời gian chạy thuật tốn phương pháp phân tích sử dụng cơng cụ tốn học Chúng ta mong muốn có kết luận thời gian chạy thuật tốn mà không ph ụ thuộc vào cài đặt thuật tốn, khơng phụ thuộc vào máy tính mà thuật tốn thực Để phân tích thuật tốn cần sử dụng khái niệm cỡ (size) liệu vào Cỡ liệu vào xác định phụ thuộc vào thuật tốn Ví dụ, thuật tốn tính định thức ma trận vng cấp n, ta chọn cỡ liệu vào cấp n ma trận; đ ối v ới thu ật tốn xếp mảng cỡ n cỡ liệu vào cỡ n m ảng Đương nhiên có vơ số liệu vào cỡ Nói chung ph ần lớn thuật toán, cỡ liệu vào số nguyên dương n Th ời gian chạy thuật toán phụ thuộc vào cỡ liệu vào; chẳng hạn tính định thức ma trận cấp 20 địi hỏi thời gian chạy nhiều h ơn tính định thức ma trận cấp 10 Nói chung, cỡ liệu lớn thời gian thực thuật tốn lớn Nhưng thời gian thực thuật tốn khơng phụ thuộc vào cỡ liệu vào mà cịn phụ thuộc vào d ữ li ệu vào Trong số liệu vào cỡ, thời gian chạy thuật toán thay đổi Chẳng hạn, xét tốn tìm xem đ ối t ượng a có m ặt danh sách (a 1,… , a i,…, a n ) hay khơng Thuật tốn sử dụng thuật tốn tìm kiếm tuần tự: Xem xét phần tử danh sách phát đối tượng cần tìm dừng lại, h ết danh sách mà không gặp phần tử a Ở cỡ liệu vào n, danh sách với a phần tử đầu tiên, ta cần lần so sánh trường hợp tốt nhất, danh sách mà a xuất hi ện vị trí cuối a khơng có danh sách, ta cần n l ần so sánh a v ới t ừng a i (i=1,2,…,n), trường hợp trường hợp xấu nh ất Vì v ậy, cần đưa vào khái niệm thời gian chạy tr ường h ợp xấu th ời gian chạy trung bình Thời gian chạy trường hợp xấu (worst-case running time) thuật toán thời gian chạy lớn thuật tốn tất liệu vào cỡ Chúng ta ký hi ệu th ời gian ch ạy trường hợp xấu T(n), n cỡ d ữ li ệu vào Sau nói tới thời gian chạy thuật toán cần hiểu th ời gian chạy trường hợp xấu Sử dụng thời gian chạy trường h ợp xấu để biểu thị thời gian chạy thuật tốn có nhiều ưu ểm Trước hết, đảm bảo rằng, thuật tốn khơng tiêu tốn nhiều thời gian thời gian chạy Hơn nữa, áp d ụng, tr ường h ợp x ấu thường xuyên xảy Chúng ta xác định thời gian chạy trung bình (average running time) thuật tốn số trung bình cộng thời gian ch ạy thu ật tốn tất liệu vào cỡ n Thời gian chạy trung bình c thu ật tốn ký hiệu T tb (n) Đánh giá thời gian chạy trung bình c thuật tốn cơng việc khó khăn, cần ph ải sử d ụng cơng c ụ c xác suất, thống kê cần phải biết phân phối xác suất c d ữ li ệu vào Rất khó biết phân phối xác suất d ữ li ệu vào Các phân tích thường phải dựa giả thiết liệu vào có phân ph ối xác su ất Do đó, sau ta đánh giá th ời gian chạy trung bình Để phân tích đưa kết luận thời gian chạy thuật toán độc lập với cài đặt thuật toán ngơn ngữ lập trình, đ ộc l ập v ới máy tính sử dụng để thực thuật toán, đo th ời gian ch ạy thuật toán số phép toán sơ cấp cần phải thực ta th ực thuật toán Cần ý rằng, phép toán sơ cấp phép toán s ố học, phép toán logic, phép tốn so sánh,…, nói chung, phép tốn sơ cấp cần hiểu phép toán mà th ực ch ỉ đòi h ỏi m ột thời gian cố định (thời gian nhiều hay ph ụ thu ộc vào t ốc độ máy tính) Như xác định thời gian chạy T(n) số phép toán sơ cấp mà thuật tốn địi hỏi, thực thuật tốn d ữ li ệu vào cỡ n Tính biểu thức mô tả hàm T(n) xác định nh không đơn giản, biểu thức thu phức tạp Do đó, ch ỉ quan tâm tới tốc độ tăng (rate of growth) hàm T(n), tức t ốc đ ộ tăng thời gian chạy cỡ liệu vào tăng Ví dụ, giả sử thời gian ch ạy thuật toán T(n) = 3n + 7n + (phép toán sơ cấp) Khi cỡ n tăng, hạng thức 3n định tốc độ tăng hàm T(n), nên ta bỏ qua hạng th ức khác nói thời gian chạy thuật tốn tỉ lệ với bình ph ương c ỡ liệu vào Trong mục định nghĩa ký hiệu ô lớn sử dụng ký hiệu ô lớn để biểu diễn thời gian chạy thuật tốn 15.3 KÝ HIỆU Ơ LỚN VÀ BIỂU DIỄN THỜI GIAN CHẠY BỞI KÝ HIỆU Ô LỚN 15.3.1 Định nghĩa ký hiệu ô lớn Bây đưa định nghĩa khái niệm hàm “ô lớn” hàm khác Định nghĩa Giả sử f(n) g(n) hàm thực không âm c đ ối s ố nguyên không âm n Ta nói “f(n) lớn c g(n)” vi ết f(n) = O( g(n) ) tồn số dương c n cho f(n) = n Như vậy, f(n) = O(g(n)) có nghĩa hàm f(n) bị chặn b ởi hàm g(n) với nhân tử n đ ủ l ớn Mu ốn ch ứng minh đ ược f(n) = O(g(n)), cần nhân tử c , số nguyên d ương n chứng minh f(n) = n o Ví dụ Giả sử f(n) = 5n + 2n + 13n + , ta có: f(n) = 5n + 2n + 13n + = 1, ta có n = 1, c = 26 Do đó, ta nói f(n) = O(n ) Tổng quát f(n) đa thức bậc k c n: f(n) = a k n k + a k-1 n k-1 + + a n + a f(n) = O(n k ) Sau đưa số hệ từ định nghĩa ký hiệu l ớn, giúp hiểu rõ chất ký hiệu ô lớn (Lưu ý, hàm mà ta nói tới hàm thực khơng âm đối số nguyên dương) • Nếu f(n) = g(n) + g (n) + + g k (n), hàm g i (n) (i=1, ,k) tăng chậm hàm g(n) (tức g i (n)/g(n) > 0, n >0) f(n) = O(g(n)) • Nếu f(n) = O(g(n)) f(n) = O(d.g(n)), d h ằng s ố d ương • Nếu f(n) = O(g(n)) g(n) = O(h(n)) f(n) = O(h(n)) (tính b ắc cầu) Các kết luận dễ dàng chứng minh dựa vào định nghĩa ký hiệu ô lớn Đến đây, ta thấy rằng, chẳng h ạn f(n) = O(n ) f(n) = O(75n ), f(n) = O(0,01n ), f(n) = O(n + 7n + logn), f(n) = O(n ), , tức có vơ số hàm cận (với nhân tử đó) hàm f(n) Một nhận xét quan trọng là, ký hiệu O(g(n)) xác đ ịnh tập hợp vô hạn hàm bị chặn hàm g(n), ta vi ết f(n) = O(g(n)) có nghĩa f(n) hàm 15.3.2 Biểu diễn thời gian chạy thuật toán Thời gian chạy thuật toán hàm cỡ liệu vào: hàm T(n) Chúng ta biểu diễn thời gian chạy thuật tốn ký hi ệu lớn: T(n) = O(f(n)), biểu diễn có nghĩa th ời gian ch ạy T(n) b ị ch ặn hàm f(n) Thế ta nhận xét, hàm có vơ s ố c ận Trong số cận thời gian chạy, lấy c ận chặt (tight bound) để biểu diễn thời gian chạy thuật toán Định nghĩa Ta nói f(n) cận chặt T(n) • T(n) = O(f(n)), • Nếu T(n) = O(g(n)) f(n) = O(g(n)) Nói cách khác, f(n) cận chặt T(n) cận T(n) ta khơng thể tìm hàm g(n) cận c T(n) mà lại tăng chậm hàm f(n) Sau nói thời gian chạy thuật toán O(f(n)), c ần hiểu f(n) cận chặt thời gian chạy Nếu T(n) = O(1) điều có nghĩa thời gian ch ạy c thu ật toán bị chặn số đó, ta thường nói thuật tốn có thời gian chạy Nếu T(n) = O(n), th ời gian chạy c thu ật tốn b ị chặn hàm tuyến tính, ta nói th ời gian ch ạy c thu ật tốn tuyến tính Các cấp độ thời gian chạy thuật toán tên g ọi c chúng liệt kê bảng sau: Đối với thuật toán, đánh giá th ời gian ch ạy c thuộc cấp độ cấp độ liệt kê Trong bảng trên, xếp cấp độ thời gian chạy theo thứ tự tăng dần, ch ẳng h ạn thuật tốn có thời gian chạy O(logn) chạy nhanh thuật tốn có th ời gian chạy O(n), Các thuật tốn có thời gian ch ạy O(n k ), với k = 1,2,3, , gọi thuật toán thời gian ch ạy đa th ức (polynimial-time algorithm) Để so sánh thời gian chạy thuật toán thời gian đa th ức thuật toán thời gian mũ, xem xét bảng sau: Trong bảng trên, ta giả thiết phép toán sơ cấp cần micro giây để thực Thuật tốn có thời gian chạy n , với cỡ liệu vào n = 20, địi hỏi thời gian chạy 20 x10 -6 = 0,004 giây Đối với thuật toán thời gian mũ, ta thấy thời gian chạy thuật toán chấp nh ận với liệu vào có cỡ khiêm tốn, n < 30; c ỡ d ữ li ệu vào tăng, thời gian chạy thuật toán tăng lên nhanh trở thành s ố khổng lồ Chẳng hạn, thuật toán với thời gian chạy n , để tính kết với liệu vào cỡ 60, địi hỏi thời gian 1,3x10 13 kỷ! Để thấy số khổng lồ đến mức nào, ta liên tưởng tới vụ nổ “big-bang”, “bigbang” ước tính xảy cách 1,5x10 kỷ Chúng ta khơng hy vọng áp dụng thuật tốn có th ời gian chạy mũ t ương lai nhờ tăng tốc độ máy tính, khơng thể tăng tốc đ ộ máy tính lên được, hạn chế quy luật vật lý Vì nghiên cứu tìm thuật tốn hiệu (chạy nhanh) cho vấn đề có nhiều ứng dụng thực tiễn luôn mong muốn nhà tin học 15.4 ĐÁNH GIÁ THỜI GIAN CHẠY CỦA THUẬT TỐN Mục trình bày kỹ thuật để đánh giá thời gian ch ạy thuật tốn ký hiệu lớn Cần lưu ý rằng, đánh giá th ời gian ch ạy c thu ật tốn cơng việc khó khăn, đặc biệt đối v ới thu ật toán đ ệ quy Tuy nhiên kỹ thuật đưa mục cho phép đanh giá đ ược th ời gian chạy hầu hết thuật toán mà ta gặp th ực tế Tr ước h ết cần biết cách thao tác ký hiệu ô lớn Quy tắc “c ộng ký hiệu ô lớn” sau sử dụng thường xuyên 15.4.1 Luật tổng Giả sử thuật toán gồm hai phần (hoặc nhiều phần), thời gian ch ạy phần đầu T (n), phần sau T (n) Khi thời gian chạy thuật tốn T (n) + T (n) suy từ đánh giá T (n) T (n) theo luật sau: Luật tổng Giả sử T (n) = O(f(n)) T (n) = O(g(n)) Nếu hàm f(n) tăng nhanh hàm g(n), tức g(n) = O(f(n)), T (n) + T (n) = O(f(n)) Luật chứng minh sau Theo định nghĩa ký hiệu l ớn, ta tìm số c , c , c n , n , n cho T (n) = n T (n) = n g(n) = n Đặt n = max(n1 , n2 , n3 ) Khi với n >= n0 , ta có T1 (n) + T2 (n) m= CM Tris * (M*V) = 1x (121.13 *1) =121.13g *EDTA 0.5M (M=372.24 g/mol) CM EDTA = n/V=m/(M*V) => m= CM =186.12g EDTA * (M*V) = 0.5 x (372.24 *1) *NaCl 5M( M=58.4 g/mol) CM NaCl = n/V=m/(M*V) => m= CM NaCl * (M*V) = x (58.4*1) = 292 g b.Pha V2 ml Buffer A (0.1M Tris; 0.5M NaCl, 0.005M EDTA pH 8) từ dung dịch gốc Tris 1M, NaCl 5M, EDTA 0.5M Phải dung d ịch gốc để pha Buffer A Dựa vào cơng thức C1V1=C2V2 ta tính thể tích dung dịch gốc cần pha sau: V1 = C2V2 / C1 * VTris.HCl = 0.1* V2/1 = V2/10 ml * VNaCl = 0.5* V2/5 = V2 /10 ml * VEDTA = 0.005* V2/0.5 = V2 /100 ml Tổng thể tích dung dịch gốc = V2/10 + V2/10 +V2/100 =21V2/100 ml Þ Thể tích nước cất thêm vào = V2– 79 V2/100= 79V2/100 ml ... ại – loại máy "ảo" gọi Máy ảo Java (Java Virtual Machine – JVM) Ngôn ngữ máy dành cho máy ảo Java gọi Java bytecode, hay ng ắn gọn bytecode Để chạy chương trình Java loại máy tính bất kì, người... Máy ảo Java – Java Virtual Machine Ngôn ngữ máy bao gồm thị (instruction) đơn giản mà CPU máy tính thực trực tiếp Tuy nhiên, hầu h ết ch ương trình viết ngơn ngữ lập trình bậc cao nh Java hay... ngôn ngữ bậc cao cần dịch sang ngôn ngữ máy trước chạy máy tính Việc dịch trình biên dịch thực Để chạy loại máy tính v ới ngơn ng ữ máy khác nhau, cần đến trình biên dịch phù h ợp v ới loại ngôn