我正在参加由Tim Roughgarden在Coursera举办的斯坦福大学算法系列讲座。在那里,他给出了一个多项选择题,以找出函数的运行时间复杂度,如下图所示。
在这个问题中,最后三个选项是正确的。我只是通过查看函数来理解Ω(Omega)和Θ(Theta)的前两个选项是如何正确的,但是我无法理解最后一个选项是如何正确的,因为据我所知,运行时复杂度应该是O(n 2 )而不是O(n 3 )。
任何人都可以解释我错在哪里吗?
答案 0 :(得分:1)
O(n^3)
是f(n)
的子集。 Wikipedia对此有好处。
事实上,如果O(g(n))
小于无穷大(n进入无穷大),则lim |f(x)|/g(x)
位于O(1/2*n^2+3n) is in O(n^3)
<=> lim |(1/2*n^2+3n)| / n^3
<=> lim |(n*[n/2 + 3])| / n^3
<=> lim |(n/2 + 3)| / n^2 < infinty
for n to infinity n^2 is allways greater then n/2 so for positiv n this goes against 0
。这将是
k
另一种证明这一点的方法是:您能找到c
和f(n)
(两者都是积极的),以便k*g(n) + c
始终小于n
(并非所有人) n0
- 如果一个n0
和所有大于k=1
的数字都是如此,那就足够了。在这里,您可以选择c=0
和n^2
,因为前面提到的n^3
总是小于n
,因为肯定02-12 23:15:46.608 2259-2259/com.wEgyptianpost I/art: Not late-enabling -Xcheck:jni (already on)
02-12 23:15:46.608 2259-2259/com.wEgyptianpost W/art: Unexpected CPU variant for X86 using defaults: x86
02-12 23:15:46.638 2259-2259/com.wEgyptianpost W/System: ClassLoader referenced unknown path: /data/app/com.wEgyptianpost-2/lib/x86
[ 02-12 23:15:46.648 1489: 1510 D/ ]
HostConnection::get() New Host Connection established 0x9cc92200, tid 1510
02-12 23:15:46.774 2259-2259/com.wEgyptianpost W/System: ClassLoader referenced unknown path: /system/app/webview/lib/x86
02-12 23:15:46.775 2259-2259/com.wEgyptianpost I/WebViewFactory: Loading com.android.webview version 51.0.2704.91 (code 275509110)
02-12 23:15:47.177 2259-2266/com.wEgyptianpost W/art: Suspending all threads took: 7.525ms
02-12 23:15:47.227 2259-2259/com.wEgyptianpost I/cr_LibraryLoader: Time to load native libraries: 182 ms (timestamps 5375-5557)
02-12 23:15:47.227 2259-2259/com.wEgyptianpost I/cr_LibraryLoader: Expected native library version number "51.0.2704.91", actual native library version number "51.0.2704.91"
02-12 23:15:47.377 2259-2259/com.wEgyptianpost V/WebViewChromiumFactoryProvider: Binding Chromium to main looper Looper (main, tid 1) {f0ca1f0}
02-12 23:15:47.377 2259-2259/com.wEgyptianpost I/cr_LibraryLoader: Expected native library version number "51.0.2704.91", actual native library version number "51.0.2704.91"
02-12 23:15:47.813 2259-2259/com.wEgyptianpost I/chromium: [INFO:library_loader_hooks.cc(143)] Chromium logging enabled: level = 0, default verbosity = 0
02-12 23:15:48.214 2259-2266/com.wEgyptianpost W/art: Suspending all threads took: 41.274ms
02-12 23:15:48.311 2259-2259/com.wEgyptianpost I/cr_BrowserStartup: Initializing chromium process, singleProcess=true
02-12 23:15:49.240 2259-2266/com.wEgyptianpost W/art: Suspending all threads took: 65.312ms
02-12 23:15:49.614 2259-2259/com.wEgyptianpost E/ApkAssets: Error while loading asset assets/natives_blob_64.bin: java.io.FileNotFoundException: assets/natives_blob_64.bin
02-12 23:15:49.614 2259-2259/com.wEgyptianpost E/ApkAssets: Error while loading asset assets/snapshot_blob_64.bin: java.io.FileNotFoundException: assets/snapshot_blob_64.bin
[ 02-12 23:15:50.790 2259: 2259 D/ ]
HostConnection::get() New Host Connection established 0x9bc92400, tid 2259
02-12 23:15:51.243 2259-2378/com.wEgyptianpost W/cr_media: Requires BLUETOOTH permission
02-12 23:15:51.774 2259-2259/com.wEgyptianpost I/cr_DRP: No DRP key due to exception:java.lang.ClassNotFoundException: com.android.webview.chromium.Drp
02-12 23:15:52.121 2259-2259/com.wEgyptianpost D/cr_Ime: [InputMethodManagerWrapper.java:30] Constructor
02-12 23:15:52.141 2259-2259/com.wEgyptianpost W/cr_AwContents: onDetachedFromWindow called when already detached. Ignoring
02-12 23:15:52.142 2259-2259/com.wEgyptianpost D/cr_Ime: [InputMethodManagerWrapper.java:59] isActive: false
02-12 23:15:52.145 2259-2259/com.wEgyptianpost D/AndroidRuntime: Shutting down VM
--------- beginning of crash
02-12 23:15:52.145 2259-2259/com.wEgyptianpost E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.wEgyptianpost, PID: 2259
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.wEgyptianpost/com.wEgyptianpost.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.ads.AdView.loadAd(com.google.android.gms.ads.AdRequest)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.ads.AdView.loadAd(com.google.android.gms.ads.AdRequest)' on a null object reference
at com.wEgyptianpost.MainActivity.onCreate(MainActivity.java:37)
at android.app.Activity.performCreate(Activity.java:6664)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
02-12 23:16:15.750 2259-2266/com.wEgyptianpost W/art: Suspending all threads took: 9.671ms
02-12 23:17:19.554 2259-2266/com.wEgyptianpost W/art: Suspending all threads took: 13.155ms
02-12 23:17:29.780 2259-2266/com.wEgyptianpost W/art: Suspending all threads took: 18.873ms
02-12 23:17:29.790 2259-2266/com.wEgyptianpost W/art: Suspending all threads took: 8.352ms
。
Here是一个很好的将O符号作为Veen-Diagram的图片。
答案 1 :(得分:1)
在数学上精确,大O,大欧米茄等都是集合,而不是函数。所以,当我们说T(n)= O(n ^ 3)时,我们的确意味着T(n)在集合O(n ^ 3)中。但是因为在集合中排版&#34;并不容易。我们通常最后写的是T(n)= O(n ^ 3)。因此,它会引起一些混乱,但基本上O(n ^ 3)只是不会比n ^ 3增长得快的函数集。当然,给定的T(n)不会比n ^ 3增长得快,所以T(n)在集合O(n ^ 3)中。
类似地,T(n)在集合O(n ^ 4),O(n ^ 5),O(n ^ 3 log n),O(n ^ 127),O(n ^ n ^ n)等。
所以,如果你在问题中有第五个选项:T(n)= O(n ^ 2),那也是如此。
答案 2 :(得分:1)
首先,我建议不要将asympotic界限视为计算机科学的一部分;这是一个数学工具。不要将“大O”严格与“最坏情况”等联系起来。 Big O给出渐近上界。而已。在计算机科学中描述算法的最坏情况运行时间恰好是有用的,但它是数学,而不是描述其工作原理的计算机科学。
但这只是我的意见,请注意。
将此定义用于Big O表示法。 (这是我首先学到的正式定义。)
来自Introduction to Algorithms 3rd Edition(我还在通过那本书学习算法),第47页:
对于给定函数g(n),我们用O(g(n))表示该集合 功能
O(g(n))= {f(n):存在正常数c和n 0 所有n≥n 0 }的0≤f(n)≤cg(n)。
观察Big O表示法表示集,因此,它可以是超集的一部分,它可以是其他子集的超集。写“n = O(n)”只是一种形式上不正确的说法,即函数f(n)= n是集合O(n)(n∈O(n))的成员。
滥用Big O表示法(即,将其置于方程式中)就像这样,我们可以在方程中使用它并写出像T(n)= 1 / 2n + O(n)这样的东西,这基本上意味着T(n)等于1 / 2n加上某个函数,其中上面给出的Big O表示法的定义成立。
所以,你想知道为什么像n 2 = O(n 3 )?让我们通过我们的正式定义来展示:
g(n)= n 3
f(n)= n 2
0≤n 2 ≤cn 3
直观地,我们可以很容易地看到必须有一些c和n 0 (实际上,c≥1且n 0 = 0)这个不等式是真的因为一个三次函数的渐近速度比一个二次函数渐渐快。
对g(n)= n 2 做同样的事情,你会看到n 2 = O(n 2 )as (对于c≥1且n 0 = 0)。
所以,n 2 = O(n 3 )和 n 2 = O(n 2 )?这是可能的,因为O(n 3 )和O(n 2 )不是不相交的; O(n 2 )是O的一个子集(n 3 ),因为每个二次函数都可以通过三次函数从上面限定。
如你所见,渐近界限不需要紧; n = O(n 65536 ) true 。但是,紧张的界限显然是首选。
答案 3 :(得分:0)
如果你可以证明它是O(n^2)
(为了证明它Big Theta(n^2)
你必须这样做。不要仅仅通过&#34做到这一点;看着它&#34;,做数学。),然后在证明中用n^2
替换所有出现的n^3
。
它仍然是正确的吗?
请记住,Big-oh是一个上限。
答案 4 :(得分:0)
T(n) = O(n^2) <=>
存在常量c > 0, n0 >= 0
s.t.所有T(n) <= c.n^2
都是n >= n0
。
现在,c.n^2 <= c.n^3
代表所有n > 1
(身份)
=> T(n) <= c.n^2 <= c.n^3
的 n >= n1 = max(n0, 1)
=>
存在常量c > 0, n1 = max(n0, 1)
,s.t。 T(n) <= c.n^3
=> T(n) = O(n^3)
事实上,我们可以针对所有T(n)=O(n^2) => T(n)=O(n^k)
显示n>=2
(例如使用归纳法)。