[英]Spatial complexity estimative of a recursion function
我正在學習算法和數據結構,現在我正在考慮時間和空間的復雜性。
我必須解決一個問題,他們告訴(根據我的代碼)時間和空間復雜性。
這是代碼:
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);
}
}
}
基本上,用戶首先輸入多個對象,然后為每個對象輸入其值。 該算法將通過兩個袋子分配對象,並且必須計算在通過兩個袋子分配對象時可以計算的最小差異。
我相信它需要指數時間,但我正在努力估計空間復雜性。 你能指點我嗎?
空間復雜度是線性的 - O(n)
。
您可以通過將每個函數調用中使用的內存量乘以最大遞歸深度來計算。
在每個函數調用中都使用了一定量的內存 - 只需要partialDiff
和堆棧信息。
要確定最大遞歸深度,您基本上只需查看index
(因為這是決定何時停止遞歸更深的變量)。
index
= 0調用該函數。 index
增加1。 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
的memory used in each function call * max depth = constant * linear = linear
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.