算法
举一个例子,求和。如果要求100以内的正整数和,比较原始的思路是逐个累加求和:
void sumInt(n)
{
int sum = 0;
for (int i = 0; i <= n; i++)
{
sum += i;
}
printf("%d", sum);
}
其实这也是一种算法,简单易懂,只是效率可能不太高。而高斯想出了另一种解法:
可以求得sum=5050,用程序来表达就是:
void sumIntPro(n)
{
int sum = 0;
sum = (1 + n) * n /2;
printf("%d", sum);
}
其实这就是求等差数列和的算法,不仅适用于100以内数的求和,还支持一千、一万等等,效率有了很大的提升
算法的定义
算法是求解特定问题求解步骤的描述,在计算机中表现为指令的有限序列,每条指令代表一个或多个操作
指令:能被人或机器执行,可以是计算机指令,也可以是语言文字等。
算法的特性:输入、输出、有穷性、确定性、可行性
- 有穷性:执行有限步骤后自动结束,每个步骤在可接受的时间内完成,不会出现无限循环
- 确定性:每个步骤都有确定的含义,不会出现二义性
- 可行性:每一步都可行,即通过有限次数执行完成
算法设计要求:同一个问题可以有多种算法,就像上面的例子,显然我们更偏爱好的算法,那么好的算法必须要满足:
- 正确性:满足基本特性,正确反映问题需求,得到正确答案
- 可读性:便于阅读、理解、交流
- 健壮性:校验非法输入
- 复杂度:事件效率高而存储量低。
一般我们评估算法的效率,可以通过事前评估和事后分析两种方法,事前分析评估就是根据算法代码,计算它的复杂度,像是时间复杂度函数O(f(n)),体现算法的时间复杂度,还有空间复杂度,体现算法执行所需的额外空间。事后分析一般是通过批量的测试程序执行,计算算法的执行时间。常用的时间复杂度及排序有:O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)
当然,算法根据输入数据的不同,效率有很大的差异,因此就有最坏情况和平均情况,计算所有情况的平均值,这种时间复杂度称为平均时间复杂度。计算最坏情况下的时间复杂度,称为最坏时间复杂度。
以上就是算法的一些基础的介绍