动态算法的理解

  • Post author:
  • Post category:其他

               动态算法是通过空间换取时间的一种算法。很多时候我们在获取结果的过程中会产生许多重复的过程,那么用什么手段将重复的过程只进行一次呢?我们可以将这个过程当成一个黑匣子它有输入和输出,存在一种映射f代表输入和输出关系,当且仅当第一次输入时调用这个过程,产生输出,将输出和结果存储起来,下一次就可以直接获取结果。举个例子,cds:在计算机上,通过此种服务使各地的Internet客户在访问这些网站时,可以访问最接近本地缓存服务器中缓存的内容,从而缩短请求响应时间和网络延迟,减轻网站服务器的负载,解读过程:客户端输入url在第一次时会由服务器响应请求并将结果返回给客户端,同时将url和结果存储到本地缓存服务器中形成一种输入输出关系,当下一次输入相同url即相同请求时就可以到最接近本地缓存服务器中读取缓存的内容返回。我们在计算斐波那契数列时如果使用递归进行求解时采用下列方法,会造成对于f(k)多次重复计算。

result=pre1+pre2;pre2=pre1;pre=result;

f(n){

if(n==1||n==2){

return 1;

}

return f(n-1)+f(n-2);

}

如果我们将f(k)的结果存储起来,我们就只要计算一次了,无疑速度快速很多。

static int[] a=new int[1000];

a[1]=1;a[2]=1;

f(n){

if(n==1||n==2){

return 1;

}

int pre1,pre2;

if(a[n-1]!=0){

pre1=a[n-1];

}else{

pre1=f(n-1);

a[n-1]=pre1;

}

if(a[n-2]!=0){

pre1=a[n-2];

}else{

pre1=f(n-2);

a[n-2]=pre1;

}

return pre1+pre2;

}

如果只计算一次采取递推的方式即省时间也省空间,如何实现在这里不做描述。


版权声明:本文为kingSolider原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。