哪种控制结构所需的时间复杂度更低?

Which of the control structure take less time complexity?

本文关键字:时间复杂度 控制结构      更新时间:2023-10-16

在编程中,我们使用许多控制结构进行迭代。那么,哪一个是迭代时间复杂度的最佳方式呢?

int a[500],n=10;
for(int i=0;i<=n;i++)
{
cin>>a[i]
}

如何更改此迭代以降低复杂性?

哪一个是用于迭代的最佳方式:

  1. 做而

forwhiledo 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 循环的一个好处是,您可以声明仅存在于循环范围内的变量,也可以用于循环条件。

这将从i=0迭代到i=10,因此总共11次迭代。任何基本循环的时间复杂度为 O(N)。

上述所有选项(for-loop,while-loop,do-while-loop)都具有相同的时间复杂度。

与往常一样,您应该使用缓存技术来实现此类目的。因为如果你有兴趣,forwhile关键字实际上在几乎相同的指令中做同样的事情(两者都在jmp指令中表示)。同样,银弹不存在。根据程序的性质,优化循环的唯一方法是使用缓存或并行化(如果它可以满足 yoyr 目标)。也许有常量值只创建一次并使用多次?如果可能,则缓存结果。这可以将时间减少到"恒定"。或者以并行方式进行。但我认为这不是正确的方法,编译器会为你做很多事情。更好地专注于程序的体系结构

使用forwhiledo-whilefor-each等可以被认为是句法糖的一个经典例子。它们只是做同样事情的方法,但在某些情况下,某些控制结构可能比其他结构"更甜蜜"。例如,如果你想继续迭代 iff(如果和只是如果)布尔值保持true(例如使用迭代器),while看起来比for好得多(嗯,这是一个主观评论),但复杂性是相同的。

while (iter.next()) {
// Do something
}
for (;iter.next();) {
// Do something
}

就时间复杂度而言,它们正在迭代相同数量的元素,在您的示例中 N=10 因此是 O(N)。你怎样才能让它变得更好?这取决于,如果你必须遍历整个数组,大O的最佳情况将始终是O(N)。现在就~N而言,该语句并不总是true。例如,如果你只迭代有 2 个起点的数组的一半,一个在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 就是一种成就!在最后一种情况下,我想说的是,如果你想提高代码的复杂性,你需要开始检查更好的数据结构和算法(这只是一个简单的愚蠢的例子,在多种情况下都有漂亮的算法和数据结构)。只要记住:forwhile都不是大公关!