在编程中,我们使用许多控制结构进行迭代。那么哪一个是关于时间复杂度迭代的最好方法呢?
job
如何更改此迭代可以降低复杂度?
哪一种是用于迭代的最佳方式:
答案 0 :(得分:2)
for
,while
和do while
(以及goto
)实际上是一回事。无论您使用其中一个循环创建什么循环,您始终可以创建一个与所有其他循环具有相同时间复杂度的等效循环。 (几乎是真的。唯一的例外是do-while循环必须至少运行一次。)
例如,你的循环
for(int i=0;i<=n;i++) {
...
}
对应
int i=0;
while(i<=n) {
...
i++;
}
和
int i=0;
START:
...
i++;
if(i<=n)
goto START;
你也可以做一个等同的做法,但它确实没有意义。
您应该选择哪一个更多的是设计而非性能。一般来说:
for
- 当你知道循环开始前的迭代次数while
- 当您不知道do-while
- 当你不知道,但至少一次goto
- 从不(存在一些例外)for循环的好处是你可以声明仅存在于循环范围内的变量,也可以用于循环条件。
答案 1 :(得分:1)
这将从i=0
迭代到i=10
,总共11次迭代。任何基本循环的时间复杂度为O(N)。
上面提到的所有选项(for-loop,while-loop,do-while-loop)具有相同的时间复杂度。
答案 2 :(得分:1)
与往常一样,您应该将缓存技术用于此类目的。因为如果您感兴趣,while
,return [
'id' => 'api',
'basePath' => dirname(__DIR__),
//....
'components' => [
//..
'user' => [
//....
]
],
];
关键字实际上在几乎相同的指令中执行相同的操作(两者都在jmp指令中表示)。同样,银弹不存在。根据程序的性质,优化循环的唯一方法是使用缓存或并行化,如果它适合yoyr目标。也许只有一次创建且使用多次的常量值?然后在可能的情况下缓存结果。这可以减少“常量”的时间。或者以平行方式进行。但我认为这不是正确的方式,编译器会为你做很多事情。更好地专注于您的程序架构
答案 3 :(得分:0)
使用for
,while
,do-while
,for-each
等可以视为syntactic sugar的典型示例。它们只是做同样事情的方法,但在某些情况下,某些控制结构可能比其他控制结构“更甜”。例如,如果你想继续迭代iff(if和just if)布尔值保持true
(例如使用Iterator),while
看起来比for
好一点(好)这是一个主观评论),但复杂性将是相同的。
while (iter.next()) {
// Do something
}
for (;iter.next();) {
// Do something
}
就时间复杂度而言,他们迭代相同数量的元素,在你的例子中N = 10因此O(N)。你怎么能让它变得更好?这取决于,如果您必须遍历整个数组,Big O最佳情况将始终为O(N)。现在就~N而言,该陈述并不总是true
。例如,如果您只迭代一半有两个起始点的数组,一个在i=0
,另一个在i=n-1
,则可以实现时间复杂度~N / 2
for(int i=0;i<n/2;i++)
{
int x = a[i];
int y = a[n-i-1];
// Do something with those values
}
对于大O是相同的复杂性,假设~N / 2 - > O(N)但是如果你有一组10k的记录,那么读5k就是一个成就!在最后一种情况下,我想说的是,如果你想提高你的代码复杂性,你需要开始检查更好的数据结构和算法(这只是一个简单的愚蠢的例子,有多种情况的漂亮的算法和数据结构)。请记住:for
或while
不是最重要的问题!