目录
一.算法的定义
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作;
二.算法特性
-
输入性
-
输出性
-
有穷性
-
确定性:每一步都具有确定的含义,不会出现二义性
-
可行性:每一步都是可执行的
三.算法设计要求
- 正确性:能正确反映问题的需求,能够得到问题的正确答案
- 可读性
- 健壮性:对于不合法的输入数据能正确处理,不会产生bug
- 时间效率高和存储量低
四.算法效率的度量方法
- 事后统计方法:通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序运行时间进行比较,从而确定算法效率的高低;
- 事前分析估算方法:在计算机程序编制前,依据统计方法对算法进行估算;
五.函数的渐近增长
- 比较算法A 2n+3次操作次数和算法B 3n+1次操作次数的效率
次数 | 2n+3 | 2n | 3n+1 | 3n |
1 | 5 | 2 | 4 | 3 |
2 | 7 | 4 | 7 | 6 |
3 | 9 | 6 | 10 | 9 |
10 | 23 | 20 | 31 | 30 |
100 | 203 | 200 | 301 | 300 |
可以看出,1.当n≥3,2n+3次数少于3n+1,因此算法A此时优于算法B;
2.随着n增大,加法常数不影响算法效率;
定义:函数的渐进增长,给定两个函数f(n)和g(n),若存在一个整数N,使得当n>N时,f(n)总是比g(n)大,则f(n)增长大于g(n);
- 比较算法A 4n+8次操作次数和算法B 2n*n+1次操作次数的效率
可以看出,1.当n≥10,4n+8次数少于2n*n+1,因此算法A此时优于算法B;次数 4n+8 4n 2n*n+1 2n*n 1 12 1 3 1 2 16 2 9 4 3 20 3 19 9 10 48 10 201 100 100 408 100 20001 10000 1000 4008 1000 2000001 1000000
2.随着n增大,最高次项的常系数不影响算法效率;
- 比较算法A 2n*n+3n+1次操作次数和算法B 2n*n*n+3n+1次操作次数的效率
次数 | 2n*n+3n+1 | n*n | 2n*n*n+3n+1 | n*n*n |
1 | 6 | 1 | 6 | 1 |
2 | 15 | 4 | 23 | 8 |
3 | 28 | 9 | 64 | 27 |
10 | 231 | 100 | 2031 | 1000 |
100 | 20301 | 10000 | 2000301 | 1000000 |
可以看出,1.当n≥2,2n*n+3n+1次数少于2n*n*n+3n+1,因此算法A此时优于算法B;
2.随着n增大,最高次项的指数大的,函数增长也快;
总结:判断一个算法效率时,应该更关注最高次项的阶数,函数的常数与系数可以忽略;
六.算法的时间复杂度
- 定义:语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级,时间复杂度记为T(n)=O(f(n)),一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法;
- 推导公式
1).用常数1取代运行时间中的所有加法常数;
2).在修改后的运行次数函数中,只保留最高阶项;
3).如果最高阶项存在且不是1,则去掉这个项的系数;
3.举例
- 常数阶:f(n)=3,时间复杂度为O(1)
int sum = 0,n = 100; /* 执行一次 */
sum = (1 + n) * n / 2; /* 执行一次 */
printf("%d", sum); /* 执行一次 */
- 线性阶:f(n)=n,时间复杂度为O(n)
int i; /* 执行一次 */
for (i=0;i<n;i++) /* 执行n次 */
{
i=i+0; /* 执行1次,忽略 */
}
- 对数阶:f(n)=log2n,时间复杂度为O(logn)
int count = 1; /* 执行一次 */
while count < n) /* 执行log2n次 */
{
count = count * 2;
}
- 平方阶:f(n)=n*n,时间复杂度为O(n*n)
int i,j;
for(i = 0; i < n; i++) /* 执行n次 */
{
for(j = 0; j < n; j++) /* 执行n次 */
{
/* 时间复杂度为O(1)的程序步骤序列 */
}
}
若内循环次数改为m,则复杂度为O(n*m),因此实际上可以理解为:循环的时间复杂度等于循环体的复杂度*该循环体运行的次数;
4.常见时间复杂度耗费时间:
O(1)<O(logn)<O(n)<O(nlogn)<O(n*n)<O(n*n*n)<O(2*n的n次方)<O(n!)<O(n*n的n次方)
七.空间复杂度
1.定义:指通过计算算法所需的存储空间实现,计算公式是S(n)=O(f(n)),n是问题的规模,f(n)是语句关于n所占存储空间的函数;