繁体   English   中英

如何部分初始化数组?

[英]How to partially initialize an array?

我正在努力优化速度,以计​​算ProjectEuler-问题12的三角数的方法。

我需要以某种方式能够初始化数组中的第一个元素:

private static ulong[] numbersArray = new ulong[5000];

一种计算三角数的方法是:

public static ulong GetTriangleFormula(ulong n)
{
    return n * (n + 1) / 2;
}

但是它的计算复杂度介于O(n)和O(n ^ 2)之间,因此我想我可以通过递归计算数字并将结果存储在Dictionary / array中来以内存换取运行速度。 由于三角数将在最终解决方案中连续计算,因此它应该起作用。

计算第n个三角数应成为numbersArray [n-2]和n的简单总和。

使用字典,对于从1到1000的连续三角形数计算,计算要慢得多:

private static Dictionary<ulong, ulong> numbers = new Dictionary<ulong, ulong>() { { 1, 1 } };
public static ulong GetTriangleDictionaryRecursive(ulong n)
{
    if (!numbers.ContainsKey(n))
        numbers[n] = n + GetTriangleDictionaryRecursive(n - 1);
    return numbers[n];
}

我在字典中添加了{1,1},这样我就不必总是在基本情况的GetTriangleDictionaryRecursive方法的开头进行检查:

if(n == 1) return 1;

但是结果是它比公式方法慢了大约40倍。

因此,现在我尝试使用ulong []类型的数组编写一个方法,但我不知道如何仅初始化值为1的第一个元素(其他元素默认为ulong 0)。

public static ulong GetTriangleArrayRecursive(ulong n)
{
    if (numbersArray[n - 1] == 0)
        numbersArray[n - 1] = n + GetTriangleArrayRecursive(n - 1);
    return numbersArray[n - 1];
}

谢谢你的帮助! :)

我不知道它是否适合于Euler问题,但是总的来说,如果我想做的工作比一个简单的初始化表达式要多,我可以这样做:

private static readonly ulong[] numbersArray = CreateNumbersArray();

private static ulong[] CreateNumbersArray()
{
    ulong[] ret = new ulong[5000];
    ret[0] = 1;
    return ret;
}

或者,您可以在静态构造函数中执行此操作:

private static readonly ulong[] numbersArray;

static FooClass()
{
    numbersArray = new ulong[5000];
    numbersArray[0] = 1;
}

顺便说一句,您真的确定将其设为静态变量是否合适?

暂无
暂无

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

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