today,一起探讨下日常用到的几种算法思想。
穷举算法思想
这个。。。
穷举,穷举,穷举。。。无话可说
递推算法思想
理性思维模式的代表,注重逐步推导。
案例:斐波那契数列(又称:兔子产仔问题)
此问题非常著名,在此不再多说
代码如下:
int Fibonacci(n)
{
int t1,t2;
if(n==1||n==2)
{
return 1;
}
else
{
t1=Fibonacci(n-1);
t2=Fibonacci(n-2);
return t1+t2;
}
}
递归算法思想
即反复调用自身。
编写此算法,必须使用if语句强制方法在未执行递归调用前返回。
在尤其是与AI有关的问题上,更适合用递归方法,如:八皇后,汉诺塔等。可读性更好,但一般递归可能会增长时间,导致栈溢出等。。。
如:求n的阶乘
long fact(int n)
{
if(n<=1)
return 1;
else
return n*fact(n-1);
}
分治算法思想
->二分法
典型案例:分治思想查假币
概率算法思想
基本过程:
形式:数值概率算法、蒙特卡罗算法、拉斯维加斯算法、舍伍德算法。
典型:蒙特卡罗π算法
S(圆)=πrr
图中阴影是1/4个圆,S(阴)=S(圆)/4=πrr/4
图中正方形面积S(正)=rr
若均匀撒点,则S(阴)/S(正)=π/4
由概率统计的规律,只要撒点数足够多,将得到近似结果,
关键点:均匀撒点(“随机方法”实现)、区域判断(xx+y*y<=1)
代码如下(java):
double MontePI(int n)
{
double PI;
double x,y;
int i,sum=0;
for(i=0;i<n;i++)
{
x=Math.random(); //坐标在0,1内随机
y=Math.random();
if((x*x+y*y)<=1)
sum++;
}
PI=4.0*sum/n;
return PI;
}