我正在学习算法和数据结构,现在我正处理时间和空间的复杂性。
我必须解决一个问题,并告诉我(基于我的代码)时间和空间复杂性。
这是代码:
public class B {
public static int minSum = -1;
public static void main(String[] args) {
int objects, sumA = 0, sumB = 0;
Scanner readInput = new Scanner(System.in);
objects = readInput.nextInt();
int[] trunk = new int[objects];
if (objects == 0) {
System.out.print(0 + "\n");
} else if (objects == 1) {
trunk[0] = readInput.nextInt();
System.out.print(trunk[0] + "\n");
} else {
for (int i = 0; i < objects; i++) {
trunk[i] = readInput.nextInt();
}
bruteforce(trunk, sumA, sumB, 0);
System.out.println(minSum);
}
}
public static void bruteforce(int[] trunk, int sumA, int sumB, int index) {
int partialDiff;
if (minSum == 0) {
System.out.println(minSum);
System.exit(0);
} else if (index == trunk.length) {
partialDiff = Math.abs(sumA - sumB);
if (partialDiff < minSum || minSum == -1) {
minSum = partialDiff;
}
} else {
bruteforce(trunk, sumA + trunk[index], sumB, index + 1);
bruteforce(trunk, sumA, sumB + trunk[index], index + 1);
}
}
}
基本上,用户首先输入多个对象,然后为每个对象输入其值。该算法将通过两个袋子分配对象,并且必须计算在通过两个袋子分配对象时可以计算的最小差异。
我认为这需要指数时间,但我正在努力对空间复杂性进行估算。你能指点我吗?
答案 0 :(得分:2)
空间复杂度是线性的 - O(n)
。
您可以通过将每个函数调用中使用的内存量乘以最大递归深度来计算。
每个函数调用都使用了一定量的内存 - 只有partialDiff
和堆栈信息。
要确定最大递归深度,您基本上只需查看index
(因为这是决定何时停止递归更深的变量)。
index
= 0。index
都会增加一个。index
达到数组的大小,就会停止。请注意,函数调用是深度优先的,这意味着它将在第二次调用之前完全评估对bruteforce
的第一次调用,因此一次只有一次会占用内存。
因此,对于长度为2的数组,它是这样的:(Call 1
是第一个函数调用,Call 2
是第二个函数
Call with index 0
Call 1 with index 1
Call 1 with index 2
Call 2 with index 2
Call 2 with index 1
Call 1 with index 2
Call 2 with index 2
因此,最大深度(以及空间复杂度)是3,比数组中的项目数多一个。
所以memory used in each function call * max depth = constant * linear = linear
。