Tôi đang giải một câu hỏi về thuật toán và phân tích của tôi là nó sẽ chạy trên O (2 ^ sqrt (n)). Nó lớn cỡ nào Nó có tương đương với O (2 ^ n) không? Vẫn là thời gian không đa thức?
Tôi đang giải một câu hỏi về thuật toán và phân tích của tôi là nó sẽ chạy trên O (2 ^ sqrt (n)). Nó lớn cỡ nào Nó có tương đương với O (2 ^ n) không? Vẫn là thời gian không đa thức?
Câu trả lời:
Đây là một câu hỏi thú vị. May mắn thay, một khi bạn biết cách giải quyết nó, nó không khó lắm.
Đối với chức năng f : N → R + và g : N → R + , chúng ta có f ∈ O ( g ) khi và chỉ khi lim sup n → ∞ f ( n ) / g ( n ) ∈ R .
Hàm f : N → R + có nhiều nhất là sự tăng trưởng đa thức khi và chỉ khi tồn tại hằng số k ∈ N sao cho f ∈ O ( n ↦ n k ). Hãy rèn luyện sức khỏe này cho tùy ý nhưng cố định k ∈ N .
lim sup n → 2 ( n 1/2 ) / n k =
lim n → 2 ( n 1/2 ) / n k =
lim n → ∞ e log (2) n 1/2 / e log ( n ) k =
lim n → ∞ e log (2) n 1/2 - log ( n ) k = ∞ R
Bình đẳng đầu tiên là đúng bởi vì cả hai, người đề cử và mẫu số, là các hàm ổn định tăng trưởng đơn điệu. Bình đẳng thứ hai sử dụng danh tính x y = e log ( x ) y . Giới hạn không hữu hạn vì số mũ trong biểu thức cuối cùng không bị giới hạn ở trên. Nếu không đưa ra một bằng chứng chính thức, có thể giả định rằng n 1/2 chi phối log ( n ) không có triệu chứng. Do đó, hàm trong câu hỏi vượt quá sự tăng trưởng đa thức.
Tuy nhiên, sự tăng trưởng của nó hoàn toàn ít hơn số mũ, theo đó hàm mũ được xác định (theo tôi, cho mục đích này) là O ( n ↦ 2 c n ) cho c > 0. Hiển thị điều này thậm chí còn thẳng hơn.
lim sup n → 2 c n / 2 ( n 1/2 ) = lim n → 2 c n - n 1/2 = ∞ R
với bất kỳ c > 0. cố định nào , do đó, độ phức tạp của hàm nằm ở đâu đó thực sự ở giữa đa thức và hàm mũ.
Nó lớn cỡ nào Chà, O (2 ^ sqrt (n)) chính xác là nó lớn như thế nào :-(
Để hiểu ý nghĩa của nó, hãy tưởng tượng thuật toán của bạn sẽ không chỉ là O (2 ^ sqrt (n)), mà thực sự phải mất chính xác 2 ^ sqrt (n) nano giây trên máy tính của bạn:
n = 100: 2 ^ 10 = 1024 nano giây. Không có thời gian nào cả. n = 1000: 2 ^ 31.xxx = 2 tỷ nano giây. Hai giây, đó là đáng chú ý. n = 10.000: 2 ^ 100 ≈ 10 ^ 30 nano giây = 10 ^ 21 giây = 30 nghìn tỷ năm.
Điều này tốt hơn rất nhiều so với 2 ^ n nano giây, trong đó n = 100 sẽ mất 30 nghìn tỷ năm, nhưng kích thước của các vấn đề mà bạn có thể giải quyết là khá hạn chế. Nếu bạn xem xét một vấn đề "có thể giải quyết" nếu máy tính của bạn có thể giải quyết vấn đề đó trong một tuần, thì đó là khoảng 6 x 10 ^ 14 nano giây, tức là khoảng n = 2.400. Mặt khác, có thể giải quyết tối đa n = 400 trong một phần nghìn giây.
(Trong thực tế, với n = 10.000 cả O (2 ^ sqrt (n)) và O (2 ^ n) mất chính xác cùng một thời gian: Quá lâu để chờ đợi nó.)
Nó không vượt quá bất kỳ đa thức. Lấy một thuật toán khác mất n ^ 1000 giây. Thực tế là không thể giải được cho n = 2. Thuật toán này mất nhiều thời gian hơn cho đến khi n khoảng 885 triệu. Nhưng thực sự, ai quan tâm? Tại thời điểm đó, số năm mà cả hai thuật toán thực hiện là một số 9.000 chữ số.