算法基础知识
一. 什么是算法
算法就是解决问题的思想方法,数据结构是算法的基础。
数据结构 + 算法 = 程序
二.算法的设计
算法的设计: 取决于数据的逻辑结构
算法的实现:依赖于数据的存储结构
三. 算法的特性
有穷性: 步骤是有限
确定性:每一个步骤都有明确的含义,无二义性
可行性:在规定时间内可以完成
输入
输出
四. 评价算法的好坏
正确性
易读性
健壮性:容错处理
高效性:执行效率,通过重复执行语句的次数来判断,也就是时间复杂度(时间处理函数)来判断。
时间复杂度:
语句频度:用时间规模函数表达
时间规模函数: T(n)=O(f(n))
T(n) //时间规模的时间函数
O //时间数量级
n //问题规模,例如:a[100], n=100
f(n) //算法可执行重复语句的次数
称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
渐进时间复杂度用大写O来表示,所以也被称为大O表示法。直白的讲,时间复杂度就是把时间规模函数T(n)简化为一个数量级,如n,n^2,n^3。
例1:
求1+2+3+4+...+n的和
算法1:
int sum=0;
for(int i=1;i<=n;i++)
{
sum += i; //重复执行n次
}
f(n) = n
==>T(n) = O(n)
算法2:
利用等差数列前n项和公式:Sn=n*a1+n(n-1)d/2 或 Sn=n(a1+an)/2 (d是公差)
int sum = (1+n)*n/2; //重复执行1次
f(n) = 1
==> T(n) = O(1)
例2:
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("ok\n"); //重复执行n*n次
}
}
T(n) = O(n^2)
例3:
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
{
printf("ok\n");
}
}
1 + 2 + ... n
f(n) = n*(1+n)/2 = n^2/2 + n/2 //只保留最高项n^2/2, 除以最高项系数 得到n^2
T(n) = O(n^2)
计算大O的方法
- 根据问题规模n写出表达式f(n)
- 如果有常数项,将其置为1 //当f(n)的表达式中只有常数项,例如f(n) = 8 ==> O(1)
- 只保留最高项,其他项舍去。
- 如果最高项系数不为1,则除以最高项系数。
例:
f(n) = 3*n^4 + 2*n^3 + 6*n^7 +10;
==> O(n^7)