// -- Algorithm A
int a = 1, b = 2;
for (int n = 0; n < 100; n++)
{
int c = a + b + n;
int d = a - b - n;
}
// -- Algorithm B
int a = 1, b = 2;
for (int n = 0; n < 100; n++)
{
int c = a + b + n;
}
for (int n = 0; n < 100; n++)
{
int d = a - b - n;
}
我应该尝试使用现有的循环来进行必要的操作吗?或者最终结果是一样的?
答案 0 :(得分:1)
在O(n)表示法中,它们将是相同的。根据{{3}}:
你们将会有一个 Sum :
O(n) + O(n) = O(2n)
然后乘以常数:
O(2n) = O(n)
所以最后它将是O(n)
答案 1 :(得分:1)
复杂性,两种算法都是O(n)。即使考虑乘法常数,也可以说一个是n * 2而另一个是n + n,这是完全相同的。
但实际上,这取决于。有人可能会争辩说,由于第二个分支执行的分支数量是原来的两倍,性能可能会更差(see this famous question),但最终还是取决于编译器,特定输入,操作系统等。
答案 2 :(得分:1)
在您当前的实施中
int a = 1, b = 2;
for (int n = 0; n < 100; n++)
{
int c = a + b + n;
int d = a - b - n;
}
您无所事事:c
和d
都是本地视觉效果,存在
仅在for
循环范围内;如果优化器足够智能来找出它
整数溢出(1 + 2 + 100
和1 - 2 - 100
都不可能
[int.MinValue..int.MaxValue]
for (int n = 0; n < N; n++)
{
f(n);
g(n);
}
可以在 for (int n = 0; n < N; n++)
f(n);
for (int n = 0; n < N; n++)
g(n);
之内
通过警告消除整个循环给开发人员。
真实世界的例子是
f(n)
Versus
g(n)
N
和 T = f(0) + g(0) +
f(1) + g(1) +
...
f(N - 2) + g(N - 2) +
f(N - 1) + g(N - 1)
都没有副作用,T = f(0) + f(1) + ... f(N - 2) + f(N - 1) +
g(0) + g(1) + ... g(N - 2) + g(N - 1)
足够大。
到目前为止一切顺利,在第一种情况下,执行时间是
O(...)
在第二种情况下
{{1}}
如您所见,执行时间是相同(不仅仅是{{1}})。 在现实生活中,两个实现之间可能存在微小差异: 循环初始化和实现细节,CPU寄存器利用率等。
答案 3 :(得分:0)
绝对第一个算法会更快,但由于复杂性只是线性增加,第二个算法也不错。至于你不是二次方都是好的,
但是如果你最终编写了这样的循环,那么你就有n ^ 2的复杂性,这是不好的