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

Chương 1: Introduction - 8.Phương pháp phỏng đoán và xác nhận

0 0 14

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

Theo Viblo Asia

1.26 Method of Guessing and Confirming

Ở bài viết này, mình sẽ trình bày phương pháp có thể được sử dụng để giải quyết bất kỳ sự lặp lại nào.
Ý tưởng cơ bản của phương pháp này là :

Đoán đáp án, sau đó chứng minh bằng quy nạp.

Nói cách khác, nó giải quyết câu hỏi:
Điều gì sẽ xảy ra nếu sự lặp lại đã cho dường như không khớp với bất kỳ phương pháp nào trong số master theorem ( định lý chính) mà mình đã trình bày trong các bài trước?
Nếu chúng ta đoán một giải pháp và sau đó cố gắng xác minh theo suy đoán của mình, thường là việc chứng minh sẽ thành công (trong trường hợp này chúng ta đã hoàn thành), hoặc thất bại (trong trường hợp này, thất bại sẽ giúp chúng ta tinh chỉnh lại suy đoán của mình).

Ví dụ: ta hãy xem xét hàm đệ quy sau: T(n)=nT(n)+nT ( n ) = \sqrt { n } T ( \sqrt { n } ) + n. Cấu trúc này không phù hợp với bất kỳ form nào trong các Master Theorem. Quan sát kĩ hàm đệ quy cho chúng ta ấn tượng rằng nó tương tự như phương pháp chia để trị (chia bài toán thành n\sqrt { n } các bài toán con với kích thước mỗi bài toán n\sqrt { n }).
Như chúng ta thấy, kích thước của các bài toán con ở mức đệ quy đầu tiên là n.
Vì vậy, chúng ta hãy đoán rằng T(n)=O(nlogn)T ( n ) = O ( n l o g n ), và sau đó cố gắng chứng minh rằng suy đoán của chúng ta là đúng.

Hãy bắt đầu bằng cách cố gắng chứng minh một giới hạn trên upper bound T(n)cnlognT ( n ) \leq c n l o g n:
T(n)=nT(n)+nT ( n ) = \sqrt { n } T ( \sqrt { n } ) + n
ncnVogn+n\quad \quad \leq \quad \sqrt { n } \cdot c \sqrt { n } V o g \sqrt { n } + n
=n.clogn+n\quad \quad = n . c l o g \sqrt { n } + n
=n.c.12.logn+n\quad \quad = n . c . \frac { 1 } { 2 } . l o g n + n c.n.logn\quad \quad \leq c . n . l o g n (*)

Từ (*) => 1c.n.logn1 \leq c . n . l o g n. Điều này đúng nếu n đủ lớn và với bất kỳ hằng số c nào, dù nhỏ đến đâu.
Từ chứng minh trên, chúng ta có thể thấy rằng suy đoán của chúng ta là đúng đối với giới hạn trên.

Chúng ta tiếp tục chứng minh giới hạn dưới lower bound cho hàm đệ quy này.
T(n)=nT(n)+nT ( n ) = \sqrt { n } T ( \sqrt { n } ) + n
n.knlogn+n\quad \quad \geq \sqrt { n } . k \sqrt { n} l o g \sqrt { n } + n
=n.klogn+n\quad \quad = n . k l o g \sqrt { n } + n
=n.k12.logn+n\quad \quad = n . k \frac { 1 } { 2 } . l o g n + n knlogn\geq k n l o g n (*)

Từ (*) => 1k.12.logn1 \geq k . { \frac { 1 } { 2 } } . l o g n. Điều này không chính xác nếu n đủ lớn và với bất kỳ hằng số k.
Từ bằng chứng trên, chúng ta có thể thấy rằng suy đoán của chúng ta không chính xác đối với giới hạn dưới này.


Từ chứng minh ở trên, chúng ta hiểu rằng Θ(nlogn) là quá lớn. Nếu vậy Θ(n) thì sao? Giới hạn dưới dễ dàng chứng minh trực tiếp:
T(n)=nT(n)+nn\quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad T ( n ) = \sqrt { n } T ( \sqrt { n } ) + n \geq n
Bây giờ, chúng ta hãy chứng minh giới hạn trên cho Θ (n) này.
T(n)=nT(n)+nT ( n ) = \sqrt { n } T ( \sqrt { n } ) + n
n.c.n+n\quad \quad \leq \sqrt { n } . c . \sqrt { n } + n
=n.c+n\quad \quad = n . c + n
=n.(c+1)\quad \quad = n .( c + 1)
(Kí hiệu này mình thử mãi không biểu diễn được nên đành chụp ảnh vậy 😁)


Từ chứng minh trên, chúng ta hiểu rằng Θ (n) quá nhỏ và Θ (nlogn) quá lớn. Vì vậy, chúng ta cần một cái gì đó lớn hơn n và nhỏ hơn nlogn.
Thử với nloglognn l o g l o g n.
Chứng minh cận trên upper bound cho nloglognn l o g l o g n
T(n)=nT(n)+nT ( n ) = \sqrt { n } T ( \sqrt { n } ) + n
n.c.nloglogn+n\quad \quad \leq \sqrt { n } . c . \sqrt { n } l o g l o g \sqrt { n } + n
=n.c.(loglogn+log(12))+n\quad \quad = n . c . ( l o g l o g n + log(\frac { 1 } { 2 } ) ) + n
=n.c.loglognc.n+n\quad \quad = n . c . { l o g l o g n - c .n } + n (Lấy log cơ số 2 => log(12)log(\frac { 1 } { 2 } ) = -1)
cnloglogn,ifc1\quad \quad \leq c n l o g l o g n , if c \geq 1

Chứng minh cận dưới lower bound cho nloglognn l o g l o g n
T(n)=nT(n)+nT ( n ) = \sqrt { n } T ( \sqrt { n } ) + n
nknloglogn+n\quad \quad \geq \sqrt { n } \cdot k \cdot \sqrt { n } l o g l o g \sqrt { n } + n
=n.k.loglognk.n+n\quad \quad = n .k. l o g l o g n - k . n + n
knloglogn, i f k1\quad \quad \geq k n l o g l o g n , \text { i f } k \leq 1

Từ các chứng minh trên, chúng ta có thể thấy rằng T (n) ≤ cnloglogn, nếu c ≥ 1 và T (n) ≥ knloglogn, nếu k ≤ 1.
Yeah, chứng minh thành công, ta đã tìm được cận trên và dưới của hàm T(n) đã cho.

Tạm kết

Haizzzzz, quả là nhiều toán, lâu lâu mới động vào cũng đau đầu thật các bạn ạ 😅
Bài viết tiếp theo sẽ là Amortized Analysis(Phân tích khấu hao), lý thuyết cuối cùng của chương 1, sau đó sẽ là 1 số Problem và các solution để chúng ta áp dụng và nhớ hơn các lý thuyết đã học 😁

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