繁体   English   中英

如何使该算法更有效?

[英]How can I make this Algorithm more efficient?

我有一个算法可以生成一个包含所有可能值之和的2D数组。 例如,对于数组[1,5,8,4,5] ,二维数组sums[1][3]应该返回原始数组(17)中索引1-3的总和。 我相信就大O而言,效率为O(N 2 )。 有什么办法可以使该算法更有效?

public static int[][] sum(int[] values){
    int[][] sums = new int[values.length][values.length];
    for(int x = 0; x < values.length; x++){
        int total = 0;
        for(int y = x; y < values.length; y++) {
            total += values[y];
            sums[x][y] = total;
        }
    }
    return sums;
}

您可以使用前缀和数组在O(n)时空中解决此问题:

array    = [1, 5, 8, 4, 5]
prefixes = [1, 6,14,18,23]

sums(1,3) = prefixes[3] - prefixes[0] = 18 - 1 = 17

通过以下方式计算prefix和:

public static int[] sum(int[] values){
    int[] prefix_sums = new int[values.length];
    prefix_sums[0] = values[0];
    for(int x = 1; x < values.length; x++){
        prefix_sums[x] = prefix_sums[x-1] + values[x];
    }
    return prefix_sums;
}

根据您的查询,您要查找从索引x到索引y的总和(基于0的索引),这是获取总和的方法:

if(x==0)
    result = prefix_sums[y];
else
    result = prefix_sums[y] - prefix_sums[x-1];

希望能帮助到你!!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM