优化关系

时间:2018-10-12 19:51:43

标签: time-complexity dynamic-programming recurrence

我有一个复发关系:

f(a,b) = f(a-1,b)+f(a-2,b-1)+f(a-1,b-1) 

其中约束:1 <= a <= 10 ^ 9和1 <= b <= 1000。我尝试使用递归来找出值,但是时间复杂度很高。我也尝试使用dp表,但是时间复杂度也很高。另外,由于a最多可以达到10 ^ 9,因此无法创建这么大的表,因为空间复杂度太高,并且我会遇到运行时错误。 我想优化此代码,以减少其时间复杂度。谁能帮助我实现这一目标?我的意思是要使用哪种数据结构,或者应该实现哪种算法?

1 个答案:

答案 0 :(得分:0)

顺便说一句,这对于CS StackExchange是一个更好的问题。由于您的变量是有界的(尤其是b),因此我们可以将f(a, b)视为仅接受一个由n定义的数字n=1000*a+b。然后a=n/1000b=n%1000。基于此归约定义一个新函数g(n)=f(a, b)。然后我们有

g(n) = g(n-1000) + g(n-2001) + g(n-1001)

使用标准线性递归公式,我们得到

g(n) = A*p^n + B*q^n + C*r^n

其中pqr是方程x^2001-x^1001-x^1000-1=0的实解。然后,您将根据初始条件(例如,当AB较小时,C的值来求解f(a, b)ab 。然后,您将拥有一个无需递归的显式公式。请注意,多项式在数值上不是很稳定,因此在寻找根时需要小心。