- vừa được xem lúc

Chương 1: Introduction - 7.Các định lý chính về giải thuật Subtract and Conquer Recurrences

0 0 11

Người đăng: Đặng An

Theo Viblo Asia

Divide and Conquer algorithm tiếng việt là Chia để trị thì có lẽ Subtract and Conquer algorithm là Trừ để trị 😅
Cái này mình không chắc có dịch ra đúng nghĩa không, nếu có sai sót các bạn comment nhé, mình sẽ sửa lại 😁

1.24 Master Theorem for Subtract and Conquer Recurrences

Vì trong sách tác giả viết về phần này khá ngắn gọn, mình có tham khảo thêm thông tin ở đây

Các định lý này được sử dụng để xác định độ phức tạp Big-O trên các hàm đệ quy ~ nghĩa là có thể chia nhỏ thành các bài toán con:

Với các hằng số c, a > 0, b > 0, k ≥ 0 và hàm f(n). Nếu f(n) có độ phức tạp O(nk)O ( n ^ { k } ) thì

Chứng minh định lý:
Từ công thức ban đầu ta có:

  1. T(n) = aT(n-b) + f(n)
  2. T(n-b) = aT(n-2b) + f(n-b)
  3. T(n-2b) = aT(n-3b) + f(n-2b)

=> T(nb)=a2T(n3b)+af(n2b)+f(nb)T \left ( n - b \right ) = a ^ { 2 } T \left ( n - 3 b \right ) + a f \left ( n - 2 b \right ) + f \left ( n - b \right ) (Thay 3 vào 2)
=> T(n)=a3T(n3b)+a2f(n2b)+af(nb)+f(n)T \left ( n \right ) = a ^ { 3 } T \left ( n - 3 b \right ) + a ^ { 2 } f \left ( n - 2 b \right ) + a f \left ( n -b \right ) + f \left ( n \right ) (Thay công thức trên vào 1)
=> T(n) = Σi=0 to n/b \Sigma ^ { i = 0 \text { to n/b } } aif(nib)a ^ { i } f ( n - i b ) + constant, trong đó f(nib)f ( n - i b ) có độ phức tạp O(nib)O ( n - i b )
=> T(n)=O(nkΣi=0 to n /bai)T \left ( n \right ) = O \left ( n ^ { k } \Sigma ^ { i = 0 \text { to n } / b } a ^ { i } \right )

=> Từ công thức này, ta có kết luận như ảnh 2
Các bạn có thể tham khảo chứng minh ở link sau

1.25 Variant of Subtraction and Conquer Master Theorem

Giải pháp cho phương trình T(n)=T(α n)+T((1α)n)+βnT ( n ) = T ( \alpha ~ n ) + T ( ( 1 - \alpha ) n ) + \beta n, với 0 < α < 1 và β > 0 là các hằng số constant
O(nlogn)

Bài toán ví dụ

Một bài toán tiêu biểu cho giải thuật này là tìm số fibonacci.
Quy luật của dãy số Fibonacci: số tiếp theo bằng tổng của 2 số trước, 2 số đầu tiên của dãy số là 0, 1. Ví dụ: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...

class Fibonacci { static int findFibonacci(int n) { if (n <= 1) return n; return findFibonacci(n - 1) + findFibonacci(n - 2); } public static void main(String[] args) { int n = 9; System.out.println(findFibonacci(n)); }
}

Phân tích Time complexity
Hàm đệ quy trên có thể được định nghĩa là T(n) = T(n-1) + T(n-2)
Trong trường hợp Worst Case, giả sử T(n-1) ≈ T(n-2)
=> T(n) = 2T(n-1) + c
Với f(n) = O(1) (hằng số c), k = 0, a = 2, b = 1
Áp dụng lý thuyết trên ta có:
T(n)=O(n02n/1)| T \left ( n \right ) = O \left ( n ^ { 0 } 2 ^ { n / 1 } \right ) =O(2n)= O \left ( 2 ^ { n } \right )


Tạm kết lý thuyết về Subtract and Conquer, bài sau mình sẽ trình bày về Phương pháp phỏng đoán và xác nhận(Guessing and Confirming).
Bài viết có đôi chút khó về toán, cảm ơn mọi người đã đọc tới đây 😁

Bình luận

Bài viết tương tự

- vừa được xem lúc

Đôi chút về cấu trúc dữ liệu và thuật toán

Theo anh Phạm Huy Hoàng (toidicodedao) đã viết trong blog của mình là kiến thức trong ngành IT có 2 loại, một là càng để lâu thì càng cũ, lạc hậu và trở lên vô dụng. Hai là càng để lâu thì càng có giá trị thậm chí ngày càng có giá.

0 0 32

- vừa được xem lúc

Cấu trúc dữ liệu Merkle Tree

Cây Merkle là một cây nhị phân có thứ tự được xây dựng từ một dãy các đối tượng dữ liệu (d1, d2,...,dn) sử dụng hàm băm h. Các “lá” của cây là các giá trị băm h(di) đối với 1 ≤ i ≤ n.

0 0 46

- vừa được xem lúc

Cách xây dựng cấu trúc dữ liệu Stack và Queue.

Mở đầu. Hello các bạn, hôm nay mình sẽ chia sẻ với các bạn cách để có thể tự xây dựng 2 loại cấu trúc dữ liệu stack(ngăn xếp) và queue(hàng đợi) sử dụng mảng trong C++;.

0 0 31

- vừa được xem lúc

Tối ưu ứng dụng với cấu trúc dữ liệu cơ bản

Ở Việt Nam có một nghịch lý ai cũng biết: hầu hết sinh viên ngành CNTT đều đã học cấu trúc dữ liệu và giải thuật, thuộc các môn bắt buộc. Thế nhưng lại rất hiếm khi ứng dụng vào công việc hoặc bị loại

0 0 36

- vừa được xem lúc

Chương 1: Introduction - Analysis of Algorithrms

Trong bài viết này mình sẽ nói về cách chúng ta sẽ sử dụng để phân tích và so sánh các loại thuật toán khác nhau. 1.

0 0 15

- vừa được xem lúc

Chương 1: Introduction - Các khái niệm cơ bản

Lời nói đầu. Trước khi có máy tính, đã có các thuật toán.

0 0 16