如何部分初始化数组

本文关键字:数组 初始化 何部 | 更新日期: 2023-09-27 18:14:42

我正在为速度优化一个方法来计算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)之间,所以我想我可以通过递归计算数字并将结果存储在字典/数组中来换取运行速度的内存。因为三角形数将在最终解中依次计算,所以它应该是有效的。

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

使用Dictionary计算从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}添加到Dictionary中,这样我就不必总是在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];
}

谢谢你的帮助!:)

如何部分初始化数组

我不知道它是否适合欧拉问题,但一般来说,如果我想做更多的工作,而不是一个简单的表达式初始化,我这样做:

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;
}
顺便说一下,

你真的确定把它作为一个静态变量是合适的吗?