Giáo trình toán rời rạc - Chương 1

18 1.2K 7
Giáo trình toán rời rạc - Chương 1

Đ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

Giáo trình môn toán rời rạc đào tạo ở trường kinh tế quốc dân. Các quy tắc của logic cho ý nghĩa chính xác của các mệnh đề. Các quy tắc này dùng được sử dụng để phân biệt giữa các lập luận t

CHƯƠNG I: THUẬT TOÁN 1.1 KHÁI NIỆM THUẬT TOÁN 1.1.1 Mở đầu: Có nhiều lớp tốn tổng qt xuất toán học rời rạc Chẳng hạn, cho dãy số nguyên, tìm số lớn nhất; cho tập hợp, liệt kê tập nó; cho tập hợp số nguyên, xếp chúng theo thứ tự tăng dần; cho mạng, tìm đường ngắn hai đỉnh Khi giao cho tốn việc phải làm xây dựng mơ hình dịch tốn thành ngữ cảnh toán học Các cấu trúc rời rạc dùng mơ hình tập hợp, dãy, hàm, hoán vị, quan hệ, với cấu trúc khác đồ thị, cây, mạng - khái niệm nghiên cứu chương sau Lập mơ hình tốn học thích hợp phần q trình giải Để hồn tất q trình giải, cịn cần phải có phương pháp dùng mơ hình để giải tốn tổng qt Nói cách lý tưởng, đòi hỏi thủ tục, dãy bước dẫn tới đáp số mong muốn Một dãy bước vậy, gọi thuật toán Khi thiết kế cài đặt phần mềm tin học cho vấn đề đó, ta cần phải đưa phương pháp giải mà thực chất thuật tốn giải vấn đề Rõ ràng rằng, khơng tìm phương pháp giải khơng thể lập trình Chính thế, thuật tốn khái niệm tảng hầu hết lĩnh vực tin học 1.1.2 Định nghĩa: Thuật toán bảng liệt kê dẫn (hay quy tắc) cần thực theo bước xác định nhằm giải toán cho Thuật ngữ “Algorithm” (thuật toán) xuất phát từ tên nhà toán học Ả Rập AlKhowarizmi Ban đầu, từ algorism dùng để quy tắc thực phép tính số học số thập phân Sau đó, algorism chuyển thành algorithm vào kỷ 19 Với quan tâm ngày tăng máy tính, khái niệm thuật tốn cho ý nghĩa chung hơn, bao hàm thủ tục xác định để giải tốn, khơng phải thủ tục để thực phép tính số học Có nhiều cách trình bày thuật tốn: dùng ngơn ngữ tự nhiên, ngôn ngữ lưu đồ (sơ đồ khối), ngơn ngữ lập trình Tuy nhiên, dùng ngơn ngữ lập trình lệnh phép ngơn ngữ dùng điều thường làm cho mơ tả thuật tốn trở nên rối rắm khó hiểu Hơn nữa, nhiều ngơn ngữ lập trình dùng rộng rãi, nên chọn ngơn ngữ đặc biệt điều người ta khơng muốn Vì thuật tốn ngồi việc trình bày ngơn ngữ tự nhiên với ký hiệu toán học quen thuộc cịn dùng dạng giả mã để mơ tả thuật toán Giả mã tạo bước trung gian mơ tả thuật tốn ngơn ngữ thơng thường thực thuật tốn ngơn ngữ lập trình Các bước thuật tốn rõ cách dùng lệnh giống ngơn ngữ lập trình Thí dụ 1: Mơ tả thuật tốn tìm phần tử lớn dãy hữu hạn số nguyên a) Dùng ngôn ngữ tự nhiên để mô tả bước cần phải thực hiện: Đặt giá trị cực đại tạm thời số nguyên dãy (Cực đại tạm thời số nguyên lớn kiểm tra giai đoạn thủ tục.) So sánh số nguyên tiếp sau với giá trị cực đại tạm thời, lớn giá trị cực đại tạm thời đặt cực đại tạm thời số ngun Lặp lại bước trước cịn số ngun dãy Dừng khơng cịn số nguyên dãy Cực đại tạm thời điểm số nguyên lớn dãy b) Dùng đoạn giả mã: procedure max (a1, a2, , an: integers) max:= a1 for i:= to n if max 0 Định nghĩa 1:Ta nói hàm f(n) có cấp thấp hay hàm g(n) tồn số C>0 số tự nhiên n0 cho |f(n)|  C|g(n)| với nn0 Ta viết f(n)=O(g(n)) cịn nói f(n) thoả mãn quan hệ big-O g(n) Theo định nghĩa này, hàm g(n) hàm đơn giản được, đại diện cho “sự biến thiên” f(n) Khái niệm big-O dùng toán học gần kỷ Trong tin học, sử dụng rộng rãi để phân tích thuật tốn Nhà toán học người Đức Paul Bachmann người đưa khái niệm big-O vào năm 1892 n( n  3) hàm bậc hai hàm bậc hai đơn giản n2 Ta có: n (n  3) n( n  3) f(n)= =O(n2)  n với n3 (C=1, n0=3) 2 Thí dụ 5: Hàm f(n)= Một cách tổng quát, f(n)=aknk+ak-1nk-1+ +a1n+a f(n)=O(nk) Thật vậy, với n>1, |f(n)||  |ak|nk+|a k-1|nk-1+ +|a 1|n+|a 0| = n k(|a k|+|ak-1|/n+ +|a1|/nk-1+a 0/nk)  nk(|ak|+|ak-1|+ +|a1|+a0) Điều chứng tỏ |f(n)|  Cn k với n>1 Cho g(n)=3n+5nlog2n, ta có g(n)=O(nlog2n) Thật vậy, 3n+5nlog2n = n(3+5log2n)  n(log2n+5log2n) = 6nlog2n với n8 (C=6, n0=8) Mệnh đề: Cho f1(n)=O(g1(n)) f2(n) O(g2(n)) Khi (f1 + f2)(n) = O(max(|g1(n)|,|g 2(n)|), (f1f2)(n) = O(g1(n)g2(n)) Chứng minh Theo giả thiết, tồn C1, C2, n1, n2 cho |f1(n)|  C1|g1(n)| |f2(n)|  C2|g2(n)| với n > n n > n2 Do |(f1 + f2)(n)| = |f1(n) + f2(n)|  |f1(n)| + |f2(n)|  C1|g1(n)| + C2|g2(n)|  (C1+C2)g(n) với n > n 0=max(n 1,n2), đâyC=C1+C2 g(n)=max(|g1(n)| , |g2(n)|) |(f1f2)(n)| = |f1(n)||f2(n)|  C1|g1(n)|C2|g 2(n)|  C1C2|(g1g2)(n)| với n > n0=max(n1,n2) 10 Định nghĩa 2: Nếu thuật tốn có độ phức tạp f(n) với f(n)=O(g(n)) ta nói thuật tốn có độ phức tạp O(g(n)) Nếu có hai thuật tốn giải tốn, thuật tốn có độ phức tạp O(g1(n)), thuật tốn có độ phức tạp O(g2(n)), mà g1(n) có cấp thấp g2(n), ta nói thuật tốn hữu hiệu (hay nhanh hơn) thuật toán 1.3.3 Đánh giá độ phức tạp thuật toán: 1) Thuật tốn tìm kiếm tuyến tính: Số phép so sánh dùng thuật toán xem thước đo độ phức tạp thời gian Ở bước vịng lặp thuật tốn, có hai phép so sánh thực hiện: để xem tới cuối bảng chưa để so sánh phần tử x với số hạng bảng Cuối phép so sánh làm ngồi vịng lặp Do đó, x=ai, có 2i+1 phép so sánh sử dụng Số phép so sánh nhiều nhất, 2n+2, đòi hỏi phải sử dụng phần tử x khơng có mặt bảng Từ đó, thuật tốn tìm kiếm tuyến tính có độ phức tạp O(n) 2) Thuật tốn tìm kiếm nhị phân: Để đơn giản, ta giả sử có n=2k phần tử bảng liệt kê a1,a2, ,an, với k số nguyên không âm (nếu n lũy thừa 2, ta xem bảng phần bảng gồm 2k+1 phần tử, k số nguyên nhỏ cho n < 2k+1) Ở giai đoạn thuật toán vị trí số hạng i số hạng cuối j bảng hạn chế tìm kiếm giai đoạn so sánh để xem bảng cịn nhiều phần tử hay khơng Nếu i < j, phép so sánh làm để xác định x có lớn số hạng bảng hạn chế hay không Như giai đoạn, có sử dụng hai phép so sánh Khi bảng phần tử, phép so sánh cho biết khơng cịn phần tử thêm phép so sánh cho biết số hạng có phải x hay khơng Tóm lại cần phải có nhiều 2k+2=2log2n+2 phép so sánh để thực phép tìm kiếm nhị phân (nếu n khơng phải lũy thừa 2, bảng gốc mở rộng tới bảng có k+1 phần tử, với k=[log2n] tìm kiếm địi hỏi phải thực nhiều 2[log2n]+2 phép so sánh) Do thuật tốn tìm kiếm nhị phân có độ phức tạp O(log2n) Từ phân tích suy thuật tốn tìm kiếm nhị phân, trường hợp xấu nhất, hiệu thuật tốn tìm kiếm tuyến tính 3) Chú ý: Một điều quan trọng cần phải biết máy tính phải cần để giải xong tốn Thí dụ, thuật tốn địi hỏi 10 giờ, cịn đáng chi phí thời gian máy tính địi hỏi để giải tốn Nhưng thuật tốn địi hỏi 10 tỉ năm để giải tốn, thực thuật tốn điều phi lý Một tượng lý thú công nghệ đại tăng ghê gớm tốc độ lượng nhớ máy tính Một nhân tố quan trọng khác làm giảm thời gian cần thiết để giải 11 toán xử lý song song - kỹ thuật thực đồng thời dãy phép tính Do tăng tốc độ tính tốn dung lượng nhớ máy tính, nhờ việc dùng thuật toán lợi dụng ưu kỹ thuật xử lý song song, toán vài năm trước xem giải được, giải bình thường Các thuật ngữ thường dùng cho độ phức tạp thuật toán: Độ phức tạp Thuật ngữ O(1) Độ phức tạp số O(logn) Độ phức tạp lôgarit O(n) Độ phức tạp tuyến tính O(nlogn) Độ phức tạp nlogn b O(n ) Độ phức tạp đa thức n O(b ) (b>1) Độ phức tạp hàm mũ O(n!) Độ phức tạp giai thừa Thời gian máy tính dùng thuật tốn: Kích thước Các phép tính bit sử dụng toán n logn N nlogn n2 2n 10 3.10-9 s 10-8 s 3.10-8 s 10-7 s 10-6 s 102 7.10-9 s 10-7 s 7.10-7 s 10-5 s 4.1013năm 103 1,0.10-8 s 10-6 s 1.10-5 s 10-3 s * -8 -5 -4 -1 10 1,3.10 s 10 s 1.10 s 10 s * -8 -4 -3 10 1,7.10 s 10 s 2.10 s 10 s * -8 -3 -2 10 2.10 s 10 s 2.10 s 17 phút * n! 3.10-3 s * * * * * 1.4 SỐ NGUYÊN VÀ THUẬT TOÁN 1.4.1 Thuật tốn Euclide: Phương pháp tính ước chung lớn hai số cách dùng phân tích số ngun thừa số ngun tố khơng hiệu Lý chỗ thời gian phải tiêu tốn cho phân tích Dưới phương pháp hiệu để tìm ước số chung lớn nhất, gọi thuật toán Euclide Thuật toán biết từ thời cổ đại Nó mang tên nhà tốn học cổ Hy lạp Euclide, người mơ tả thuật toán sách “Những yếu tố” tiếng ơng Thuật tốn Euclide dựa vào mệnh đề sau Mệnh đề (Thuật toán chia): Cho a b hai số nguyên b0 Khi tồn hai số nguyên q r cho a = bq+r,  r < |b| Trong đẳng thức trên, b gọi số chia, a gọi số bị chia, q gọi thương số r gọi số dư 12 Khi b nguyên dương, ta ký hiệu số dư r phép chia a cho b a mod b Mệnh đề 2: Cho a = bq + r, a, b, q, r số nguyên Khi UCLN(a,b) = UCLN(b,r) (Ở UCLN(a,b) để ước chung lớn a b.) Giả sử a b hai số nguyên dương với a  b Đặt r0 = a r1 = b Bằng cách áp dụng liên tiếp thuật toán chia, ta tìm được:  r2 < r1 r0 = r 1q1 + r2 r1 = r 2q2 + r3  r3 < r2  rn < rn-1 rn-2 = rn-1q n-1 + r n rn-1 = rnq n Cuối cùng, số dư xuất dãy phép chia liên tiếp, dãy số dư a = r0 > r1 > r2 >  chứa a số hạng Hơn nữa, từ Mệnh đề ta suy ra: UCLN(a,b) = UCLN(r0,r1) = UCLN(r1,r2) = = UCLN(rn-2, rn-1) = UCLN(rn-1,rn) = rn Do đó, ước chung lớn số dư khác khơng cuối dãy phép chia Thí dụ 6: Dùng thuật tốn Euclide tìm UCLN(414, 662) 662 = 441.1 + 248 414 = 248.1 + 166 248 = 166.1+ 82 166 = 82.2 + 82 = 2.41 Do đó, UCLN(414, 662) = Thuật tốn Euclide viết dạng giả mã sau: procedure ƯCLN (a,b: positive integers) x := a y := b while y  begin r := x mod y x := y y := r end {UCLN (a,b) x} Trong thuật toán trên, giá trị ban đầu x y tương ứng a b Ở giai đoạn thủ tục, x thay y y thay x mod y Quá trình lặp lại chừng y  Thuật toán ngừng y = giá trị x điểm này, số dư khác khơng cuối thủ tục, ước chung lớn a b 13 1.4.2 Biểu diễn số nguyên: Mệnh đề 3: Cho b số nguyên dương lớn Khi n số nguyên dương, biểu diễn cách dạng: n = akbk + a k-1b k-1 + + a 1b + a0 Ở k số tự nhiên, a0, a1, , a k số tự nhiên nhỏ b ak  Biểu diễn n cho Mệnh đề gọi khai triển n theo số b, ký hiệu (a ka k-1 a1a0)b Bây ta mô tả thuật toán xây dựng khai triển số b số nguyên n Trước hết ta chia n cho b để thương số dư, tức n = bq0 + a0,  a0 < b Số dư a0 chữ số đứng bên phải khai triển số b n Tiếp theo chia q0 cho b, ta được: q0 = bq1 + a1,  a < b Số dư a1 chữ số thứ hai tính từ bên phải khai triển số b n Tiếp tục trình này, cách liên tiếp chia thương cho b ta chữ số khai triển số b n số dư tương ứng Quá trình kết thúc ta nhận thương Thí dụ 7: Tìm khai triển số (12345)10 12345 = 8.1543 + 1543 = 8.192 + 192 = 8.24 + 24 = 8.3 + = 8.0 + Do đó, (12345)10 = (30071)8 Đoạn giả mã sau biểu diễn thuật tốn tìm khai triển số b số nguyên n procedure khai triển theo số b (n: positive integer) q := n k := while q  begin ak := q mod b q b q := [ ] k := k + end 1.4.3 Thuật toán cho phép tính số ngun: Các thuật tốn thực phép tính với số nguyên dùng khai triển nhị phân chúng quan trọng số học máy tính Ta mơ tả 14 thuật tốn cộng nhân hai số nguyên biểu diễn nhị phân Ta phân tích độ phức tạp tính tốn thuật tốn thơng qua số phép tốn bit thực dùng Giả sử khai triển nhị phân hai số nguyên dương a b là: a = (an-1a n-2 a1 a0)2 b = (bn-1 b n-2 b1 b0)2 cho a b có n bit (đặt bit đầu khai triển đó, cần) 1) Phép cộng: Xét toán cộng hai số nguyên viết dạng nhị phân Thủ tục thực phép cộng dựa phương pháp thông thường cộng cặp chữ số nhị phân với (có nhớ) để tính tổng hai số nguyên Để cộng a b, trước hết cộng hai bit phải chúng, tức là: a + b0 = c0.2 + s Ở s0 bit phải khai triển nhị phân a+b, c0 số nhớ, Sau ta cộng hai bit số nhớ a1 + b1 + c0 = c1.2 + s1 Ở s1 bit (tính từ bên phải) khai triển nhị phân a+b c1 số nhớ Tiếp tục trình cách cộng bit tương ứng hai khai triển nhị phân số nhớ để xác định bit tiếp sau tính từ bên phải khai triển nhị phân tổng a+b Ở giai đoạn cuối cùng, cộng an-1, b n-1 cn-2 để nhận cn-1.2+sn-1 Bit đứng đầu tổng sn=cn-1 Kết quả, thủ tục tạo khai triển nhị phân tổng, cụ thể a+b = (sn s n-1 s n-2 s1 s0)2 Thí dụ 8: Tìm tổng a = (11011)2 b = (10110)2 a0 + b0 = + = 0.2 + (c0 = 0, s0 = 1), a1 + b1 + c0 = + + = 1.2 + (c1 = 1, s1 = 0), a2 + b +c1 = + + = 1.2 + (c = 1, s2 = 0), a3 + b3 + c2 = + + = 1.2 + (c3 = 1, s3 = 0), a + b4 +c = + + = 1.2 + (s5 = c =1, s4 = 1) Do đó, a + b = (110001)2 Thuật tốn cộng mơ tả cách dùng đoạn giả mã sau procedure cộng (a,b: positive integers) c := for j := to n-1 begin a j  b j  c d :=     sj := aj + b j + c  2d c := d end sn := c {khai triển nhị phân tổng (sn sn-1 s1 s0) 2} 15 Tổng hai số nguyên tính cách cộng liên tiếp cặp bit cần phải cộng số nhớ Cộng cặp bit số nhớ địi ba phép cộng bit Như vậy, tổng số phép cộng bit sử dụng nhỏ ba lần số bit khai triển nhị phân Do đó, độ phức tạp thuật toán O(n) 2) Phép nhân: Xét toán nhân hai số nguyên viết dạng nhị phân Thuật tốn thơng thường tiến hành sau Dùng luật phân phối, ta có: n 1 ab = a  b j j = j 0 n 1  a (b j j ) j 0 Ta tính ab cách dùng phương trình Trước hết, ta thấy abj=a bj=1 abj=0 bj=0 Mỗi lần ta nhân số hạng với ta dịch khai triển nhị phân chỗ phía trái cách thêm số không vào cuối khai triển nhị phân Do đó, ta nhận (abj)2 j cách dịch khai triển nhị phân abj j chỗ phía trái, tức thêm j số khơng vào cuối khai triển nhị phân Cuối cùng, ta nhận tích ab cách cộng n số nguyên abj.2 j với j=0, 1, , n-1 Thí dụ 9: Tìm tích a = (110)2 b = (101)2 Ta có ab0.20 = (110)2.1.20 = (110)2, ab1.2 = (110)2.0.21 = (0000)2, ab2.22 = (110)2.1.22 = (11000)2 Để tìm tích, cộng (110)2, (0000)2 (11000)2 Từ ta có ab= (11110)2 Thủ tục mô tả đoạn giả mã sau: procedure nhân (a,b: positive integers) for j := to n-1 begin if bj = then c j := a dịch j chỗ else cj := end {c0, c1, , cn-1 tích riêng phần} p := for j := to n-1 p := p + cj {p giá trị tích ab} Thuật tốn tính tích hai số ngun a b cách cộng tích riêng phần c 0, c 1, c2, , c n-1 Khi b j=1, ta tính tích riêng phần cj cách dịch khai triển nhị phân a j bit Khi bj=0 khơng cần có dịch chuyển c j=0 Do đó, để tìm tất n số ngun abj.2j với j=0, 1, , n-1, đòi hỏi tối đa n (n  1) + + + + n1 = phép dịch chỗ Vì vậy, số dịch chuyển chỗ đòi hỏi O(n2) 16 Để cộng số nguyên abj từ j=0 đến n1, đòi hỏi phải cộng số nguyên n bit, số nguyên n+1 bit, số nguyên 2n bit Ta biết phép cộng địi hỏi O(n) phép cộng bit Do đó, độ phức tạp thuật tốn O(n2) 1.5 THUẬT TỐN ĐỆ QUY 1.5.1 Khái niệm đệ quy: Đơi quy việc giải toán với tập liệu đầu vào xác định việc giải tốn với giá trị đầu vào nhỏ Chẳng hạn, tốn tìm UCLN hai số a, b với a > b rút gọn tốn tìm ƯCLN hai số nhỏ hơn, a mod b b Khi việc rút gọn thực lời giải tốn ban đầu tìm dãy phép rút gọn trường hợp mà ta dễ dàng nhận lời giải toán Ta thấy thuật toán rút gọn liên tiếp tốn ban đầu tới tốn có liệu đầu vào nhỏ hơn, áp dụng lớp rộng toán Định nghĩa: Một thuật tốn gọi đệ quy giải toán cách rút gọn liên tiếp toán ban đầu tới tốn có liệu đầu vào nhỏ Thí dụ 10: Tìm thuật tốn đệ quy tính giá trị an với a số thực khác không n số nguyên không âm Ta xây dựng thuật toán đệ quy nhờ định nghĩa đệ quy an, an+1=a.an với n>0 n=0 a0=1 Vậy để tính a n ta quy trường hợp có số mũ n nhỏ hơn, n=0 procedure power (a: số thực khác không; n: số nguyên không âm) if n = then power(a,n) := else power(a,n) := a * power(a,n-1) Thí dụ 11: Tìm thuật tốn đệ quy tính UCLN hai số ngun a,b khơng âm a > b procedure UCLN (a,b: số nguyên không âm, a > b) if b = then UCLN (a,b) := a else UCLN (a,b) := UCLN (a mod b, b) Thí dụ 12: Hãy biểu diễn thuật tốn tìm kiếm tuyến tính thủ tục đệ quy Để tìm x dãy tìm kiếm a 1,a2, ,an bước thứ i thuật toán ta so sánh x với a i Nếu x i vị trí cần tìm, ngược lại việc tìm kiếm quy dãy có số phần tử hơn, cụ thể dãy a i+1, ,an Thuật toán tìm kiếm có dạng thủ tục đệ quy sau Cho search (i,j,x) thủ tục tìm số x dãy a i, ai+1, , aj Dữ liệu đầu vào ba (1,n,x) Thủ tục dừng số hạng dãy lại x dãy cịn lại có phần tử khác x Nếu x không số hạng cịn có số hạng khác lại áp dụng thủ tục này, dãy tìm kiếm phần tử nhận cách xóa phần tử dãy tìm kiếm bước vừa qua 17 procedure search (i,j,x) if a i = x then loacation := i else if i = j then loacation := else search (i+1,j,x) Thí dụ 13: Hãy xây dựng phiên đệ quy thuật tốn tìm kiếm nhị phân Giả sử ta muốn định vị x dãy a1, a 2, , a n tìm kiếm nhị phân Trước tiên ta so sánh x với số hạng a[(n+1)/2] Nếu chúng thuật tốn kết thúc, khơng ta chuyển sang tìm kiếm dãy ngắn hơn, nửa đầu dãy x nhỏ giá trị của dãy xuất phát, nửa sau ngược lại Như ta rút gọn việc giải tốn tìm kiếm việc giải tốn dãy tìm kiếm có độ dài giảm nửa procedure binary search (x,i,j) m := [(i+j)/2] if x = am then loacation := m else if (x < am and i < m) then binary search (x,i,m-1) else if (x > am and j > m) then binary search (x,m+1,j) else loacation := 1.5.2 Đệ quy lặp: Thí dụ 14 Thủ tục đệ quy sau cho ta giá trị n! với n số nguyên dương procedure factorial (n: positive integer) if n = then factorial(n) := else factorial(n) := n * factorial(n-1) Có cách khác tính hàm giai thừa số nguyên từ định nghĩa đệ quy Thay cho việc rút gọn việc tính tốn cho giá trị nhỏ hơn, ta xuất phát từ giá trị hàm 1và áp dụng định nghĩa đệ quy để tìm giá trị hàm số nguyên lớn dần Đó thủ tục lặp procedure iterative factorial (n: positive integer) x := for i := to n x := i * x {x n!} Thơng thường để tính dãy giá trị định nghĩa đệ quy, dùng phương pháp lặp số phép tính dùng thuật toán đệ quy (trừ dùng máy đệ quy chuyên dụng) Ta xem xét toán tính số hạng thứ n dãy Fibonacci procedure fibonacci (n: nguyên không âm) 18 if n = the fibonacci(n) := else if n = then fibonacci(n) := else fibonacci(n) := fibonacci(n - 1) + fibonacci(n - 2) Theo thuật tốn này, để tìm fn ta biểu diễn fn = fn-1 + fn-2 Sau thay hai số tổng hai số Fibonacci bậc thấp hơn, tiếp tục f0 f1 xuất thay giá trị chúng theo định nghĩa Do để tính fn cần fn+1-1 phép cộng Bây ta tính phép tốn cần dùng để tính fn sử dụng phương pháp lặp Thủ tục khởi tạo x f0 = y f1 = Khi vòng lặp duyệt qua tổng x y gán cho biến phụ z Sau x gán giá trị y y gán giá trị z Vậy sau qua vịng lặp lần 1, ta có x = f1 y = f0 + f1 = f2 Khi qua vịng lặp lần n-1 x = fn-1 Như có n – phép cộng dùng để tìm fn n > procedure Iterative fibonacci (n: nguyên không âm) if n = then y := else begin x := ; y := for i := to n - begin z := x + y x := y ; y := z end end {y số Fibonacci thứ n} Ta số phép toán dùng thuật toán đệ quy nhiều dùng phương pháp lặp Tuy nhiên đơi người ta thích dùng thủ tục đệ quy tỏ hiệu so với thủ tục lặp Đặc biệt, có tốn giải thủ tục đệ quy mà giải thủ tục lặp BÀI TẬP CHƯƠNG I: Tìm số nguyên n nhỏ cho f(x) O(x n) hàm f(x) sau: a) f(x) = 2x3 + x2log x b) f(x) = 2x3 + (log x)4 c) f(x) = x4  x2  x3  19 d) f(x) = x  log x x4  Chứng minh a) x2 + 4x + O(x 3), x3 không O(x2 +4x + 17) b) xlog x O(x2), x2 không O(xlog x) Cho đánh giá big-O hàm cho Đối với hàm g(x) đánh giá f(x) O(g(x)), chọn hàm đơn giản có bậc thấp a) nlog(n2 + 1) + n 2logn b) (nlogn + 1)2 + (logn + 1)(n2 + 1) n c) n  n n Cho Hn số điều hoà thứ n: Hn = + 1 + + + n Chứng minh Hn O(logn) Lập thuật toán tính tổng tất số nguyên bảng Lập thuật tốn tính xn với x số thực n số nguyên Mô tả thuật toán chèn số nguyên x vào vị trí thích hợp dãy số nguyên a1, a2, , an xếp theo thứ tự tăng dần Tìm thuật tốn xác định vị trí gặp phần tử lớn bảng liệt kê số ngun, số khơng thiết phải khác Tìm thuật tốn xác định vị trí gặp cuối phần tử nhỏ bảng liệt kê số nguyên, số không thiết phải khác 10 Mô tả thuật toán đếm số số xâu bit cách kiểm tra bit xâu để xác định có bit hay khơng 11 Thuật tốn tìm kiếm tam phân Xác định vị trí phần tử bảng liệt kê số nguyên theo thứ tự tăng dần cách tách liên tiếp bảng liệt kê thành ba bảng liệt kê có kích thước (hoặc gần được) giới hạn việc tìm kiếm bảng liệt kê thích hợp Hãy rõ bước thuật tốn 12 Lập thuật tốn tìm dãy số ngun số hạng số hạng đứng trước dãy 20 13 Lập thuật tốn tìm dãy số nguyên tất số hạng lớn tổng tất số hạng đứng trước dãy 14 Cho đánh giá big-O số phép so sánh dùng thuật toán Bài tập 10 15 Đánh giá độ phức tạp thuật tốn tìm kiếm tam phân cho Bài tập 11 16 Đánh giá độ phức tạp thuật tốn Bài tập 12 17 Mơ tả thuật tốn tính hiệu hai khai triển nhị phân 18 Lập thuật toán để xác định a > b, a = b hay a < b hai số nguyên a b dạng khai triển nhị phân 19 Đánh giá độ phức tạp thuật toán tìm khai triển theo số b số nguyên n qua số phép chia dùng 20 Hãy cho thuật tốn đệ quy tìm tổng n số ngun dương lẻ 21 Hãy cho thuật toán đệ quy tìm số cực đại tập hữu hạn số ngun 22 Mơ tả thuật tốn đệ quy tìm xn mod m với n, x, m số nguyên dương n 23 Hãy nghĩ thuật toán đệ quy tính a a số thực n số nguyên dương 24 Hãy nghĩ thuật tốn đệ quy tìm số hạng thứ n dãy xác định sau: a0=1, a = an = a n-1 an-2 với n = 2, 3, 4, 25 Thuật toán đệ quy hay thuật tốn lặp tìm số hạng thứ n dãy Bài tập 24 có hiệu hơn? 21 ... toán n logn N nlogn n2 2n 10 3 .1 0-9 s 1 0-8 s 3 .1 0-8 s 1 0-7 s 1 0-6 s 10 2 7 .1 0-9 s 1 0-7 s 7 .1 0-7 s 1 0-5 s 4 .10 13năm 10 3 1, 0 .1 0-8 s 1 0-6 s 1. 1 0-5 s 1 0-3 s * -8 -5 -4 -1 10 1, 3 .10 s 10 s 1. 10 s 10 ... j=0, 1, , n -1 Thí dụ 9: Tìm tích a = (11 0)2 b = (10 1)2 Ta có ab0.20 = (11 0)2 .1. 20 = (11 0)2, ab1.2 = (11 0)2.0. 21 = (0000)2, ab2.22 = (11 0)2 .1. 22 = (11 000)2 Để tìm tích, cộng (11 0)2, (0000)2 (11 000)2... 1, 3 .10 s 10 s 1. 10 s 10 s * -8 -4 -3 10 1, 7 .10 s 10 s 2 .10 s 10 s * -8 -3 -2 10 2 .10 s 10 s 2 .10 s 17 phút * n! 3 .1 0-3 s * * * * * 1. 4 SỐ NGUYÊN VÀ THUẬT TOÁN 1. 4 .1 Thuật tốn Euclide: Phương

Ngày đăng: 04/10/2012, 08:49

Từ khóa liên quan

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

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

Tài liệu liên quan