内循环与调用函数之间的时间复杂性差异

时间:2017-07-07 14:00:43

标签: time-complexity

这是一个关于算法复杂性的问题。如果我正在创建一个循环(例如' for'循环)并且想在此循环中测试返回的值的原始性(在某些操作之后肯定),因此,我运行一个内循环。而不是那样,如果我创建一个函数来测试素数然后在第一个循环中调用该函数,那么时间复杂度是否仍然相同? 这两种情况的复杂性是什么?怎么计算?

谢谢

1 个答案:

答案 0 :(得分:0)

代码的复杂性是根据空间和时间来衡量的。让我们试着了解时间复杂性。

让我们看一种测量时间Complexcity的方法,它最着名,叫做Big O notqtion。根据维基百科" Big O表示法是一种数学符号,用于描述当参数趋向特定值或无穷大时函数的限制行为。 "

假设有一个操作(可以由几行代码执行),其单次执行需要T个单位时间。时间复杂度是输入值数量的函数,表示为这些输入项执行操作所花费的时间。

  1. 如果所花费的时间总是T而与输入的数量无关,那么它被称为常数函数,并且时间复杂度被称为 O(1)
  2. 如果所花费的时间相对于输入的数量线性增加那么它就是线性函数amd time complexcity是O(N)
  3. 让我们看一个简单的例子

    public int sumOfFirstNNumbersWayOne( int n ){              
        int sum = 0;
         for (int i = 1; i <= n; i++){
               sum += i; // this loops executes as per the number n
         }
         return sum;
    }
    
    
      public int sumOfFirstNNumbersWayTwo( int n ){ 
           int sum = n*(n+1)/2; // the number of times this operation is executed is independent of the input n
          return sum;
     }
    

    sumOfFirstNNumbersWayOne的时间复杂性是O(n)和 sumOfFirstNNumbersWayTwo是O(1)。

    在测量时间复杂度时,是否在循环或方法中执行操作os无关紧要。 (方法调用的开销,方法调用和堆栈中的条目,可以忽略不计)

     public int sumOfFirstNNumbersWayThree( int n ){ 
         int sum = 0;
         for (int i = 1; i <= n; i++){
               sum = sum( sum, i);
         }
         return sum;
     }
    
    public int sum(int a , int b){ 
         return a+b;
    }
    

    sumOfFirstNNumbersWayThree的时间强制性仍为O(n)。

    类似地假设一组特定操作的次数随着输入数量的增加而呈指数增加,那么时间复杂度被称为指数

    其他着名的时间复杂引用是O(log(n)), O(n^2), O(nlog(n)), O(n!),[n是引用,它可以是我们想要测量时间复杂度的输入数,它可以是输入数组的大小,输入数字的位数,输入数字的位数,输入字符串的长度,文件中的行数等等。