You are on page 1of 6

#3 Sách Introduction to the Design and Analysis of Algorithms – Levitin

Phần tóm tắt


2.3 Phân tích toán học của các thuật toán không đệ quy
Trong phần này, áp dụng genral framework được nêu trong phần 2.1 để phân tích hiệu quả thời gian của
các thuật toán.
 Các tiêu chí để phân tích hiệu quả về thời gian của thuật toán
- Kích thước đầu vào
- Các hoạt động hay các bước của thuật toán trong vòng lặp
- Kiểm tra số lần thao tác cơ bản được thực thi khi chỉ phụ thuộc vào kích thước đầu vào. Nếu nó
phụ thuộc vào các yếu tố khác nữa, cần xem xét thêm trường hợp xấu nhất, trung bình và nếu
cần trường hợp tốt nhất phải kiểm tra riêng.
- Lập một tổng thể hiện số lần thực hiện thao tác cơ bản của thuật toán.
- Sử dụng các công thức và quy tắc tiêu chuẩn của phép tính tổng, hoặc tìm một công thức dạng
đóng cho số đếm hoặc ít nhất là thiết lập thứ tự tăng trưởng của nó.
Hai quy tắc cơ bản hữu ích trong phân tích thuật toán

Và 2 công thức tính tổng

Example: Kiểm tra các phần tử trong mảng có phải là duy nhất không

Kích thước đầu vào là n, số phần tử trong mảng. Chúng ta coi phép so sánh trong vòng lặp là phép
toán cơ bản của thuật toán. Tuy nhiên, lưu ý rằng số lượng phần tử được so sánh không chỉ phụ thuộc vào
n mà còn phụ thuộc vào việc có các phần tử bằng nhau trong mảng hay không và nếu có thì chúng chiếm
vị trí mảng nào. Chúng ta sẽ xem xét trong trường hợp xấu nhất.
Có hai loại đầu vào trong trường hợp xấu nhất: phần tử trong mảng không bằng nhau và 2 phần tử
cuối cùng là cặp phần tử bằng nhau duy nhất. Vòng lặp bên trong mỗi giá trị của biến vòng lặp j, giới hạn
của nó i + 1 và n – 1. Vòng lặp bên ngoài, giá trị của biến vòng lặp i có giới hạn 0 và n − 2 của nó. Theo
đó, chúng ta nhận được

Hoặc cách tính tổng nhanh hơn

Example: Tìm số chữ số nhị phân trong biểu diễn nhị phân của một số nguyên dương.

Thao tác được thực hiện thường xuyên nhất là phép so sánh (n>1) chứ không phải các thao tác trong vòng
lặp. Số lần so sánh (n>1) sẽ được thực hiện lớn hơn số lần lặp lại phần thân của vòng lặp đúng 1. Vì giá trị
của n giảm đi một nửa sau mỗi lần lặp lại vòng lặp nên câu trả lời sẽ là log2 n. Công thức chính xác cho số
lần phép so sánh n > 1 sẽ được thực hiện thực ra là log2 n + 1—số bit trong biểu diễn nhị phân của n theo
công thức.
2.4 Phân tích toán học của thuật toán đệ quy
 Các tiêu chí chung để phân tích hiệu quả thời gian của các thuật toán đệ quy
- Xem xét biết kích thước của đầu vào.
- Xác định thao tác cơ bản của thuật toán.
- Kiểm tra xem số lần thao tác cơ bản được thực thi có thể thay đổi trên các đầu vào khác nhau có
cùng kích thước hay không; nếu có thể, hiệu quả trong trường hợp xấu nhất, trường hợp trung bình
và trường hợp tốt nhất phải được điều tra riêng biệt.
- Thiết lập một quan hệ truy hồi, với điều kiện ban đầu thích hợp, cho số lần phép toán cơ bản được
thực hiện.
- Giải quyết sự lặp lại hoặc, ít nhất, xác định thứ tự phát triển của giải pháp của nó.
Example: Câu đố tháp Hà Nội: Ban đầu, tất cả các đĩa nằm trên chốt đầu tiên theo thứ tự kích thước, lớn
nhất ở dưới cùng và nhỏ nhất ở trên cùng. Mục tiêu là di chuyển tất cả các đĩa sang chốt thứ ba, sử dụng
chốt thứ hai làm phụ trợ, nếu cần. Chúng ta chỉ có thể di chuyển một đĩa tại một thời điểm và không được
phép đặt đĩa lớn hơn lên trên đĩa nhỏ hơn.
Bài toán có một lời giải đệ quy đơn giản, được minh họa trong
Số lượng đĩa n là kích thước của đầu vào, di chuyển một đĩa như hoạt động cơ bản của thuật toán. số lần
di chuyển M(n) chỉ phụ thuộc vào n và chúng ta có phương trình truy hồi sau cho nó:

