我试着环顾四周,看看我的答案是否可以得到解答,但我没有发现可以帮助我的事情。
在处理运行时复杂性时,您是否考虑了操作数?根据我对处理运行时的理解,你有每个不同的操作数可以花费x倍的时间,所以只计算循环给你的下限?如果这不正确,请你向我解释我的逻辑错误。
例如:
for (i=0;i<n;i++)
for (j=0;j<n;j++)
a[i,j]=b[i,j]+c[i,j]
只是O(n ^ 2)对吗?或者它是O(a * n ^ 2)因为加法操作数?你运行时使用“O”通常是否正确?
例如:
for (i=0;i<n;i++)
for (j=0;j<n;j++)
a[i,j] -= b[i,j] * c[i,j]
再次是O(n ^ 2)吗?或者它是O(a ^ 2 * n ^ 2),因为减法和乘法操作数??
谢谢Stack!
答案 0 :(得分:0)
我建议您阅读O符号的含义。但是,让我向您简要介绍一下:
当我们说f(x)=O(g(x))
时,我们的意思是对于一些与输入大小无关的常数c,
f(x)<=c.g(x) for all x>=k
换句话说,超过某一点k,曲线f(n)总是在曲线g(n)上方,如图所示。
现在,在您考虑的情况下,加法和减法的运算,乘法都是需要恒定时间(O(1)
)的基本运算。
假设添加两个数字需要'a'时间,并且分配结果需要'b'时间。
所以对于这段代码:
for (i=0;i<n;i++)
for (j=0;j<n;j++)
a[i,j]=b[i,j]+c[i,j]
让我们马虎而忽略赋值和更新的for循环操作。
运行时间T(n)=(a+b)n
2 。
请注意,这只是 O(n 2 ),为什么?
根据定义,这意味着我们可以识别某个点k,超过该点k对于某个常数c,曲线T(n)总是在n 2 之上。
意识到这确实是真的。我们总是可以选择足够大的常数,以便c.n ^ 2曲线始终超出给定曲线。
这就是为什么人们会说:删除常数!
<强>底线:强> f(n)的大O是g(n)意味着,在某条垂直线的右边,曲线f(n)总是以g(n)为界。