算法(Algorithm)
通俗的讲,算法是指解决问题的一种方法或一个过程.更严格的讲,算法是由若干条指令组成的有穷序列.需满足以下5条性质:
1.输入;2输出;3.确定性;4.有限性;5.可行性
什么是好的算法?
空间复杂度S(N)和时间复杂度T(N)---此处引用上一节"什么是数据结构"的两个函数
第一个:PrintN函数---空间复杂度S(N)
递归方法:他在内存里占用空间的数量实际上是跟我们这个原始的N成正比的.也就是S(N)=C*N.(C是常数).当N非常大时,而你的程序可用空间有限时,就会发生非正常退出.
for循环方法:只使用了临时变量和一个for循环,没有涉及到任何程序调用的问题,所以不管N(问题规模)有多大,他占用的空间都是固定的--也就是一个N.
第二个:求多项式值---时间复杂度T(N)
须知:机器运算加减法的速度比乘除法的速度要快很多,所以我们我们基本上就数一个函数做了多少次乘除法
秦九韶法:
for(int i=n;i>0;i--)
{
p=a[i-1]+p*x;
}
乘法次数:n
T(N)=c*N
公式法:
for(int i=1;i<=n;i++)
{
p+=(a[i]*pow(x,i));
}
乘法次数:(1+2+3+...+n)=(n*n+n)/2次
T(N)=c1*N*N+c2*N
继续回到什么是好算法?
在分析一般算法的效率时,我们经常关注下面两种复杂度:最坏情况复杂度和平均复杂度.但最关心的是最坏情况复杂度.
复杂度的渐进表示法
以下设f(N),g(N)是定义在正数集上的正函数.如果存在正常数C和自然数N',使得当N>=N'时有f(N)<=g(N),则称函数f(N)当N充分大时上有界,且g(N)是他的一个上界.记作f(N)=O(g(N)).
例如:3N=O(N). N+1024=O(N). 2*N*N+11*N-10=O(N*N)
不同大小的问题规模在不同算法复杂性函数下的运行时间
不同大小的问题规模在不同算法复杂性函数下的大小
几个常见函数图像
---未完持续