Với điều kiện ban đầu rõ ràng M(1) = 1, ta có phép truy hồi sau quan hệ cho số lần di chuyển M(n):

Có thể giải quyết sự lặp lại này bằng cùng một phương pháp thay thế ngược:

Vì điều kiện ban đầu được chỉ định cho n = 1, điều này đạt được cho i = n - 1, nên chúng ta
nhận được công thức sau đây cho giải pháp truy hồi (2.3):

Chúng ta có một thuật toán hàm mũ, thuật toán này sẽ chạy trong một thời gian dài không thể tưởng tượng
được ngay cả đối với các giá trị vừa phải của n. Không phải do thuật toán này kém, không khó để chứng
minh thuật toán này hiệu quả. Chính độ khó nội tại của vấn đề khiến nó trở nên khó tính toán. Tuy nhiên,
ví dụ này đưa ra một điểm chung quan trọng:
 Người ta nên cẩn thận với các thuật toán đệ quy vì tính ngắn gọn của chúng có thể che giấu sự kém
hiệu quả của chúng.
2.5 Ví dụ: Tính số Fibonacci thứ n
Thuật toán đệ quy tính đệ quy số Fibonacci thứ n bằng cách sử dụng định nghĩa của nó
Số phép cộng cần thiết để tính F (n - 1) và F (n - 2) lần lượt là A(n - 1) và A(n - 2) và thuật toán cần thêm
một phép cộng nữa để tính tổng của chúng. Do đó, chúng tôi nhận được sự truy hồi sau cho A(n):

Chúng ta có thể giảm sự truy hồi không đồng nhất của mình thành một sự đồng nhất bằng cách viết lại nó
dưới dạng:

và thay B(n) = A(n) + 1:

Loại hiệu quả kém của thuật toán có thể được dự đoán bởi bản chất của sự lặp lại. Nó chứa hai lệnh gọi đệ
quy với kích thước của các trường hợp nhỏ hơn chỉ nhỏ hơn một chút so với kích thước n.
Chúng ta có một thuật toán nhanh hơn nhiều bằng cách đơn giản tính toán lặp đi lặp lại các phần tử liên
tiếp của dãy Fibonacci:

Thuật toán này rõ ràng tạo ra n − 1 phép cộng. Do đó, nó là tuyến tính dưới dạng hàm của n và hàm mũ
“chỉ” là hàm của số bit b trong biểu diễn nhị phân của n.
Cuối cùng, tồn tại một thuật toán (log n) để tính toán số Fibonacci thứ n chỉ thao tác với các số nguyên.
Nó dựa trên sự bình đẳng

và một cách hiệu quả để tính toán sức mạnh ma trận.


