Là 2 ^ n và n * 2 ^ n trong cùng một độ phức tạp?


178

Các tài nguyên tôi đã tìm thấy về độ phức tạp thời gian không rõ ràng về việc khi nào có thể bỏ qua các thuật ngữ trong phương trình phức tạp thời gian, đặc biệt với các ví dụ không đa thức.

Rõ ràng với tôi rằng với một cái gì đó có dạng n 2 + n + 1, hai thuật ngữ cuối cùng không đáng kể.

Cụ thể, đưa ra hai phân loại, 2 n và n * (2 n ), thứ hai có cùng thứ tự với thứ nhất không? Liệu phép nhân n bổ sung có vấn đề? Thông thường các tài nguyên chỉ nói x n theo cấp số nhân và phát triển nhanh hơn nhiều ... sau đó tiếp tục.

Tôi có thể hiểu tại sao nó sẽ không từ 2 n sẽ rất chiếm ưu thế n, nhưng vì họ không được bổ sung với nhau, nó sẽ thành vấn đề đáng kể khi so sánh hai phương trình, trên thực tế sự khác biệt giữa chúng sẽ luôn luôn là một yếu tố của n, Điều có vẻ quan trọng để nói rằng ít nhất.


8
Theo tôi, cho rằng NLogN được coi là chậm hơn N, nhưng hầu hết mọi người không thực sự quan tâm đến mức nào, có thể nói N2 ^ N chỉ đơn giản là chậm hơn 2 ^ N, nhưng không "đủ chậm" cho mọi người quan tâm ..
Jack

@tobias_k, tôi hiểu điểm này, nhưng hãy xem xét ví dụ về O (n!). Một thuật ngữ n thêm sẽ thực sự khác nhau? O (n!) Là O (n * n!) Vì O (n!) Là O ((n + 1)!) Aka cùng một biểu đồ được dịch chuyển đơn giản. Sự tăng trưởng là như nhau mặc dù ... Trong trường hợp này mặc dù một trong số đó là rất lớn, sự tăng trưởng có khác nhau không? Đây không phải là thời gian phức tạp quan tâm?
matty-d

3
@JackWu nhưng hầu hết mọi người không thực sự quan tâm đến mức nào cho đến khi bạn phải sắp xếp hàng trăm triệu bản ghi bằng nlogn thay vì n :)
CB

4
Trong thực tế, n! = o((n+1)!)đó là, nó phát triển chậm không có triệu chứng.
chepner

16
Lưu ý rằng điều này không liên quan gì đến lý thuyết phức tạp, đó là "chỉ" về vấn đề không triệu chứng. Ngoài ra, loại câu hỏi này có lẽ tốt hơn về Khoa học Máy tính .
Raphael

Câu trả lời:


231

Bạn sẽ phải đi đến định nghĩa chính thức của chữ O lớn ( O) để trả lời câu hỏi này.

Định nghĩa là f(x)thuộc về O(g(x))nếu và chỉ khi giới hạn tồn tại tức là không phải là vô hạn. Nói tóm lại, điều này có nghĩa là tồn tại một hằng số , sao cho giá trị của nó không bao giờ lớn hơn .limsupx → ∞ (f(x)/g(x))Mf(x)/g(x)M

Trong trường hợp câu hỏi của bạn hãy để và cho . Sau đó là vẫn sẽ phát triển vô hạn. Do đó không thuộc về .f(n) = n ⋅ 2ng(n) = 2nf(n)/g(n)nf(n)O(g(n))


5
Để dễ hiểu hơn một chút, hãy xem tại đây
Alden

3
Chính thức nói, bạn không thể đi quá giới hạn O(f(x)/g(x)); thông báo big-O là viết tắt cho một tập hợp các hàm, không phải là một hàm duy nhất có giá trị bạn có thể giới hạn. Tuy nhiên, tôi nghĩ đúng là bạn có thể chỉ ra rằng f(x) = O(g(x))nếu lim(x->infinity) f(x)/g(x)có.
chepner

44
Giới hạn không phải tồn tại; tỷ lệ chỉ phải được giới hạn ở trên bởi một hằng số cho x đủ lớn. Ví dụ: 2 + sin (x) nằm trong O (1), nhưng (2 + sin (x)) / 1 không đạt đến giới hạn là x-> vô cùng.
user2357112 hỗ trợ Monica

2
Định nghĩa sẽ đúng với lim supthay vì lim.
David Eisenstat

11
@IvayloStrandjev xin lưu ý rằng mô tả ngắn của bạn không chính xác. Điều này phải đúng với đủ lớn x, không phải cho tất cả các giá trị của x.
K.Steff

85

Một cách nhanh chóng để thấy rằng n⋅2ⁿlớn hơn là thay đổi biến. Hãy để m = 2ⁿ. Sau đó n⋅2ⁿ = ( log₂m )⋅m(lấy logarit cơ sở 2 ở cả hai mặt của m = 2ⁿcho n = log₂m) và bạn có thể dễ dàng hiển thị m log₂mtốc độ tăng nhanh hơn m.


3
Cảm ơn bạn! Đây là câu trả lời tốt nhất theo ý kiến ​​của tôi. Bằng chứng dựa trên các định nghĩa chính thức là chính xác, nhưng nếu bạn có một vấp ngã nào đó để vượt qua, một sự tương tự rất thoải mái và quen thuộc sẽ thực hiện công việc tốt nhất và nhanh nhất.
John P

1
Câu hỏi ngu ngốc, là lggì? Logarit trong cơ sở 2?
Pierre Arlaud

