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

Tài liệu môn học - Application of Algo. chapter04 DC

46 130 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

Cấu trúc

  • Kin thc nn tang

  • Sp xp trn

  • Tìm kim nhi phân

  • Tìm kim nhi phân trên giá tri

    • trên s nguyên

    • trên s thc

    • trên câu tra li

  • Nhng dang khác cua Chia tri

    • Luy tha nhi phân

    • T Fibonnaci

Nội dung

Tài liệu môn học - Application of Algo. chapter04 DC tài liệu, giáo án, bài giảng , luận văn, luận án, đồ án, bài tập lớ...

Chia để trị Khoa Công Nghệ Thông Tin, Trường Đại Học Thủy Lợi Ngày 30 tháng năm 2017 / 38 Kiến thức tảng Sắp xếp trộn Tìm kiếm nhị phân Tìm kiếm nhị phân giá trị số nguyên số thực câu trả lời Những dạng khác Chia để trị Lũy thừa nhị phân Từ Fibonnaci / 38 Chia để trị Chia để trị mô hình giải tốn tốn tạo đơn giản cách ‘chia nhỏ’ tốn thành phần nhỏ sau giải phần Thơng thường gồm bước: CHIA: Phân chia toán thành nhiều toán nhỏ - thường nửa gần nửa CHINH PHỤC (TRỊ): Giải toán nhận đệ quy, toán dễ dàng KẾT HỢP: Kết hợp lời giải từ toán nhỏ thành lời giải toán cho / 38 Các thuật toán chia để trị chuẩn Sắp xếp nhanh (Quicksort) Sắp xếp trộn (Mergesort) Thuật toán Karatsuba Thuật tốn Strassen Nhiều thuật tốn cho hình học tính tốn Bao lồi (Convex hull) Cặp điểm gần / 38 Ứng dụng Chia để trị Giải tốn khó : phân nhỏ tốn thành tốn con, giải trường hợp bình thường kết hợp toán thành tốn ban đầu Tính tốn song song : thích ứng cách tự nhiên với việc chạy máy tính đa nhân, đặc biệt hệ thống chia sẻ nhớ nơi mà truyền thông liệu xử lý không cần lên kế hoạch trước, tốn riêng biệt thực thi xử lý khác Truy cập nhớ : cách tự nhiên hướng tới cách sử dụng hiệu nhớ cache Khi tốn đủ nhỏ, tất tốn nó, ngun tắc, giải bên nhớ cache mà khơng cần truy cập đến nhớ chậm Kiểm sốt việc làm tròn (Roundoff): tạo nhiều kết xác phương pháp lặp với phép tốn làm tròn Ví dụ, người cộng N số cách sử dụng vòng lặp đơn giản để cộng dồn mốc liệu vào biến đơn, cách sử dụng thuật toán Chia để trị (D&C) gọi phép cộng theo cặp mà chia nhỏ tập liệu thành hai nửa, tính tốn cách đệ quy tổng nửa, sau cộng hai tổng Trong phương pháp thứ hai thực thi số lượng phép cộng / 38 Phân tích Thuật tốn chia để trị Được miêu tả phương trình đệ quy Giả sử T (n) thời gian chạy tốn kích thước n T (n) = Θ(1) aT (n/b) + D(n) + C (n) if n ≤ nc if n ≥ nc , where a: số lượng tốn n/b: kích thước tốn D(n): chi phí thao tác chia nhỏ C (n): chi phí thao tác kết hợp / 38 Độ phức tạp thời gian void solve ( int n ) { if ( n == 0) return ; solve ( n /2); solve ( n /2); for ( int i = 0; i < n ; i ++) { // some constant time operations } 10 11 } Độ phức tạp thời gian thuật toán chia để trị gì? Thường giúp mơ hình hóa độ phức tạp thời gian mối quan hệ đệ quy T (n) = 2T (n/2) + n / 38 Độ phức tạp thời gian Nhưng giải đệ quy vậy? Thông thường đơn giản sử dụng định lý Master áp dụng Nó đưa lời giải cho đệ quy dạng T (n) = aT (n/b) + f (n) theo thuật ngữ tiệm cận Tất thuật toán chia để trị đề cập có dạng đệ quy Định lý Master nói T (n) = 2T (n/2) + n có độ phức tạp thời gian tiệm cận O(n log n) Phương pháp đệ quy hữu ích để giải dạng đệ quy / 38 Giảm để trị Đôi chúng không thực chia nhỏ toán thành nhiều toán con, mà toán nhỏ Thường gọi Giảm để trị (decrease and conquer) Một ví dụ phổ biến phương pháp tìm kiếm nhị phân / 38 Kiến thức tảng Sắp xếp trộn Tìm kiếm nhị phân Tìm kiếm nhị phân giá trị số nguyên số thực câu trả lời Những dạng khác Chia để trị Lũy thừa nhị phân Từ Fibonnaci 10 / 38 Lũy thừa nhị phân Hãy thử sử dụng đặc điểm để tính câu trả lời cách đệ quy int pow ( int x , int n ) { if ( n == 0) return 1; return x * pow (x , n - 1); } Điều hiệu nào? T (n) = + T (n − 1) 31 / 38 Lũy thừa nhị phân Hãy thử sử dụng đặc điểm để tính câu trả lời cách đệ quy int pow ( int x , int n ) { if ( n == 0) return 1; return x * pow (x , n - 1); } Điều hiệu nào? T (n) = + T (n − 1) O(n) 31 / 38 Lũy thừa nhị phân Hãy thử sử dụng đặc điểm để tính câu trả lời cách đệ quy int pow ( int x , int n ) { if ( n == 0) return 1; return x * pow (x , n - 1); } Điều hiệu nào? T (n) = + T (n − 1) O(n) Vẫn chậm 31 / 38 Lũy thừa nhị phân Đặc điểm thứ điều gì? n/2 khơng phải số nguyên n số lẻ, sử dụng n số chẵn int pow ( int x , int n ) { if ( n == 0) return 1; if ( n % != 0) return x * pow (x , n - 1); int st = pow (x , n /2); return st * st ; } Điều hiệu nào? 32 / 38 Lũy thừa nhị phân Đặc điểm thứ điều gì? n/2 khơng phải số ngun n số lẻ, sử dụng n số chẵn int pow ( int x , int n ) { if ( n == 0) return 1; if ( n % != 0) return x * pow (x , n - 1); int st = pow (x , n /2); return st * st ; } Điều hiệu nào? T (n) = + T (n − 1) n số lẻ T (n) = + T (n/2) n số chẵn 32 / 38 Lũy thừa nhị phân Đặc điểm thứ điều gì? n/2 khơng phải số nguyên n số lẻ, sử dụng n số chẵn int pow ( int x , int n ) { if ( n == 0) return 1; if ( n % != 0) return x * pow (x , n - 1); int st = pow (x , n /2); return st * st ; } Điều hiệu nào? T (n) = + T (n − 1) n số lẻ T (n) = + T (n/2) n số chẵn Do n − số chẵn n số lẻ: T (n) = + + T ((n − 1)/2) n số lẻ 32 / 38 Lũy thừa nhị phân Đặc điểm thứ điều gì? n/2 khơng phải số nguyên n số lẻ, sử dụng n số chẵn int pow ( int x , int n ) { if ( n == 0) return 1; if ( n % != 0) return x * pow (x , n - 1); int st = pow (x , n /2); return st * st ; } Điều hiệu nào? T (n) = + T (n − 1) n số lẻ T (n) = + T (n/2) n số chẵn Do n − số chẵn n số lẻ: T (n) = + + T ((n − 1)/2) n số lẻ O(log n) Nhanh! 32 / 38 Lũy thừa nhị phân Chú ý x không bắt buộc phải số nguyên, phải phép nhân số nguyên Nó hoạt động với: khơng bắt buộc Tính x n , x số thực, phép nhân số thực Tính An , A ma trận, phép nhân ma trận Tính x n (mod m), x ma trận, phép nhân số nguyên đồng dư m Tính x x · · · x, x phần tử bất kỳ, toán tử kết hợp Tất điều thực thời gian O(log(n) × f ), với f chi phí để việc thực ứng dụng toán tử 33 / 38 Từ Fibonnaci Nhớ lại dãy Fibonnaci định nghĩa sau: fib1 = fib2 = fibn = fibn−2 + fibn−1 Chúng ta có dãy 1, 1, 2, 3, 5, 8, 13, 21, Có nhiều tổng quát hóa dãy Fibonnaci Một số chúng bắt đầu với số khác, chẳng hạn: f1 = f2 = fn = fn−2 + fn−1 Chúng ta có dãy 5, 4, 9, 13, 22, 35, 57, Điều xảy bắt đầu với thứ khác số? 34 / 38 Từ Fibonnaci Hãy thử bắt đầu với cặp xâu ký tự, gọi + biểu thị phép nối xâu g1 = A g2 = B gn = gn−2 + gn−1 Bây có trình tự xâu ký tự sau: A B AB BAB ABBAB BABABBAB ABBABBABABBAB BABABBABABBABBABABBAB 35 / 38 Từ Fibonnaci Độ dài gn bao nhiêu? len(g1 ) = len(g2 ) = len(gn ) = len(gn−2 ) + len(gn−1 ) Bạn có nhìn quen? len(gn ) = fibn Vì xâu ký tự nhanh chóng trở nên lớn len(g10 ) = 55 len(g100 ) = 354224848179261915075 len(g1000 ) = 434665576869374564356885276750406258025646605173717 804024817290895365554179490518904038798400792551692 959225930803226347752096896232398733224711616429964 409065331879382989696499285160037044761377951668492 28875 36 / 38 Từ Fibonnaci Nhiệm vụ: Tính ký tự thứ i gn 37 / 38 Từ Fibonnaci Nhiệm vụ: Tính ký tự thứ i gn Đơn giản để thực thời gian O(len(n)), điều trở nên cực chậm với n lớn 37 / 38 Từ Fibonnaci Nhiệm vụ: Tính ký tự thứ i gn Đơn giản để thực thời gian O(len(n)), điều trở nên cực chậm với n lớn Có thể thực thời gian O(n) cách sử dụng chia để trị 37 / 38 Bài tập thực hành Từ Fibonnaci 38 / 38 ... tìm kiếm nhị phân mảng 22 / 38 Tìm kiếm nhị phân số thực double EPS = 1e -1 0 , lo = -1 000.0 , hi = 1000.0; while ( hi - lo > EPS ) { double mid = ( lo + hi ) / 2.0; if ( p ( mid )) { hi = mid... binary_search ( arr , lo , m - , x ); } else if ( x > arr [ m ]) { return binary_search ( arr , m + , hi , x ); } 10 11 12 13 14 } 15 16 binary_search ( arr , , arr size () - , x ); T (n) = T (n/2)... (n/2) + O(log n) 16 / 38 Tìm kiếm nhị phân - Sử dụng vòng lặp bool binary_search ( const vector < int > & arr , int x ) { int lo = , hi = arr size () - 1; while ( lo

Ngày đăng: 21/12/2017, 11:06