【问题标题】:can anyone tell me what is the time complexity of the below c++ function谁能告诉我以下 c++ 函数的时间复杂度是多少
【发布时间】:2021-03-09 01:16:37
【问题描述】:
void swapminmax(int a[],int size){ //uses half the no of iteration to find min- max
int min,max= a[0];
int i;

for(i=0;i<=(size/2);i++){
    if(a[i]>a[size-i-1]){
        if(max < a[i]) max= a[i];
    }
    if (a[size-i-1]>a[1]) {
            if(max<a[size-i-1]) max = a[size-i-1];
        }
    if(a[i]<a[size-i-1]){
        if(min > a[i]) min = a[i];
    }
    else{
        if(min >a[size-i-1]) min = a[size-i-1];
    }
    }

    cout<<"min element: "<<min<<endl;
    cout<<"max element : "<<max<<endl;
}

【问题讨论】:

  • 一种可能的猜测方法是拥有一些正在工作的minimal reproducible example,并对其进行分析。如果您在 Linux 上编写代码,请使用 gcc -Wall -Wextra -O -g 编译您的 minimal reproducible example,然后查看 time(7)。运行各种示例,对它们进行基准测试,使用GNUplot 绘制时间并尝试猜测时间复杂度。请注意,StackOverflow不是做我的家庭作业网站
  • 复杂度受循环迭代次数和每次迭代比较次数的影响。除非您接受计算错误的非零概率,否则无论外部循环执行多少次迭代,都至少需要进行 size 比较。

标签: c++ dsa


【解决方案1】:

时间复杂度为 O(N/2),但与 0(N)/2 相同,与 O(N) 相同。

您希望我们为您做的作业;) 试图让您理解对于时间复杂度 k O(N) = O(N) 无论 k 的值(常数项)是多少。这个想法是考虑当 N 变得非常非常非常大时会发生什么 - 那么这个常数 k(称为加速因子)是大是小并不重要,重要的是 函数 N.

试试这个练习。为 0 到 200 之间的 N 绘制 0.1 * N 的值。现在为 0 到 100 之间的 N 绘制 10 * log (N) 的值。起初 0.1 * N 较小,因为常数很小,而 10 * log( N) 大 100 倍。随着 N 变大,尽管最重要的是曲线的形状而不是常数因素。在 N = 100 时,O(N) 算法超过了 O(log N) 算法。

课程 - 无论您如何修改代码以通过减少常数项来使其“高效”,例如用汇编而不是脚本语言编写,算法及其时间复杂度函数总是会胜出最终

【讨论】:

    【解决方案2】:

    O(N),N=size,因此它与数组的大小成线性关系(在查看运行时复杂度时会忽略 const 因素)。您的循环条件仅取决于 i 和 size 并且它们都没有在循环主体中被修改。根据大小,循环体内部没有复杂的操作。

    【讨论】:

      猜你喜欢
      • 2021-04-12
      • 1970-01-01
      • 2015-12-01
      • 2022-11-22
      • 1970-01-01
      • 2016-05-21
      • 2018-11-02
      相关资源
      最近更新 更多