时间的复杂度是多少?

时间:2019-07-24 04:32:27

标签: time-complexity

代码:

int main()
{
    for(long long i=0;i<10000000;i++)
    {

    }
    return 0;
}

我之所以这样问是因为我想知道,是否空循环会增加程序的运行时间。例如,假设我们在循环中确实有一个函数,但是由于某些条件,它不会在每个循环中运行:

代码:

int main()
{
    for(long long i=0;i<10000;i++)
    {
        for(long long i=1;i<10000;i++)
        {
              if(//"some condition")
              {
                func(); // some function which we know is going to run only one-hundredth of the time due to the condition. time complexity of func() is O(1).
              }
        }
    }
    return 0;
}

时间复杂度是否为O(N*N)

2 个答案:

答案 0 :(得分:1)

时间复杂度仅在可变大小的数据集的上下文中才有意义;它描述了程序的总执行时间随着数据集大小的增加而增加的速度。。例如,如果您有N个项目要处理,并且您的算法需要读取每个项目固定次数,那么您的算法将被视为O(N)。

在第一种情况下,如果我们假设您有一个“数据集”,其当前大小为10000000,则您的单个for循环将为O(N),但是请注意,由于您的for循环没有任何可见的效果,优化的编译器都可能会完全忽略该循环,从而将其有效地减小为O(1)。

在您的第二个(嵌套循环)示例中(假设变量集大小为10000),算法为O(N ^ 2),因为程序必须执行的步数随平方的平方而增加。设置大小。不管内部if测试多久一次为真,这都是事实,因为程序将不得不执行某些步骤(例如,评估if条件),而不需要N * N次(或者很少) )if-test评估为true。 (同样,例外情况是,编译器可以某种方式证明if语句从不评估为true,或者func()函数没有可观察到的副作用,在这种情况下,它可以合法地省略整个过程,然后立即return 0}

答案 1 :(得分:0)

您的第一个代码的最坏情况复杂度为O(n),因为它会重复n次。不管它在每次迭代中什么都不做或无所事事,它总是具有O(n)的复杂性。可能无法对其进行优化,并且优化程序可能不会跳过空循环。

类似地,您的第二个程序的复杂度为O(n^2),因为它多次迭代n^2。内部的if条件在某些情况下可能会满足,也可能不会满足,并且在if不满足但访问了n^2情况下,程序可能不会执行。足以建立O(n^2)复杂度。