【问题标题】:How many times does this function operate?此功能运行多少次?
【发布时间】:2021-06-14 00:55:37
【问题描述】:
int fun_3(int a[], int n){
    int sum = 0;
    for (i=0 ; i<n ;i++){
        for (j=0 ; j<n ; j++){
            for (k=0 ; k<n ; k++){
                if (a[i] > 100)
                    sum += 1;
   return sum;
}

我统计了这段代码最坏情况下的运算次数除以加法运算、比较运算和赋值运算(不考虑运算时间)。

赋值操作:

int sum = 0 -> 1 次操作

for (i=0;;) -> 1 次操作

for (;;i++) -> n 操作

for (j=0;;) -> n 操作

for (;;j++) -> n^2 运算

for (k=0;;) -> n^2 操作

for (;;k++) -> n^3 操作

sum += 1 -> n^3 运算

赋值操作总数 = 2n^3 + 2n^2 + 2n + 2

加法运算:

for(;;i++) -> n 操作

for(;;j++) -> n^2 操作

for(;;k++) -> n^3 操作

sum += 1 -> n^3 运算

总操作数 = 2n^3 + n^2 + n

比较操作:

for(;i n+1

for(;j n(n+1) -> n^2+n

for(;k n^2(n+1) -> n^3+n^2

如果 (a[i] > 100) -> n^3

比较的总操作数 = 2n^3 + 2n^2 + 2n + 1

此代码的操作总数 = 6n^3 + 5n^2 + 5n + 3

但是我大学同事的结果和我的结果不同。我想知道我的计算是对还是错。

【问题讨论】:

  • 问题中是否指定了所有此类操作的成本,还是您做出了假设?
  • 我认为是 O(n^3)
  • 重要的是Big O...您的代码是O(n^3),即:将元素数量加倍使其性能降低8 (2^3) 倍。

标签: c algorithm time-complexity


【解决方案1】:

你应该只假设更大的指数而不是常数。您应该知道如何报告计算机科学中代码的时间复杂度。阅读大 O 符号 Here-Wiki linkHere-GFGlink
首先你应该分配i, j, k

现在你有了类似的东西:

int fun_3(int a[], int n){
    int sum = 0;
    for (int i=0 ; i<n ;i++) {
        for (int j=0 ; j<n ; j++) {
            for (int k=0 ; k<n ; k++) {
                if (a[i] > 100)
                    sum += 1;
   return sum;
}

在最坏的情况下,此代码执行 O(n3) 次操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-04
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多