Điều gì tạo nên một đơn vị thời gian trong phân tích thời gian chạy?


8

Khi tính toán phụ thuộc thời gian chạy vào đầu vào, tính toán nào được xem xét? Ví dụ, tôi nghĩ rằng tôi đã học được rằng lập chỉ mục mảng cũng như các câu lệnh gán không được tính, tại sao vậy?

Câu trả lời:


6

Khi thực hiện các phép tính phức tạp, chúng ta thường sử dụng mô hình RAM . Trong mô hình này, chúng tôi giả sử rằng lập chỉ mục mảng là O (1). Câu lệnh gán giống như gán một số giá trị cho một số mảng biến của biến . Điều này chỉ để thuận tiện. Nó đơn giản hóa việc phân tích thuật toán. Trong lập chỉ mục mảng trong thế giới thực mất O (log I) trong đó tôi là số thứ được lập chỉ mục.

Chúng tôi thường xem xét những thứ phụ thuộc vào kích thước của đầu vào, ví dụ như các vòng lặp. Ngay cả khi có hoạt động O (1) trong vòng lặp và nó được thực hiện n lần thì thuật toán vẫn chạy trong thời gian O (n).

Nhưng hoạt động O (1) bên ngoài vòng lặp chỉ mất thời gian không đổi và O (n) + O (1) = O (n).

Đọc về thuật toán sắp xếp cơ số từ CLRS.


Điều gì về gia số trong một vòng lặp? Đó phải là O (n) phải không?

for (int k = 0; k <N; k ++) {sum = sum + value [k];} Là mã trong câu hỏi. Nó được cho là thực hiện cuộc gọi 3N + 2.

Không. Với sum = sum + giá trị [k], + là O (1) và = cũng là O (1). Nhưng vòng lặp chạy O (N) lần . Vậy O (N) * O (1 + 1) = O (N) của nó. Các cuộc gọi O (3N + 2) chỉ là O (N).
Pratik Deoghare

Nhưng tại sao lại gọi O (3N + 2)?

Giá trị truy cập [k] là 1 cuộc gọi. + là 1 cuộc gọi. = là 1 cuộc gọi. Điều đó giải thích 3 cuộc gọi được thực hiện N lần nhưng tôi không biết về +2.
Pratik Deoghare

5

Mục tiêu cuối cùng là "thời gian thực hiện tính bằng giây" hoặc nói chung là (bỏ qua các tính năng CPU hiện đại) "số chu kỳ xung nhịp". Hóa ra, điều này thật khó để phân tích, và nó cũng là máy hoặc ít nhất là tập lệnh cụ thể. Do đó, nó thường không được thực hiện.

Mức độ trừu tượng tiếp theo là tính chính xác tất cả các hoạt động (của một số mã giả kiểu lắp ráp), giữ chi phí hoạt động riêng lẻ (trong chu kỳ đồng hồ) làm tham số. Lưu ý rằng phân tích như vậy được tìm thấy trong "Nghệ thuật lập trình máy tính" của Knuth, vì vậy chắc chắn có một cách tiếp cận kiểu này, mặc dù nó khó và có xu hướng khó hơn khi có sự phân cấp bộ nhớ.

Ôi -analysis"). Lý do là thời gian chạy bị ràng buộc để hành xử không có triệu chứng giống như số lượng các hoạt động được thực hiện thường xuyên nhất, nhân một số yếu tố tùy thuộc vào việc thực hiện thực tế và máy. Kiểu phân tích này mang lại kết quả chung áp dụng cho tất cả các máy (được bao phủ bởi mô hình RAM) và dễ thực hiện hơn so với ở trên. Nó có thể, tuy nhiên, thiếu cụ thể.

Bỏ lại các khung "cổ điển" phía sau, nhiều thuật toán bị chi phối bởi bộ nhớ và / hoặc chi phí liên lạc, do đó, trong trường hợp đó, việc đếm số lượng và khối lượng bộ nhớ sẽ tăng thêm. truyền mạng là hợp lý (và có thể đủ).

Hơn nữa, hãy nhớ rằng chúng ta thường không quan tâm đến hiệu suất tuyệt đối của một thuật toán mà là so sánh nó với các thuật toán khác. Điều này cũng có thể thông báo sự lựa chọn của tham số được phân tích.

Vì vậy, bạn thấy, không có một câu trả lời chắc chắn. Tùy thuộc vào các mục tiêu của phân tích trong tay, các câu trả lời khác nhau có thể được đưa ra.

Xem thêm câu trả lời của tôi ở đây để biết một số suy nghĩ liên quan và câu trả lời của Sebastian trên Quicksort là một ví dụ.


Tôi không hài lòng khi nói rằng cách tiếp cận nổi bật nhất mà bạn đề cập hoàn toàn được bao phủ bởi mô hình RAM: Mô hình RAM thường không tính chi phí thống nhất cho phép nhân (để giữ lại sự tương đương của các vấn đề có thể giải quyết được bởi các TM trong nhiều thời gian có vấn đề có thể giải quyết bằng RAM trong nhiều thời gian). Tuy nhiên, phép nhân thường được cho là tiêu tốn một lượng thời gian không đổi trong việc phân tích nhiều thuật toán
Thương hiệu Cornelius

@cbra: Tôi chưa gặp phải một mô hình RAM với chi phí thống nhất cho mọi thứ trừ nhân. Đặc biệt, không cần thiết cho sự tương đương nhiều thời gian.
Raphael

2(2n)Ôi(n)

@cbra Bạn dường như có một điểm ở đó. Mô hình RAM ở dạng "thuần" không cung cấp phép nhân như một hành động nguyên tử mà thực hiện nó bằng cách thêm lặp lại. Do đó, chi phí thống nhất cho phép nhân (và có thể có các hoạt động khác) là "nguy hiểm" ở chỗ nó phá vỡ các mối quan hệ nhất định nếu áp dụng cho các vấn đề khi số lượng trở nên lớn (tức là lớn hơn đầu vào (?)).
Raphael
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.