2.6 Phân tích thực nghiệm các thuật toán
Trên thực tế, ngay cả một số thuật toán có vẻ đơn giản cũng tỏ ra rất khó phân tích với độ chính xác và
chắc chắn về mặt toán học.
Phương án thay thế chính cho phân tích toán học về hiệu quả của thuật toán là phân tích thực nghiệm của
nó. Cách tiếp cận này ngụ ý các bước được nêu ra trong kế hoạch sau đây.
Kế hoạch chung cho phân tích thực nghiệm về hiệu quả thời gian của thuật toán
- Hiểu mục đích của thí nghiệm.
- Quyết định chỉ số hiệu quả M cần đo và đơn vị đo (số lượng hoạt động so với đơn vị thời gian).
- Quyết định các đặc điểm của mẫu đầu vào (phạm vi, kích thước, v.v.).
- Lập chương trình thực hiện thuật toán (hoặc các thuật toán) cho thí nghiệm.
- Tạo một mẫu đầu vào.
- Chạy thuật toán (hoặc các thuật toán) trên đầu vào của mẫu và ghi lại dữ liệu quan sát được.
- Phân tích dữ liệu thu được.
Có một số mục tiêu khác nhau mà người ta có thể theo đuổi trong việc phân tích các thuật toán theo kinh
nghiệm. Chúng bao gồm kiểm tra tính chính xác của một khẳng định lý thuyết về hiệu quả của thuật toán,
so sánh hiệu quả của một số thuật toán để giải quyết cùng một vấn đề hoặc các triển khai khác nhau của
cùng một thuật toán, phát triển một giả thuyết về lớp hiệu quả của thuật toán và xác định tính hiệu quả của
chương trình thực hiện thuật toán trên một máy cụ thể.
Giải pháp thay thế đầu tiên là chèn một bộ đếm (hoặc các bộ đếm) vào chương trình thực hiện thuật toán
để đếm số lần thao tác cơ bản của thuật toán được thực hiện. Đây thường là một hoạt động đơn giản; bạn
chỉ nên lưu ý đến khả năng hoạt động cơ bản được thực hiện ở một số vị trí trong chương trình và tất cả
các hoạt động của nó cần được tính đến và phải luôn kiểm tra chương trình đã sửa đổi để đảm bảo rằng
chương trình hoạt động chính xác, xét về cả vấn đề mà nó giải quyết và số lượng mà nó mang lại.
Phương án thứ hai là tính thời gian chương trình thực hiện thuật toán được đề cập. Cách dễ nhất để thực
hiện việc này là sử dụng lệnh của hệ thống, chẳng hạn như lệnh thời gian trong UNIX. Ngoài ra có thể đo
thời gian chạy của một đoạn mã bằng cách hỏi thời gian hệ thống ngay trước khi đoạn mã bắt đầu (tstart)
và ngay sau khi hoàn thành (tfinish), sau đó tính toán sự khác biệt giữa hai thời gian (tfinish− tstart).
- Tuy nhiên, thời gian của hệ thống thường không chính xác và có thể nhận được kết quả hơi khác
khi chạy lặp lại cùng một chương trình trên cùng một đầu vào. Biện pháp là thực hiện một số phép
đo như vậy và sau đó lấy giá trị trung bình của chúng (hoặc trung vị).
- Thứ hai, với tốc độ cao của máy tính hiện đại, thời gian chạy có thể không được đăng ký và được
báo cáo là không. Giải pháp vượt qua trở ngại này là chạy chương trình trong một vòng lặp bổ sung
nhiều lần, đo tổng thời gian chạy rồi chia cho số lần lặp lại của vòng lặp.
- Thứ ba, trên máy tính chạy trong hệ thống chia sẻ thời gian như UNIX, thời gian được báo cáo có
thể bao gồm thời gian CPU dành cho các chương trình khác, điều này rõ ràng là không đạt được
mục đích của thử nghiệm.
Do đó, bạn nên cẩn thận hỏi hệ thống về thời gian dành riêng cho việc thực hiện chương trình của bạn
Chúng ta cũng cần phải quyết định một mẫu đầu vào cho thử nghiệm. Thông thường, bạn sẽ phải đưa ra
quyết định về cỡ mẫu (nó hợp lý khi bắt đầu với một mẫu tương đối nhỏ và tăng lên sau nếu cần), phạm vi
kích thước phiên bản (thường không quá nhỏ cũng không quá lớn), và một quy trình để tạo các phiên bản
trong phạm vi đã chọn. Kích thước phiên bản có thể tuân theo một số mẫu.
- Ưu điểm chính của việc thay đổi kích thước theo một khuôn mẫu là tác động của nó dễ phân tích
hơn. Ví dụ: nếu kích thước của mẫu được tạo bằng cách nhân đôi, thì bạn có thể tính các tỷ lệ
M(2n)/M(n) của chỉ số M được quan sát (số lượng hoặc thời gian)
- Nhược điểm chính của kích thước không ngẫu nhiên là khả năng thuật toán được điều tra thể hiện
hành vi không điển hình trên mẫu được chọn. Ví dụ: nếu tất cả các kích thước trong một mẫu là
chẵn và thuật toán của bạn chạy chậm hơn nhiều đối với các đầu vào có kích thước lẻ, thì kết quả
thực nghiệm sẽ khá sai lệch.
Dữ liệu thực nghiệm thu được do kết quả của một thí nghiệm cần được ghi lại và sau đó trình bày để
phân tích. Dữ liệu có thể được trình bày dưới dạng số trong một bảng hoặc bằng đồ thị trong biểu đồ
phân tán, nghĩa là theo các điểm trong hệ tọa độ Descartes. Bạn nên sử dụng cả hai tùy chọn này bất cứ
khi nào khả thi vì cả hai phương pháp đều có điểm mạnh và điểm yếu riêng.
- Ưu điểm chính của dữ liệu được lập bảng nằm ở khả năng thao tác với nó một cách dễ dàng. Ví dụ:
người ta có thể tính các tỷ lệ M(n)/g(n) trong đó g(n) là ứng cử viên đại diện cho lớp hiệu quả của
thuật toán được đề cập. Nếu thuật toán thực sự là (g(n)), rất có thể các tỷ số này sẽ hội tụ về một
hằng số dương nào đó khi n trở nên lớn. (Lưu ý rằng đôi khi những người mới bất cẩn cho rằng
hằng số này phải là 1, tất nhiên, điều này không chính xác theo định nghĩa của (g(n)).) Hoặc người
ta có thể tính các tỷ số M(2n)/M(n) và xem cách thời gian chạy phản ứng với việc tăng gấp đôi kích
thước đầu vào của nó. Như chúng ta đã thảo luận trong Phần 2.2, các tỷ lệ như vậy sẽ chỉ thay đổi
một chút đối với các thuật toán logarit và rất có thể hội tụ về 2, 4 và 8 đối với các thuật toán tuyến
tính, bậc hai và bậc ba, tương ứng—để đặt tên cho các trường hợp rõ ràng và thuận tiện nhất.
- Dạng biểu đồ phân tán cũng có thể giúp xác định lớp hiệu quả có thể xảy ra của thuật toán. Đối với
thuật toán logarit, scat terplot sẽ có dạng lõm (Hình 2.7a); thực tế này phân biệt nó với tất cả các
lớp hiệu quả cơ bản khác. Đối với thuật toán tuyến tính, các điểm sẽ có xu hướng tập hợp xung
quanh một đường thẳng hoặc tổng quát hơn là nằm giữa hai đường thẳng (Hình 2.7b). Biểu đồ phân
tán của các hàm trong (n lg n) và (n2) sẽ có dạng lồi (Hình 2.7c), khiến chúng khó phân biệt. Biểu
đồ phân tán của thuật toán lập phương cũng sẽ có dạng lồi, nhưng nó sẽ cho thấy giá trị của chỉ số
tăng nhanh hơn nhiều. Một thuật toán hàm mũ rất có thể sẽ yêu cầu thang logarit cho trục tung,
trong đó các giá trị của loga M(n) chứ không phải của M(n) được vẽ trên đồ thị. (Cơ số logarit
thường được sử dụng là 2 hoặc 10.) Trong một hệ tọa độ như vậy, biểu đồ phân tán của thuật toán
hàm mũ thực sự sẽ giống với một hàm tuyến tính vì M(n) ≈ có thể hàm ý logb M(n) ≈ logb c + n
logb a, và ngược lại.
Một trong những ứng dụng có thể có của phân tích thực nghiệm là dự đoán hiệu suất của thuật toán
trên một trường hợp không có trong mẫu thử nghiệm. Phương pháp này nên được sử dụng một cách
thận trọng, đặc biệt đối với các giá trị của n nằm ngoài phạm vi mẫu. (Các nhà toán học gọi những dự
đoán như vậy là phép ngoại suy, trái ngược với phép nội suy, vốn xử lý các giá trị trong phạm vi mẫu.)
Tất nhiên có thể thử sử dụng các kỹ thuật dự đoán và phân tích dữ liệu thống kê tiêu chuẩn. Lưu ý rằng
phần lớn các kỹ thuật như vậy dựa trên các giả định xác suất cụ thể có thể có hoặc không hợp lệ đối
với dữ liệu thử nghiệm đang được đề cập.
Điểm mạnh chính của phân tích toán học là tính độc lập của nó đối với các đầu vào cụ thể; điểm yếu
chính của nó là khả năng ứng dụng hạn chế, đặc biệt là để điều tra hiệu quả trường hợp trung bình. Sức
mạnh chính của phân tích thực nghiệm nằm ở khả năng áp dụng của nó cho bất kỳ thuật toán nào,
nhưng kết quả của nó có thể phụ thuộc vào mẫu trường hợp cụ thể và máy tính được sử dụng trong thử
nghiệm.

You might also like