Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 生成函数:更快地生成F(n)_Algorithm - Fatal编程技术网

Algorithm 生成函数:更快地生成F(n)

Algorithm 生成函数:更快地生成F(n),algorithm,Algorithm,我最近做了一个测试。。。这个问题说来话长,解决办法归结为 F(n)=2*F(n-1)+2*F(n-2) 我有一个使用动态规划的O(n)解。。。然而,考官并不满意 我的解决方案是简单地在计算时将每个F(n)存储在一个数组中。这花了很多时间。 因为我们只需要前两个元素,只要使用两个变量,空间问题就可以解决 然而O(n)不够快 这个函数看起来像斐波那契函数,斐波那契数可以在O(lgn)时间内生成。。。但是我无法得到解决我的问题的办法 所以我的问题是如何提高函数的时间复杂度?完全相同。用英语表达你的重复

我最近做了一个测试。。。这个问题说来话长,解决办法归结为 F(n)=2*F(n-1)+2*F(n-2)

我有一个使用动态规划的O(n)解。。。然而,考官并不满意

我的解决方案是简单地在计算时将每个F(n)存储在一个数组中。这花了很多时间。 因为我们只需要前两个元素,只要使用两个变量,空间问题就可以解决

然而O(n)不够快

这个函数看起来像斐波那契函数,斐波那契数可以在O(lgn)时间内生成。。。但是我无法得到解决我的问题的办法


所以我的问题是如何提高函数的时间复杂度?

完全相同。用英语表达你的重复;这就减少了寻找矩阵n次方的问题。

完全相同的方法。用英语表达你的重复;这就减少了寻找矩阵n次方的问题。

对于任何线性递归关系都有一个闭合公式(这就是)

它涉及求解特征多项式,在这种情况下,特征多项式为:

t^2 - 2*t - 2 = 0   (since F(n) - 2 * F(n-1) - 2 * F(n-2) = 0)
如果t1和t2是该二次方程的(复)解,则公式为:

F(n) = a * t1^n + b * t2^n
其中a和b为常数,可从初始条件(即本例中的F(0)和F(1)值)中找到。 即

求解a和b:

a = ( t2 * F(0) - F(1) ) / ( t2 - t1 )
b = ( t1 * F(0) - F(1) ) / ( t1 - t2 )
在这种特殊情况下,特征多项式的根为:

t1 = 1 + sqrt(3)
t2 = 1 - sqrt(3)

对于任何线性递推关系,都有一个闭合公式(这就是)

它涉及求解特征多项式,在这种情况下,特征多项式为:

t^2 - 2*t - 2 = 0   (since F(n) - 2 * F(n-1) - 2 * F(n-2) = 0)
如果t1和t2是该二次方程的(复)解,则公式为:

F(n) = a * t1^n + b * t2^n
其中a和b为常数,可从初始条件(即本例中的F(0)和F(1)值)中找到。 即

求解a和b:

a = ( t2 * F(0) - F(1) ) / ( t2 - t1 )
b = ( t1 * F(0) - F(1) ) / ( t1 - t2 )
在这种特殊情况下,特征多项式的根为:

t1 = 1 + sqrt(3)
t2 = 1 - sqrt(3)

在您的解决方案中,还使用了O(n)内存

可以使用简单循环计算第n个斐波那契元素:

您唯一需要保存的是最后3个(a1、a2、a3)元素,在每次迭代中,您将a1更新为a2,将a2更新为a3,并将a3更新为旧(a1)+旧(a2)(您可以为此使用2个临时变量)


因此,我们得到了运行时只有O(n)个O(1)内存的简单算法

在您的解决方案中,您还使用了O(n)内存

可以使用简单循环计算第n个斐波那契元素:

您唯一需要保存的是最后3个(a1、a2、a3)元素,在每次迭代中,您将a1更新为a2,将a2更新为a3,并将a3更新为旧(a1)+旧(a2)(您可以为此使用2个临时变量)


因此,我们得到了运行时只有O(n)个O(1)内存的简单算法

+1尽可能使用数学。(还有:很好的背景和解释,为读者提供了工具,在可能的情况下如何开发这些方程)一个重要的t注:封闭形式的解并不意味着快速的O(1)或O(lgn)解。
t1
t2
计算第n项所需的精度随着
n
的增加而增加@tskuzzy:如果你很狡猾的话就不会了<代码>(a+b.sqrt(3))*(c+d.sqrt(3))==(e+f.sqrt(3)),其中
e==(a.c+b.d)
f==(a.d+b.c)
。换句话说,这一切都可以用整数数学来完成。@OliCharlesworth:等等,我没听懂。这些方程是从哪里来的?它们意味着什么?@tskuzzy:你最初的评论暗示,由于精度限制,sqrt(3)的非理性/分数性质将是一个问题。我的评论指出这不是问题。我给出的方程式只是一个例子;它们说明了在sqrt(3)上只使用整数运算来处理代数是可能的。+1在可能的情况下使用数学。(还有:很好的背景和解释,为读者提供了工具,在可能的情况下如何开发这些方程)一个重要的t注:封闭形式的解并不意味着快速的O(1)或O(lgn)解。
t1
t2
计算第n项所需的精度随着
n
的增加而增加@tskuzzy:如果你很狡猾的话就不会了<代码>(a+b.sqrt(3))*(c+d.sqrt(3))==(e+f.sqrt(3)),其中
e==(a.c+b.d)
f==(a.d+b.c)
。换句话说,这一切都可以用整数数学来完成。@OliCharlesworth:等等,我没听懂。这些方程是从哪里来的?它们意味着什么?@tskuzzy:你最初的评论暗示,由于精度限制,sqrt(3)的非理性/分数性质将是一个问题。我的评论指出这不是问题。我给出的方程式只是一个例子;它们说明了在sqrt(3)上只使用整数运算处理代数是可能的。这可能与几个小时前提出的一个问题非常相似:这大约是我在过去2-3周内第五次看到这个问题。某个地方的某位教授一定很喜欢在他/她的讲座中提到这个网站。这可能与几个小时前提出的问题非常相似:这大概是我在过去2-3周内第五次看到这个问题了。某个地方的教授一定很喜欢在他/她的讲座中提到这个网站。OP是关于提高时间复杂度,而不是空间复杂度…OP是关于提高时间复杂度,而不是空间复杂度。。。