3
Đó là một từ viết tắt lười biếng. Trong khoa học máy tính, nó có xu hướng có nghĩa là cơ sở 2 vì nó chủ yếu là kết quả của các chiến lược phân chia và chinh phục. Trong ký hiệu big-O, nó có thể đại diện cho bất cứ điều gì, bởi vì logarit cơ sở của một số khác với logarit cơ sở của nó chỉ bởi một yếu tố không đổi, bất kể x và y.
chepner

3
Tôi nên lưu ý khi nhìn lại đó lglà ký hiệu ISO cho logarit cơ sở 10, thay vì sử dụng bất khả tri cơ sở thường được sử dụng nhất khi thảo luận về thời gian chạy không triệu chứng. Xem en.wikipedia.org/wiki/Logarithm#Particular_base
chepner

Được rồi, chắc chắn, nhưng tôi không hiểu tại sao rõ ràng hơn là m log m phát triển nhanh hơn m, hơn là n 2 ^ n tăng nhanh hơn 2 ^ n.
djechlin

10

Tôi đồng ý rằng điều đó n⋅2ⁿkhông xảy ra O(2ⁿ), nhưng tôi nghĩ nó nên rõ ràng hơn vì giới hạn sử dụng vượt trội không phải lúc nào cũng giữ.

Theo định nghĩa chính thức của Big-O: f(n)là trong O(g(n))nếu tồn tại hằng số c > 0n₀ ≥ 0như vậy cho tất cả n ≥ n₀chúng ta có f(n) ≤ c⋅g(n). Nó có thể dễ dàng được chỉ ra rằng không có hằng số như vậy tồn tại cho f(n) = n⋅2ⁿg(n) = 2ⁿ. Tuy nhiên, nó có thể được hiển thị g(n)là trongO(f(n)) .

Nói cách khác, n⋅2ⁿđược giới hạn bởi 2ⁿ. Đây là trực quan. Mặc dù cả hai đều theo cấp số nhân và do đó hầu như không được sử dụng trong hầu hết các trường hợp thực tế, chúng tôi không thể nói rằng chúng có cùng thứ tự vì 2ⁿnhất thiết phải tăng chậm hơn n⋅2ⁿ.


f(n) = 2*2^nTôi nghĩ bạn có ý n*2^ngì?
tobias_k

4

Tôi không tranh luận với những câu trả lời khác nói rằng n⋅2ⁿphát triển nhanh hơn 2ⁿ. Nhưng n⋅2ⁿphát triển vẫn chỉ là cấp số nhân.

Khi chúng ta nói về các thuật toán, chúng ta thường nói rằng sự phức tạp thời gian tăng lên theo cấp số nhân. Vì vậy, chúng tôi cho là 2ⁿ, 3ⁿ, eⁿ, 2.000001ⁿ, hoặc chúng tôi n⋅2ⁿcó cùng một nhóm phức tạp với mũ phát triển.

Để cho nó một chút ý nghĩa toán học, chúng tôi xem xét một hàm f(x)tăng trưởng (không nhanh hơn) theo cấp số nhân nếu tồn tại hằng số như vậy c > 1, điều đó .f(x) = O(cx)

Đối với n⋅2ⁿhằng số ccó thể là bất kỳ số nào lớn hơn 2, hãy lấy 3. Sau đó:

n⋅2ⁿ / 3ⁿ = n ⋅ (2/3)ⁿvà điều này là ít hơn 1cho bất kỳ n.

Vì vậy, 2ⁿphát triển chậm hơn n⋅2ⁿ, cuối cùng lần lượt phát triển chậm hơn 2.000001ⁿ. Nhưng cả ba đều phát triển theo cấp số nhân.


Trong ví dụ cuối, n * 2 ^ n lớn hơn 2.000001 ^ n lên tới n = 34.726.000. Tại thời điểm đó, 2 ^ n là một số có hơn 10 triệu chữ số, vì vậy nó không thực sự quan trọng ...
gnasher729

1
@ gnasher729 Nó chỉ là một hằng số mà chúng ta có thể bỏ qua vì f (n) và c * f (n) có độ phức tạp tương tự về mặt big-O. ví dụ: 40'000'000 * 2.000001 ^ n lớn hơn n * 2 ^ n ngay lập tức. Nhưng bạn nói đúng, nó không thực sự quan trọng, tôi sẽ nói nó không thực sự quan trọng một khi chúng ta đạt được sự tăng trưởng theo cấp số nhân (trừ khi chúng ta chỉ nhận được các giá trị nhỏ của n).
Andrey

2

Bạn hỏi "cái thứ hai có cùng thứ tự với cái thứ nhất không? Phép nhân n bổ sung có vấn đề không?" Đây là hai câu hỏi khác nhau với hai câu trả lời khác nhau.

n 2 ^ n phát triển không triệu chứng nhanh hơn 2 ^ n. Đó là câu hỏi đã trả lời.

Nhưng bạn có thể hỏi "nếu thuật toán A mất 2 ^ n nano giây và thuật toán B mất n 2 ^ n nano giây, thì n lớn nhất mà tôi có thể tìm ra giải pháp trong một giây / phút / giờ / ngày / tháng / năm? Và các câu trả lời là n = 29/35/41/46/51/54 so với 25/30/4 / 40/45/49. Không có nhiều khác biệt trong thực tiễn.

Kích thước của vấn đề lớn nhất có thể được giải quyết trong thời gian T là O (ln T) trong cả hai trường hợp.

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.