java在给出这个时间表的情况下,我如何判断时间复杂度?
我有一个问题要问你们大家
我有一个时间表,我试图计算出每个函数的时间复杂度。 此表的可能选项有O(n)、O(1)、O(n^2)、O(n lgn)
我说得对吗
a=O(n^2),不知道如何激发这个。但它似乎并没有像c那个样激烈的时刻,我怀疑那个时一定是O(lg n lg)强>
b=O(n),似乎有一个均匀的模式,每n=100,它随30ms增加。
c=O(lg n lg),不确定如何激发这一点强>
d=O(1),无论n是什么,都需要相同的时间强>
通过查看此时间表,我如何确定它的时间复杂度? 谢谢
# 1 楼答案
它有助于理解
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打印^{} 的图形
如果形状匹配,瞧。你有你的答案
我给你一个提示:你似乎认为四个选项中最糟糕的一个是
O(n ln n)
。也许你应该研究一下y=x^2和y=x*ln(x)的图形# 2 楼答案
在excel中输入表格,绘制图表,并将其与此表进行比较
a看起来像O(n lgn),b是O(n),co(n^2)
# 3 楼答案
我认为(c)应该是O(n^2),因为从n=1000到500,这个值乘以4。这与O(n^2)增加相匹配。然而,对于(a),n=1000是n=500的两倍多一点。这表明(a)是O(nlgn)