是否有可能在O(n)时间内得到所有连续子阵列的总和?

时间:2016-10-28 18:46:52

标签: algorithm data-structures time-complexity

作为我要解决的更大问题的一部分,我很好奇是否可能 线性时间 来自< / p>

using System.Reflection;
using Microsoft.CodeDom.Providers.DotNetCompilerPlatform;

static Lazy<CSharpCodeProvider> CodeProvider { get; } = new Lazy<CSharpCodeProvider>(() => {
    var csc = new CSharpCodeProvider();
    var settings = csc
        .GetType()
        .GetField("_compilerSettings", BindingFlags.Instance | BindingFlags.NonPublic)
        .GetValue(csc);

    var path = settings
        .GetType()
        .GetField("_compilerFullPath", BindingFlags.Instance | BindingFlags.NonPublic);

    path.SetValue(settings, ((string)path.GetValue(settings)).Replace(@"bin\roslyn\", @"roslyn\"));

    return csc;
});

生成映射

{a_0, a_1, ..., a_n-1}

e.g。

f(i,j): sum of elements over range [i,j) for all i,j in {0, 1, ..., n - 1}

1 个答案:

答案 0 :(得分:5)

虽然您无法在线性时间内生成O(n 2 )数据量,但您可以在线性时间内构建数据结构,以便在O中计算每个f(x,y) (1)。

为此,您需要构建一个数组s,使得s i 表示从{0到{{1}的a之和},包括两端。

您可以通过设置i然后为每个s[0] = a[0]设置s[i] = s[i-1] + a[i]来构建一个部分和数组。

拥有一个部分和数组可以让你计算

i