这是一个关于算法复杂性的问题。如果我正在创建一个循环(例如' for'循环)并且想在此循环中测试返回的值的原始性(在某些操作之后肯定),因此,我运行一个内循环。而不是那样,如果我创建一个函数来测试素数然后在第一个循环中调用该函数,那么时间复杂度是否仍然相同? 这两种情况的复杂性是什么?怎么计算?
谢谢
答案 0 :(得分:0)
代码的复杂性是根据空间和时间来衡量的。让我们试着了解时间复杂性。
让我们看一种测量时间Complexcity的方法,它最着名,叫做Big O notqtion。根据维基百科" Big O表示法是一种数学符号,用于描述当参数趋向特定值或无穷大时函数的限制行为。 "
假设有一个操作(可以由几行代码执行),其单次执行需要T
个单位时间。时间复杂度是输入值数量的函数,表示为这些输入项执行操作所花费的时间。
T
而与输入的数量无关,那么它被称为常数函数,并且时间复杂度被称为 O(1)。 O(N)
让我们看一个简单的例子
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
是引用,它可以是我们想要测量时间复杂度的输入数,它可以是输入数组的大小,输入数字的位数,输入数字的位数,输入字符串的长度,文件中的行数等等。