Java : Testing Array Sum Algorithm Efficiency

标签 java arrays algorithm recursion

我在大学学习 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/

相关文章:

javascript - 了解 Javascript Codewars 挑战

c++ - 如何在 C++ 中返回一个二维指针数组

javascript - 使用递归函数遍历 JSON 字符串到内部级别

c - 查找数组中 n 个数字的所有可能排列

algorithm - 从 trie 中检索丢失的字符串

java - Java 中的冒泡排序困惑

java - 如何声明我的 LinearLayout 元素?

Java正则表达式不匹配多行字符串

java - 在 hibernate 中映射复合外键

java - Netbeans GUI 编辑器问题