作为我要解决的更大问题的一部分,我很好奇是否可能 线性时间 来自< / 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}
答案 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