【问题标题】:what should be the time complexity for the following function?以下函数的时间复杂度应该是多少?
【发布时间】:2015-12-01 23:38:45
【问题描述】:

这两个函数的时间复杂度一样吗??

void fun1()
{
    for(int i=0;i<n;i++)
    {    
        if(i%2==0)c++;
        if(i%3==0)c++;
    }
}

其他功能是-

void fun2()
{
    for(int i=0;i<n;i++)
    {    
        if(i%2==0)c++;

    }
    for(int i=0;i<n;i++)
    {    
        if(i%3==0)c++;
    }
}

我猜 fun1 的时间复杂度是 O(n),而 fun2 的时间复杂度是 O(2n) 对吗?

【问题讨论】:

  • 是的,你是对的,但在这里提出这样的要求并不受欢迎。这个问题不太可能对未来的研究有所帮助。
  • O(2n) 和 O(n) 是同一个集合,所以都是 O(n)。

标签: c++ c time complexity-theory


【解决方案1】:

你对第一个是正确的。这将需要 n 次操作 - O(n)。对于第二个,它将需要 2 * n 次操作。在大 O 表示法中,系数被忽略,我们再次得到 O(n)。

【讨论】:

    【解决方案2】:

    只要测试一下,你就会发现第一个函数比第二个函数快一点。但是速度有时会有所不同。这是因为计算机需要再次构建“int = 0”并将其提升到“n”并进行“n”检查。 这段代码比较慢:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int n=10;
        for(int i=0;i<n;i++)
        {
            if(i%2==0)cout<<"i%2"<<endl;
        }
        for(int i=0;i<n;i++)
        {
            if(i%3==0)cout<<"i%3"<<endl;
        }
    
    }
    

    而且这样更快:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int n=10;
        for(int i=0;i<n;i++)
        {
            if(i%2==0)cout<<"i%2"<<endl;
            if(i%3==0)cout<<"i%3"<<endl;
        }
    }
    

    【讨论】:

    • 时间复杂度是一样的。这不是测量的问题,而是数学计算的问题。
    • −1 在这种情况下,如果不说明编译器、版本、完整构建命令、运行它的系统的详细信息,则“更快”和“更慢”区域毫无意义。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2021-11-17
    • 2020-07-30
    • 2014-01-14
    相关资源
    最近更新 更多