【发布时间】:2016-05-14 23:53:42
【问题描述】:
我正在大学学习 Java 课程,我的笔记提供了 3 种计算 ArrayList 总和的方法。第一次使用迭代,第二次使用递归,第三次使用数组拆分结合递归。
我的问题是如何测试这些算法的效率?事实上,我认为算法计算值所需的步骤数是告诉你算法效率的因素。
我的 3 种算法代码:
import java.util.ArrayList;
public class ArraySumTester {
static int steps = 1;
public static void main(String[] args) {
ArrayList<Integer> numList = new ArrayList<Integer>();
numList.add(1);
numList.add(2);
numList.add(3);
numList.add(4);
numList.add(5);
System.out.println("------------------------------------------");
System.out.println("Recursive array sum = " + ArraySum(numList));
System.out.println("------------------------------------------");
steps = 1;
System.out.println("Iterative array sum = " + iterativeSum(numList));
System.out.println("------------------------------------------");
steps = 1;
System.out.println("Array sum using recursive array split : " + sumArraySplit(numList));
}
static int ArraySum(ArrayList<Integer> list) {
return sumHelper(list, 0);
}
static int sumHelper(ArrayList<Integer> list, int start) {
// System.out.println("Start : " + start);
System.out.println("Rescursive step : " + steps++);
if (start >= list.size())
return 0;
else
return list.get(start) + sumHelper(list, start + 1);
}
static int iterativeSum(ArrayList<Integer> list) {
int sum = 0;
for (Integer item : list) {
System.out.println("Iterative step : " + steps++);
sum += item;
}
return sum;
}
static int sumArraySplit(ArrayList<Integer> list) {
int start = 0;
int end = list.size();
int mid = (start + end) / 2;
System.out.println("Rescursive step : " + steps++);
//System.out.println("Start : " + start + ", End : " + end + ", Mid : " + mid);
//System.out.println(list);
if (list.size() <= 1)
return list.get(0);
else
return sumArraySplit(new ArrayList<Integer>(list.subList(0, mid)))
+ sumArraySplit(new ArrayList<Integer>(list.subList(mid,
end)));
}
}
输出:
------------------------------------------
Rescursive step : 1
Rescursive step : 2
Rescursive step : 3
Rescursive step : 4
Rescursive step : 5
Rescursive step : 6
Recursive array sum = 15
------------------------------------------
Iterative step : 1
Iterative step : 2
Iterative step : 3
Iterative step : 4
Iterative step : 5
Iterative array sum = 15
------------------------------------------
Rescursive step : 1
Rescursive step : 2
Rescursive step : 3
Rescursive step : 4
Rescursive step : 5
Rescursive step : 6
Rescursive step : 7
Rescursive step : 8
Rescursive step : 9
Array sum using recursive array split : 15
现在从上面的输出中递归数组拆分算法采取的步骤最多,但是根据我的笔记,它与迭代算法一样有效。那么我的代码和笔记哪个不正确?
【问题讨论】:
-
尝试使用 System.currentTimeMillis() 检查每个执行的时间量
-
更好的是,使用
System.nanoTime() -
主要是打印的内容和时间。仅当您实际将 2 个数字加在一起时,才会有一个步骤。所有这些
if (list.size() <= 1)案例都不是步骤,因为根本没有添加。还有例如迭代版本从添加 0 + 1 开始,这也不是一个步骤(第一个是 1+2)。 -
更简单地看到,你的讲座所说的:全部使用 4 个加法,递归/迭代执行:
(((1 + 2) + 3) + 4) + 5),拆分执行:((1 + 2) + (3 + (4 + 5)))- 因此算法复杂度是相同的,与速度有多快无关算法运行。
标签: java arrays algorithm recursion