一 算法基本概念与特性。
1.解决问题的五个步骤
由此我们可以看出良好的解决问题离就不开算法。
2.什么是算法
算法是指在解决问题时,按照某种机械的步骤一定可以得到问题的结果(有的问题有解,有的没有)的处理过程。算法是对解决这个问题的方法和步骤的描述。
算法的组成要素:
操作、控制结构、数据结构3要素组成。
3.算法基本性质
基本性质:1 输入性 2 输出性 3有限性 4 确定性 5 可行性
输入性:一个算法可以没有输入,也可以有多个输入 输出性:是一组与输入有确定关系的量值。一个算法至少有一个输出,也可以有多个。 确定性:组成算法的每条指令清晰无歧义 有限性:算法中每条指令的执行次数和执行时间有限。 可行性:算法中的操作都可通过已经实现的基本操作运算有限次地实现。
二 算法复杂度分析
1 好的算法应该具备的特性
正确性: 要求算法能正确求解问题,是首要和最基本的特性。
可读性:是对算法描述的思路和层次的评价。好的算法应思路清晰,层次分明易于阅读和修改。
健壮性:健壮性是对算法在异常情况下处理能力的评价。好的算法在出现异常或非法数据时,或在操作不当时,算法都能作适当处理。
高效性:算法的效率是对求解同样问题的不同算法所占用的时间或空间的评价。好的算法应该是高效的,即求解问题所占空间少,执行时间短。
2 大O表示法
2.1 算法的时间复杂度概念:
是一个用于度量一个算法的运算时间的一个描述,本质是一个函数,根据这个函数能在不用具体的测试数据来测试的情况下,粗略地估计算法的执行效率,换句话讲时间复杂度表示的只是代码执行时间随数据规模增长的变化趋势。
2.2时间复杂度表示法:
下面代码的语句执行次数 T(n)=n^2 +n+3 ,当n趋于无穷时n+3对于T(n)的影响远远小于n^2,n+3对于趋势的影响几乎可以忽略,通常用大O表示法描述其时间复杂度为O(n^2)
int main(){ int i=0,j=0,sum=0;int n;scanf("%d",&n);for(i=0;i<n;i++){for(j=0;j<=n;j++){sum++; }} }
精确表示一个算法的时间复杂度是困难的,一般用大O表示法表示算法的时间复杂度。
大O表示法可以理解为表示 T(n)的增长的量级。
例如:
T(n)=4n^3+5n^2+3 则 T=O(n^3), 时间复杂度是O(n^3)
T(n)=2^n+n^3+6 则T=O(2^n) ,时间复杂度是O(2^n)
一般的:
三 例题
1
D 3^t=n,则 t=log3(n) 则 O(log3n)
2
void test2(int n)
{int i=0,s=0;while(s<n){++i;s=s+i;}
}
分析:
n为规模,while循环处当s>=n不符合条件停止,假设执行m次结束,i=1,2,3..依次渐加,i只影响s值。主要看s,s1 =1, s2 =1+2=3,... sm.=m(m+1)/2,当m(m+1)/2+k=n(k一个起修正作用的常数),m≈ √n ,则时间复杂度为O(√n )。
3
int test3(int n)
{if(n<=1)return 1; // 1elsereturn n*test3(n-1); // 2
}
递归函数中,1的时间复杂度显然O(1)。主要分析else后的语句2,递归调用test3(n-1)的时间为T(n-1),则2时间开销就是O(1)+T(n-1) 。
假设求1!就是O(1)+T(n-1)=1×O(1)+T(n-1) ,2!就是O(1)+O(1)+T(n-2)=2×O(1)+T(n-2)... ,n!=(n-1)×O(1)+T(n-(n-1)) =(n-1)×O(1)+T(1) = n×O(1)=O(n) ,所以时间复杂度为O(n)