给定这个时间表,我如何判断时间复杂性?

fzwojiic  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(357)

我有个问题要问你们。
我有一个时间表,我试图找出每个函数的时间复杂度。此表的可能选项有o(n)、o(1)、o(n^2)、o(n lg n)。

我说得对吗,
a=o(n^2),不知道如何激励这个。但它似乎没有像c这样剧烈的时刻,我怀疑它一定是o(lgn lg)。
b=o(n),似乎有一个均匀的模式,每n=100,它就增加30毫秒。
c=o(lg n lg),不知道如何激励这个。
d=o(1),无论n是多少,都需要相同的时间。
我怎么能只看这个时间表就知道它的时间复杂度呢?谢谢。

yxyvkwin

yxyvkwin1#

这有助于理解 O(n) 实际上是指。要使其可视化,请制作一个简单的折线图。把n放在x轴上,不管n是什么,然后把你测量的复杂度放在y轴上。目标通常是“时间复杂度”,因此,cpu计算给定“n”值的输入集所需的时间。
如果你真的做了这个实验,对于低n来说,图表只是一个杂乱无章的任意结果;运气是控制因素,因此,你无法做出正面或反面的判断(在这一次测试中,你的winamp切换歌曲,在这一次测试中,事实上ArrayList开始时的容量为10意味着在11时你会看到一个突然的峰值,等等)。
但是,继续。最终,你不知道这需要多长时间,但是,最终,一个形状开始形成。要么是因为你缩小得足够远(因为你的图非常大,因为它从n=1到n=100000),要么是因为算法的复杂性“占了上风”,是控制因素。
这就是o(n)所衡量的:一旦这个图形看起来稳定了,它的形状会是什么样子?如果你说算法是 O(n log n) ,你的意思是:图的右边看起来很像图的右边 y = x * log(x) .
这也是为什么 O(n^2 + n) 只是不是一件事-如果你要用图表 y = x^2 + x ,它看起来和 y = x^2 一旦你到了右边。如果问题的关键是“形状是什么”,那么一旦你走得足够远,任何对形状没有意义影响的因素都是无关紧要的。
这给了你一个非常强大的工具来回答这样的问题。拿出一支笔。拿出一些纸来。去画这个吧。认真地说,拿出一支笔来做:画一条线,在x轴上画10个记号,突出显示第一、第二、第五和第十个(n=100,n=200,n=500,n=1000)。然后,从~0-500画一个y轴,在x=100,y=33处画一个点。同样在x=200,y=76,等等。尽你所能画出这条“趋势线”。然后拿出你的绘图计算器或者去wolfram alpha打印 y = x * ln(x) .
如果形状匹配,瞧。你有你的答案。
我给你一个提示:你似乎认为这4个选项中最糟糕的是 O(n ln n) . 也许你应该研究一下y=x^2和y=x*ln(x)的图。。。

7y4bm7vi

7y4bm7vi2#

在excel中输入表格,绘制图表并与本表进行比较

a看起来像o(n lg n),b是o(n),co(n^2),

esyap4oy

esyap4oy3#

我认为(c)应该是o(n^2),因为从n=1000到500,这个值乘以4。这与o(n^2)的增加相匹配。然而,对于(a),n=1000是n=500的两倍多一点。这表明(a)是o(nlgn)。

相关问题