目录
前言
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
一、算法是什么?
回答这问题之前,我们先来简单看一个例子,如果要求1+2+3+……+100,写一个小程序求出结果,相信大多数人很快就能写出下面的代码(C语言):
#include<stdio.h>
int main(void)
{
int i,sum = 0,n = 100;
for(i = 1;i <= n;i++)
{
sum = sum + i;
}
printf("sum = %d\n",sum);
system("pause");
return 0;
}
这是最简单的计算机程序之一,它就是一种算法,问题在于,你的第一直觉是这样写的,但这样是不是真的很好?是不是最高效?
高斯求和算法想必大家都很熟悉了,代码实现如下:
#include<stdio.h>
int main(void)
{
int i,sum = 0,n = 100;
sum = (1 + n) * n / 2;
printf("sum = %d\n",sum);
system("pause");
return 0;
}
神童就是神童,他用的方法相当于另一种求等差数列的算法,不仅可以用于计算1加到100,加到一千、一万、一亿,也都是瞬间的事。但如果使用上面第一种算法,显然计算机要循环一千、一万、一亿次的加法运算。两种算法的优劣不言而喻了,由此引出算法的定义。
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
二、算法的特性
算法具有五个基本特征:输入、输出、有穷性、确定性和可行性。
1.输入输出
输入和输出特性比较容易理解,算法具有零个或多个输入。尽管对于大多数算法来说,输入参数是必要的,但是对于个别情况,如打印“hello world”这段代码,不需要输入任何参数,因此算法的输入可以是零个。但是算法必须要有一个或多个输出,不需要输出,用算法干嘛?
2.有穷性
有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每个步骤在可接受的时间内完成。如果一个算法不会结束,一直运行,也不能称之为算法了。同样,如果你写一个算法,计算机需要算上两天,算法的意义也就不大了。
3.确定性
确定性:算法的每一步骤都具有明确的含义,不会出现二义性。算法在一定条件下,只有一条执行路径,相同的输入只能有唯一的输出结果。算法的每个步骤被精确定义而无歧义。
4.可行性
可行性:算法的每一步执行必须是可行的,也就是说,每一步都能够通过执行有限的次数完成。可行性意味着算法可以转换为程序在计算机上运行,并得到正确的结果。