gpt4 book ai didi

Java : Testing Array Sum Algorithm Efficiency

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:43:31 25 4
gpt4 key购买 nike

我在大学学习 Java 类(class),我的笔记提供了 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

现在,从上面的输出来看,递归数组拆分算法的步数最多,但根据我的笔记,它与迭代算法一样高效。那么我的代码或我的笔记哪个不正确?

最佳答案

你只是想看看执行速度吗?如果是这样,您将需要查看微基准测试: How do I write a correct micro-benchmark in Java?

本质上,由于 JVM 和现代处理器的工作方式,您无法通过在 FOR 循环中运行一百万次并使用系统计时器 (EDIT) 测量执行速度来获得一致的结果。

也就是说,“效率”还可以指其他方面,例如内存消耗。例如,任何递归方法都有堆栈溢出的风险,这个站点就是以这个问题命名的:)尝试给 ArrayList 数万个元素,看看会发生什么。

关于Java : Testing Array Sum Algorithm Efficiency,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37233061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com