查找以下代码的时间复杂度和大O. 我对if else语句和其他bar(a)和foo(a)函数的时间复杂性感到困惑。有些朋友说它的时间复杂度是O(n ^ 2),有些人说它的时间复杂度是O(n)。我还认为以下代码的时间复杂度将是O(n),因为for循环中有一个return语句,它将使foo和bar的时间函数为O(1),main for循环将运行n时间因此时间复杂度将为O(n)。
//示例代码
public static void main(String args[]){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int sum = 0;
for(int i=0 ; i<n ; ++i){
if(i%2 != 0){
sum += foo(i , n) + foo(1+i , n);
}
else{
sum += foo(i , n) + bar(i , n);
}
}
}
-
static void bar(int a , int n){
for(int i=0 ; i<n ; ++i){
for(int j=0 ; j< i ; ++j){
return a*(i+j);
}
}
}
-
static void foo(int a , int n){
for(int i=0 ; i<n ; ++i){
return a*i;
}
}
答案 0 :(得分:1)
由于您使用迭代范式表达了算法,所以您只需要计算操作次数。
bar
的复杂性为O(n^2)
,因为您有“n * (n + 1) / 2
”类型的add i, j, then multiply by a
次操作。
foo
的复杂性为O(n)
(“n
”类型的multiply by a
次操作。
在主循环中,一半操作会调用foo
两次,这会产生(n / 2) * n
次O(n^2)
次操作。
迭代的后半部分将调用foo
然后调用bar
,这会产生(n / 2) * [n + n * (n + 1) / 2]
,即0.25.n^3 + 0.75.n^2
O(n^3)
。
因此,循环的整体复杂性为O(n^3)
。这通常被称为算法的 time 复杂性(即使我们计算了操作的数量 - 它背后的直觉是考虑一组操作单元并确认每个操作单元将采用恒定的时间。在我们的例子中,我们选择了算术运算+
和*
)。
我们还可以从内存消耗的角度分析您的算法。在您的情况下,无论n
的值是什么,消耗的内存都是常量。这就是为什么我们会说空间复杂度为O(1)
n
。
编辑:我虽然return
和foo
中的“过早”bar
是拼写错误。如果您不循环,那么foo
和bar
的复杂性为O(1)
,您的主循环为O(n)
。
答案 1 :(得分:0)
foo() -> O(n)
因为它来自i = 0 -> n
:
bar() -> O(n^2)
,因为它来自j = 1 + 2 + 3 + ... + n
O(n^2)
,如下所示:
main()
i = 0 -> n
你来自foo(n)
,而你i
的每个偶数值都会foo(n)
两次。你也在呼叫O(n)
,但bar(n)
那不是最坏的情况,所以我们不在乎。
考虑最坏情况public class Statistik {
public static double median7(double a, double b, double c, double d, double e, double f, double g) {
double h;
if (a < b) {
h = a;
a = b;
b = h;
}
if (a < c) {
h = a;
a = c;
c = h;
}
if (a < d) {
h = a;
a = d;
d = h;
}
if (a > e) {
h = a;
a = e;
e = h;
if (a < b) {
h = a;
a = b;
b = h;
}
if (a < c) {
h = a;
a = c;
c = h;
}
if (a < d) {
h = a;
a = d;
d = h;
}
}
if (a > f) {
h = a;
a = f;
f = h;
if (a < b) {
h = a;
a = b;
b = h;
}
if (a < c) {
h = a;
a = c;
c = h;
}
if (a < d) {
h = a;
a = d;
d = h;
}
}
if (a > g) {
h = a;
a = g;
g = h;
if (a < b) {
h = a;
a = b;
b = h;
}
if (a < c) {
h = a;
a = c;
c = h;
}
if (a < d) {
h = a;
a = d;
d = h;
}
}
double median7 = a;
return median7;// TODO
}
,被称为n / 2次(每隔一次从0到n):