Độ phức tạp thời gian của một thuật toán: Điều quan trọng là nêu cơ sở của logarit?


Câu trả lời:


63

Nó phụ thuộc vào nơi logarit. Nếu nó chỉ là một yếu tố, thì nó không tạo ra sự khác biệt, bởi vì big-O hoặc θ cho phép bạn nhân với bất kỳ hằng số nào.

Nếu bạn lấy O(2logn) thì cơ sở là quan trọng. Trong cơ sở 2, bạn sẽ chỉ có O(n) , trong cơ sở 10, đó là về O(n0.3010) .


5
Tôi đoán đây chỉ là sẽ đưa ra một cái gì đó giống như . Tôi không thể thấy bất kỳ lý do nào để biểu thị một số là2clogbnchứ không phảin-to-the-anything-it (ngoại trừ có lẽ là giai đoạn trung gian của phép tính). 2logn2clogbnn
David Richerby

7
+1 cho "các yếu tố không đổi quan trọng theo số mũ"
dạng

50

Bởi vì ký hiệu tiệm cận là không biết gì về các yếu tố không đổi, và hai logarit bất kỳ khác nhau bởi một yếu tố không đổi, các cơ sở làm cho không có sự khác biệt: logan=Θ(logbn) cho tất cả a,b>1 . Vì vậy, không cần chỉ định cơ sở của một logarit khi sử dụng ký hiệu tiệm cận.


13
Tôi thích để xem thay vì ==
Nayuki

16
Tôi sợ ký hiệu chuẩn sử dụng . =
Yuval Filmus

4
@YuvalFilmus Ký hiệu chuẩn là sai lệch, hoàn toàn khác với tiêu chuẩn ở mọi nơi khác và làm cho sự phức tạp thuật toán dường như hoàn toàn xa lạ với những thứ khá giống với nó. "Đó là ký hiệu chuẩn" không bao giờ là một lý do để ủng hộ một giải pháp tồi hơn một giải pháp tốt hơn, rõ ràng tương tự. (Dù sao, ý nghĩa của biểu tượng thường rõ ràng từ ngữ cảnh.)
wizzwizz4

7
@ wizzwizz4 Thực tiễn phổ biến là một lý do tuyệt vời. Nó thúc đẩy giao tiếp hiệu quả. Đó là lý do tất cả chúng ta đưa ra các lỗi chính tả tiếng Anh.
Yuval Filmus

3
Đôi khi chỉ có quá nhiều thứ để có được rõ ràng hơn so với đăng nhập một n = Θ ( log b n ) . nloganΘ(nlogbn)logan=Θ(logbn)
JiK

15

Khi logxy=1logyxlogxy=logzylogzx , vì vậy loganlogbn=lognblogna=logab. Vìlogablà hằng số dương (với tất cảa,b>1), nênlogan=Θ(logbn).


8

Trong hầu hết các trường hợp, việc bỏ cơ sở logarit là an toàn bởi vì, như các câu trả lời khác đã chỉ ra, công thức thay đổi cơ sở cho logarit có nghĩa là tất cả các logarit là bội số không đổi của nhau.

Có một số trường hợp không an toàn để làm. Ví dụ: @ gnasher729 đã chỉ ra rằng nếu bạn có logarit theo số mũ, thì cơ sở logarit thực sự có ý nghĩa.

bbΘ(n+b) and there are roughly logbU rounds (where U is the maximum input integer), so the total runtime is O((n+b)logbU). For any fixed integer b this simplifies to O(nlogU). However, what happens if b isn't a constant? A clever technique is to pick b=n, in which case the runtime simplifies to O(n+lognU). Since lognU = logUlogn, the overall expression simplifies to O(nlogUlogn). Notice that, in this case, the base of the logarithm is indeed significant because it isn't a constant with respect to the input size. There are other algorithms that have similar runtimes (an old analysis of disjoint-set forests ended up with a term of logm/2+2 somewhere, for example), in which case dropping the log base would interfere with the runtime analysis.

Another case in which the log base matters is one in which there's some externally-tunable parameter to the algorithm that control the logarithmic base. A great example of this is the B-tree, which requires some external parameter b. The height of a B-tree of order b is Θ(logbn), where the base of the logarithm is significant in that b is not a constant.

To summarize, in the case where you have a logarithm with a constant base, you can usually (subject to exceptions like what @gnasher729 has pointed out) drop the base of the logarithm. But when the base of the logarithm depends on some parameter to the algorithm, it's usually not safe to do so.

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.