为什么我的简单缓存不起作用?

时间:2016-10-26 14:38:02

标签: c# .net algorithm data-structures

我写了一大堆代码

private int CountChangeOptions(int[] coins, int j, int N)
{   
    if(j == 0)
        return 0;
    if(N == 0)
        return 1;
    if(j == 1)
        return N % coins[0] == 0 ? 1 : 0;

    int sum = 0;
    int k = coins[j - 1];
    for(int i = N; i >= 0; i -= k)
    {
        sum += CountChangeOptions(coins, j - 1, i);
    }
    return sum;
}

正确评估(虽然不够快)。由于大多数CountChangeOptions(coins, x, y)的{​​{1}}将在算法过程中使用相同的coins多次调用,x我决定实施缓存策略

y

其中private int CountChangeOptions(int[] coins, int j, int N) { if(j == 0) return 0; if(N == 0) return 1; if(j == 1) return N % coins[0] == 0 ? 1 : 0; int sum = 0; int k = coins[j - 1]; for(int i = N; i >= 0; i -= k) { sum += CountOrGetFromCache(coins, j - 1, i); } return sum; } private int CountOrGetFromCache(int[] coins, int j, int i) { if(_cache[j, i] == null) { _cache[j, i] = CountChangeOptions(coins, j, i); } return (int)_cache[j, i]; } 是之前使用_cache设置的int?[][]。但是现在这已经失败了一些测试用例。知道为什么吗?

1 个答案:

答案 0 :(得分:0)

我看到的唯一问题是_cache变量未正确初始化为

_cache = new int[N+1, N+1]

而不是

_cache = new int[coins.Length+1, N+1]

除此之外,两种解决方案功能相同。我不相信有一个功能测试用例适用于第一个(慢速)实现,而第二个实现失败。

我猜你正在使用像HackerRank这样的网站,而第一个解决方案可能会超时,让你觉得它有效,第二个更快,不会超时,但会产生不正确的结果。