【问题标题】:Divide and conquer sum of array iterative数组迭代的分治和
【发布时间】:2022-01-01 21:05:58
【问题描述】:

是否可以使用分治法获得数组的总和?我试过了,但我总是漏掉一些数字,或者我计算了两次。

int[] arr = new int[]{1,2,3,4,5};

    public int sum(int[] arr) {
        int begin = 0;
        int end = array.length - 1;
        int counter = 0;

        while (begin <= end) {
            int mid = (begin + end) / 2;
            counter += arr[end] + arr[mid];
            end = mid - 1;
        }
        return counter;
    }

【问题讨论】:

    标签: java arrays sum divide-and-conquer


    【解决方案1】:

    当然,可以对数组的和进行分而治之的计算。但我看不到它的用例?您仍在计算至少相同数量的总和,如果 array 的总和大于 Integer.MAX_VALUE,您仍然会遇到问题,...

    也没有像 Codor 在他的 answer 中对相关问题所显示的性能优势。

    从 Java 8 开始,您可以使用流在 1 行中计算总和。

    int sum = Arrays.stream(array).sum();
    

    您上面的代码的主要缺陷是您只总结了索引mid(2) 和end(4)。之后跳到小括号(索引mid = 0end = 2)。所以你缺少索引 3。这个问题在更大的数组中会变得更加普遍,因为在 while 的第一次迭代之后你会跳过更多的索引。

    通过 Google 快速搜索,this nice-looking talk 出现了关于使用称为 递归 的机制的一般分治法原则。也许它可以指导您找到可行的解决方案。

    【讨论】:

    • 它正在工作,我只是没有正确编写它。我应该尝试分而治之。
    • 我认为这是一个学术问题。您的代码目前无法完成该任务,因为您只添加了第一个 DnC 间隔 (counter=arr[end] + arr[mid]) 的 2 个向外元素。尝试更好地调试您的代码,或者至少使用 System.out 来帮助您——我建议在我之前提到的行之后类似于 System.out.println(String.format("begin=%d; mid=%d; end=%d; counter=%d", begin, mid, end, counter)); 的行。然后你可以看到你的indeices和counter值的变化。
    • @Der_Reperator 谢谢,我会试试的。
    • 我已经用递归完成了,但我认为有迭代方式和递归方式会很好。
    猜你喜欢
    • 2013-02-20
    • 2017-04-07
    • 2014-12-08
    • 2014-04-28
    • 2020-08-10
    • 2013-11-25
    • 2012-10-28
    • 2017-06-07
    • 2015-05-29
    相关资源
    最近更新 更多