Là một thay thế, sử dụng một biến thay y = n - x
Tiếp theo ký hiệu Sigma để phân tích số lần lặp lại của while
vòng lặp bên trong của thuật toán của bạn .
Các ước lượng quá ở trên, đối với mỗi bên trong vòng lặp while, số lần lặp lại bởi 1
đối với trường hợp n-1
không phải là một bội số của i
, ví dụ nơi (n-1) % i != 0
. Khi chúng tôi tiến hành, chúng tôi giả định rằng (n-1)/i
là một số nguyên cho tất cả các giá trị i
, do đó đánh giá quá cao tổng số lần lặp trong vòng lặp while
bên trong, sau đó bao gồm dấu nhỏ hơn hoặc bằng nhau tại (i)
bên dưới. Chúng tôi tiến hành phân tích ký hiệu Sigma:
nơi chúng tôi, tại (ii)
, đã xấp xỉ n
: thứ harmonic number bởi không thể thiếu đi kèm. Do đó, thuật toán của bạn chạy trong O(n·ln(n))
, tiệm cận.
Rời hành vi tiệm cận và nghiên cứu sự phát triển thực tế của thuật toán, chúng ta có thể sử dụng dữ liệu mẫu đẹp chính xác (n,cnt)
(nơi cnt
là số lần lặp bên trong) cặp bởi @chux (tham khảo câu trả lời của ông), và so sánh với số lần lặp lại ước tính từ trên cao, ví dụ: n(1+ln(n))-ln(n)
. Rõ ràng là ước tính hài hòa gọn gàng với số lượng thực tế, xem các ô bên dưới hoặc this snippet for the actual numbers.
Cuối cùng lưu ý rằng nếu chúng ta để cho n->∞
trong tổng trên 1/i
trên, hàng loạt kết quả là infinite harmonic series, đó là, một cách tò mò đủ, khác nhau. Các bằng chứng cho sau này làm cho việc sử dụng thực tế là trong vô hạn tổng số các điều khoản khác không tự nhiên là vô hạn riêng của mình. Tuy nhiên, trong thực tế, đối với đủ lớn nhưng không vô hạn n, ln(n)
là xấp xỉ tổng hợp thích hợp và phân kỳ này không liên quan đến phân tích tiệm cận của chúng tôi tại đây.
IMHO không trùng lặp với giải thích đồng bằng bằng tiếng Anh của Big O. OP biết Big O là gì và cô ấy/anh ta đang yêu cầu đánh giá chính xác trong một trường hợp cụ thể. –
Xem như không có giá trị trả về và không có tác dụng phụ, chúng ta có thể chắc chắn trình biên dịch không tối ưu hóa nó đi? – jpmc26
Woah .. bạn sẽ mong đợi một câu hỏi như vậy để đạt được một số điểm như vậy? Bí ẩn của SO ... –