代码之家  ›  专栏  ›  技术社区  ›  aditya

慢递推法[复制]

  •  -5
  • aditya  · 技术社区  · 7 年前

    这个问题已经有了答案:

    我在面试中被问到这个问题。下面的算法输出非常好,但是对于较大的输入参数来说,它非常慢。如何在不改变计算逻辑的情况下提高其性能?

        public static int SomeAlgo(int n)
        {
            if ((n == 0) || (n == 1))
            {
                return n;
            }
            else
            {
                return SomeAlgo(n - 1) + SomeAlgo(n - 2);
            }
       }
    

    从参数值40开始变得非常缓慢。 我使用以下代码检查执行所需的时间:

    static void Main(string[] args)
    {
        var watch = System.Diagnostics.Stopwatch.StartNew();
    
        Console.WriteLine("Algo Output: " + SomeAlgo(40));
    
        watch.Stop();
        var elapsedMs = watch.ElapsedMilliseconds;
        Console.WriteLine("Time taken in ms: " + elapsedMs);
        Console.ReadLine();
    }
    
    1 回复  |  直到 7 年前
        1
  •  -1
  •   aditya    7 年前

    由于递归函数对大多数输入值执行多次,所以我能想到的最佳解决方案是存储输出值以避免重复计算:

    static Dictionary<int, int> results = new Dictionary<int, int>();
    public static int SomeAlgo(int n)
    {
        int result = 0;
    
        if (results.TryGetValue(n, out result))
        {
            return result;
        }
    
        if ((n == 0) || (n == 1))
        {
            return n;
        }
    
        result = SomeAlgo(n - 1) + SomeAlgo(n - 2);
        results.Add(n, result);
        return result;
    }
    

    它在性能上有很大的不同。 编辑:感谢Lasse V_gs_ther Karlsen的评论,发现这种技术被称为 Memoization .