Kiến thức chuyên ngành luôn yêu cầu bạn phải cập nhật và trau dồi từng ngày.Để có nền tảng kiến thức vững chắc trước các kì thi…bạn không thể thiếu các tài liệu tham khảo hay được chia sẻ trên mạng Internet.Share to be share more
lazycatnct@gmail.com www.free4vn.org 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 toán tổng quát 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 toán việc phải làm xây dựng mô hình dịch toá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 toán học thích hợp phần trình giải Để hoàn tất trình giải, cần phải có phương pháp dùng mô hình để giải toán tổng quát 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 toán giải vấn đề Rõ ràng rằng, không tìm phương pháp giải lập trình Chính thế, thuật toá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 toán cho ý nghĩa chung hơn, bao hàm thủ tục xác định để giải toán, thủ tục để thực phép tính số học Có nhiều cách trình bày thuật toá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 toá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 toán việc trình bày ngôn ngữ tự nhiên với ký hiệu toán học quen thuộc dùng dạng giả mã để mô tả thuật upsoft.blogspot.com Trang lazycatnct@gmail.com www.free4vn.org toán Giả mã tạo bước trung gian mô tả thuật toán ngôn ngữ thông thường thực thuật toán ngôn ngữ lập trình Các bước thuật toán rõ cách dùng lệnh giống ngôn ngữ lập trình Thí dụ 1: Mô tả thuật toá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ố nguyên Lặp lại bước trước số nguyên dãy Dừng không 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)) 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 toá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) ≤ n2 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+a0 f(n)=O(nk) Thật vậy, với n>1, |f(n)|| ≤ |ak|nk+|ak-1|nk-1+ +|a1|n+|a0| = nk(|ak|+|ak-1|/n+ +|a1|/nk-1+a0/nk) ≤ nk(|ak|+|ak-1|+ +|a1|+a0) Điều chứng tỏ |f(n)| ≤ Cnk 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)|,|g2(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 > n1 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 > n0=max(n1,n2), đâyC=C1+C2 g(n)=max(|g1(n)| , |g2(n)|) |(f1f2)(n)| = |f1(n)||f2(n)| ≤ C1|g1(n)|C2|g2(n)| ≤ C1C2|(g1g2)(n)| với n > n0=max(n1,n2) upsoft.blogspot.com Trang 10 lazycatnct@gmail.com www.free4vn.org Định nghĩa 2: Nếu thuật toán có độ phức tạp f(n) với f(n)=O(g(n)) ta nói thuật toán có độ phức tạp O(g(n)) Nếu có hai thuật toán giải toán, thuật toán có độ phức tạp O(g1(n)), thuật toán có độ phức tạp O(g2(n)), mà g1(n) có cấp thấp g2(n), ta nói thuật toá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 toá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 toá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 vòng lặp Do đó, x=a i, 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 mặt bảng Từ đó, thuật toán tìm kiếm tuyến tính có độ phức tạp O(n) 2) Thuật toán tìm kiếm nhị phân: Để đơn giản, ta giả sử có n=2 k phần tử bảng liệt kê a 1,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 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 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 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 toán tìm kiếm nhị phân có độ phức tạp O(log 2n) Từ phân tích suy thuật toán tìm kiếm nhị phân, trường hợp xấu nhất, hiệu thuật toá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 toán Thí dụ, thuật toán đòi hỏi 10 giờ, đáng chi phí thời gian máy tính đòi hỏi để giải toán Nhưng thuật toán đòi hỏi 10 tỉ năm để giải toán, thực thuật toá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 upsoft.blogspot.com Trang 11 lazycatnct@gmail.com www.free4vn.org 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 toá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 toá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 * 104 1,3.10-8 s 10-5 s 1.10-4 s 10-1 s * -8 -4 -3 10 1,7.10 s 10 s 2.10 s 10 s * 106 2.10-8 s 10-3 s 2.10-2 s 17 phút * n! 3.10-3 s * * * * * 1.4 SỐ NGUYÊN VÀ THUẬT TOÁN 1.4.1 Thuật toán Euclide: Phương pháp tính ước chung lớn hai số cách dùng phân tích số nguyên thừa số nguyên 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à toá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 toá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ư upsoft.blogspot.com Trang 12 lazycatnct@gmail.com www.free4vn.org 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: r0 = r1q1 + r2 ≤ r2 < r1 r1 = r2q2 + r3 ≤ r3 < r2 rn-2 = rn-1qn-1 + rn ≤ rn < rn-1 rn-1 = rnqn 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 toá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 toá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 upsoft.blogspot.com Trang 13 lazycatnct@gmail.com www.free4vn.org 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 + ak-1bk-1 + + a1b + a0 Ở k số tự nhiên, a0, a1, , ak 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 (akak-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, ≤ a1 < 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 toá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ố nguyên: Các thuật toá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ả upsoft.blogspot.com Trang 14 lazycatnct@gmail.com www.free4vn.org thuật toá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 toán thuật toán thông qua số phép toá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-1an-2 a1 a0)2 b = (bn-1 bn-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à: a0 + b0 = c0.2 + s0 Ở s0 bit phải khai triển nhị phân a+b, c 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 c 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 a n-1, bn-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 sn-1 sn-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 + (c = 1, s1 = 0), a2 + b2 +c1 = + + = 1.2 + (c = 1, s2 = 0), a3 + b3 + c2 = + + = 1.2 + (c3 = 1, s3 = 0), a4 + b4 +c3 = + + = 1.2 + (s5 = c4 =1, s4 = 1) Do đó, a + b = (110001)2 Thuật toá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 + bj + c − 2d c := d end sn := c {khai triển nhị phân tổng (sn sn-1 s1 s0) 2} upsoft.blogspot.com Trang 15 lazycatnct@gmail.com www.free4vn.org 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 toá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 =0 j 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 ab j=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 (ab j)2j cách dịch khai triển nhị phân ab j 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.2j 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.21 = (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 cj := 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 toán tính tích hai số nguyên a b cách cộng tích riêng phần c0, c1, c2, , cn-1 Khi bj=1, ta tính tích riêng phần c j 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ố nguyên 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) upsoft.blogspot.com Trang 16 lazycatnct@gmail.com www.free4vn.org Để 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 toán O(n2) 1.5 THUẬT TOÁ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 toán với giá trị đầu vào nhỏ Chẳng hạn, toán tìm UCLN hai số a, b với a > b rút gọn toá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 toá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 toán ban đầu tới toá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 toán gọi đệ quy giải toán cách rút gọn liên tiếp toán ban đầu tới toán có liệu đầu vào nhỏ Thí dụ 10: Tìm thuật toán đệ quy tính giá trị a n 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 a n, an+1=a.an với n>0 n=0 a0=1 Vậy để tính an 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 toán đệ quy tính UCLN hai số nguyên 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 toán tìm kiếm tuyến tính thủ tục đệ quy Để tìm x dãy tìm kiếm a1,a2, ,an bước thứ i thuật toán ta so sánh x vớ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 ai, 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 lại có phần tử khác x Nếu x không số hạng 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 upsoft.blogspot.com Trang 17 lazycatnct@gmail.com www.free4vn.org procedure search (i,j,x) if = 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 toán tìm kiếm nhị phân Giả sử ta muốn định vị x dãy a 1, a2, , an 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 toá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 toán tìm kiếm việc giải toá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 toá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) upsoft.blogspot.com Trang 18 lazycatnct@gmail.com www.free4vn.org if n = the fibonacci(n) := else if n = then fibonacci(n) := else fibonacci(n) := fibonacci(n - 1) + fibonacci(n - 2) Theo thuật toá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 f f1 xuất thay giá trị chúng theo định nghĩa Do để tính f n cần fn+1-1 phép cộng Bây ta tính phép toá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 = f 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 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ó toá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(xn) hàm f(x) sau: a) f(x) = 2x3 + x2log x b) f(x) = 2x3 + (log x)4 x4 + x2 +1 c) f(x) = x3 + upsoft.blogspot.com Trang 19 lazycatnct@gmail.com d) f(x) = x + log x x4 +1 www.free4vn.org Chứng minh a) x2 + 4x + O(x3), 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) + n2logn 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 toá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 toán xác định vị trí gặp phần tử lớn bảng liệt kê số nguyên, số không thiết phải khác Tìm thuật toá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 toá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 toán 12 Lập thuật toán tìm dãy số nguyên số hạng số hạng đứng trước dãy upsoft.blogspot.com Trang 20 lazycatnct@gmail.com www.free4vn.org 13 Lập thuật toá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 toán tìm kiếm tam phân cho Bài tập 11 16 Đánh giá độ phức tạp thuật toán Bài tập 12 17 Mô tả thuật toá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 toán đệ quy tìm tổng n số nguyên 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ố nguyên 22 Mô tả thuật toá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 toán đệ quy tìm số hạng thứ n dãy xác định sau: a0=1, a1 = an = an-1 an-2 với n = 2, 3, 4, 25 Thuật toán đệ quy hay thuật toán lặp tìm số hạng thứ n dãy Bài tập 24 có hiệu hơn? upsoft.blogspot.com Trang 21 ... s 10 2 7 .10 -9 s 10 -7 s 7 .10 -7 s 10 -5 s 4 .10 13năm 10 3 1, 0 .10 -8 s 10 -6 s 1. 10-5 s 10 -3 s * 10 4 1, 3 .10 -8 s 10 -5 s 1. 10-4 s 10 -1 s * -8 -4 -3 10 1, 7 .10 s 10 s 2 .10 s 10 s * 10 6 2 .10 -8 s 10 -3 s 2 .10 -2... 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. 21 = (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... s0 = 1) , a1 + b1 + c0 = + + = 1. 2 + (c = 1, s1 = 0), a2 + b2 +c1 = + + = 1. 2 + (c = 1, s2 = 0), a3 + b3 + c2 = + + = 1. 2 + (c3 = 1, s3 = 0), a4 + b4 +c3 = + + = 1. 2 + (s5 = c4 =1, s4 = 1) Do