Sơ đồ chung của thuật toán chia để trị

Một phần của tài liệu [Giáo trình] Phân tích thiết kế thuật toán và đánh giá độ phức tạp của giải thuật - ĐH Sư phạm Hà Nội (Trang 33 - 35)

1.1. Thuật toán β

Ta xét bài toán tổng quát P với kích thước dữ liệu vào là n.

Giả sử có thuật toán α để giải bài toán P với thời gian bị chặn bởi c.n2.

Xét một thuật toán β khác giải chính bài toán P đã cho theo ba bước sau: - Chia: Chia bài toán thành 3 bài toán con kích thước n/2

- Trị: giải 3 bài toán con theo thuật toán α - Tổng hợp lời giải các bài toán con

Giả sử thời gian chia và tổng hợp các bài toán con là tuyến tính, tức là có độ phức tạp đa thức O(n) hay d.n.

Khi đó:

Tα = cn2 = (3/4)cn2 + (1/4)cn2 Æ T(n) = O(n2) Tβ = 3Tα + dn = 3c(n/2)2 + dn = (3/4)cn2 + dn Æ T(n) = O(n2) (Tức là Tβbằng tổng của thời gian trị (3/4)cn2 + thời gian tổng hợp dn).

Từ đó, nếu dn < (1/4)cn2Ù d < cn2/4 Ù n > 4d/c thì thuật toán β nhanh hơn thuật toán α. Điều này luôn đúng với n đủ lớn. Tuy nhiên ta thấy thuật toán β mới chỉ thay đổi được nhân tử hằng số chưa thay đổi được bậc nhưng cũng hiệu quả khi n lớn. Nói cách khác, độ phức tạp thuật toán không thay đổi, nhưng thời gian thực hiện thuật toán được cải thiện.

Thủ tục Beta dưới đây thể hiện thuật toán β

procedure Beta(n) (* n là kích thước bài toán *) begin

i. Chia bài toán thành ba bài toán con kích thước n/2; ii. Giải mỗi bài toán con bằng thuật toán α;

end;

Việc chia để trị rõ ràng có xu hướng làm giảm thời gian tính toán. Vì thế các bài toán con nên tiếp tục được chia nhỏ như thế khi còn có lợi, tức là khi còn thỏa mãn điều kiện n > 4dc. Nói cách khác, các bài toán con sẽ tiếp tục được chia nhỏ cho đến khi việc chia đó không làm giảm thời gian tính (tức là khi n ≤ 4dc) thì dừng lại. Điều này được thể hiện trong thuật toán γ dưới đây.

1.2. Thuật toán γ

Thủ tục Gamma dưới đây thể hiện thuật toán γ

procedure Gamma(n) (* n là kích thước bài toán; đặt n0 = 4d/c *) begin

if n ≤ n0 then {việc chia không còn lợi nữa thì giải trực tiếp} Giải bài toán một cách trực tiếp, bằng thuật toán α

else begin

i. Chia bài toán thành ba bài toán con kích thước n/2; ii. Giải mỗi bài toán con bằng thuật toán γ;

iii. Tổng hợp lời giải của các bài toán con; end;

end;

Nhận xét:

- Nếu bài toán P giải bởi thuật toán α thì không có chia để trị.

- Nếu bài toán P giải bằng thuật toán β thì được việc chia để trị được thực hiện một lần, trong đó có 3 bài toán con được chia, và được giải bằng thuật toán α.

- Nếu bài toán P được giải bằng thuật toán γ (thay vì thuật toán β) thì quá trình chia để trị được thực hiện nhiều lần nếu thời gian tính vẫn tốt hơn, mỗi bài toán con sử dụng chính thuật toán γ của bài toán mẹ, tức là thực hiện bởi một lời giải đệ qui.

Ta có phương trình đệ qui sau:

⎪ ⎩ ⎪ ⎨ ⎧ > + ≤ = c d n if dn n T c d n if cn n T 4 ) 2 ( 3 4 ) ( 2 γ γ

Phương trình đệ qui có dạng Tγ(n) = a.Tγ(n/b) + c.nk thỏa mãn điều kiện của định lí thợ với a = 3, b = 2, c = d và k = 1. Mặt khác, vì 3 = a > bk = 2 nên định lí thợ rơi vào trường hợp thứ nhất, do đó T(n) =θ(nlogba) Ù T(n) =θ(nlog23) ≈θ(n1.589...).

Thuật toán γ thu được có thời gian tính là tốt hơn cả thuật toán α và thuật toán β. Hiệu quả thu được trong thuật toán γ có được là nhờ ta đã khai thác triệt để hiệu quả của việc sử dụng thuật toán β.

1.3. Thuật toán γ tổng quát (adsbygoogle = window.adsbygoogle || []).push({});

Để có được một mô tả chi tiết thuật toán chia để trị chúng ta cần phải xác định 4 tham số: 1. n0: giá trị neo, là điểm kết thúc quá trình chia bài toán con

2. k: kích thước của mỗi bài toán con trong cách chia.

3. r: số lượng các bài toán con được chia tại mỗi lần thực hiện. 4. Thuật toán tổng hợp lời giải của các bài toán con.

Chia như thế nào (xác định r và k) là căn cứ vào mục đích thời gian thực hiện thuật toán tổng hợp là nhỏ (thường là tuyến tính).

Ta có thủ tục DivideAndConquer thể hiện thuật toán γ tổng quát như sau:

procedure DivideAndConquer(n) (* n là kích thước bài toán; đặt n0 = 4d/c *) begin

if n <= n0 then

Giải bài toán một cách trực tiếp, bằng thuật toán α

else begin

i. Chia bài toán thành r bài toán con kích thước n/k; ii. for (r bài toán con) do DivideAndConquer(n/k); iii. Tổng hợp lời giải của các bài toán con;

end; end;

Một phần của tài liệu [Giáo trình] Phân tích thiết kế thuật toán và đánh giá độ phức tạp của giải thuật - ĐH Sư phạm Hà Nội (Trang 33 - 35)