目录
1.算法分析初步
算法(Algorithm):是对特定问题求解方法(步骤)的一种描述,是指令的有限序列,其中每一
条指令表示一个或多个操作。
1)有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
#include<bits/stdc++.h>
using namespace std;
int main(){
double s,h,s;
cin>>a>>h;
s=a*h/2;
cout<<"该三角形的面积是"<<s<<endl;
reutrn 0;
}
2)确定性:算法中每一条指令必须有确切的含义。不存在二义性。且算法只有一个入口和
一个出口。
比如汉语里的“算账”有多种含义:
1)计算账目;2)吃亏或失败后与人争执较量,有
报复之意。
但是算法中不能有二义性的代码。
3)可行性:一个算法是能行的。即算法描述的操作都可以通过已经实现的基本运算执行有
限次来实现。
可行性必须在执行有限步骤内得出正确的结果,突出有效性质。
区别于有穷性:满足可行性的程序一定满足有穷性,但是满足有穷性的程序未必满足可
行性。
2.算法评价标准
① 正确性(Correctness ): 算法应满足具体问题的需求。
比如,请输出一个三角形的面积。
#include<bits/stdc++.h>
using namespace std;
int main(){
double s,h,s;
cin>>a>>h;
s=a*h/2;
cout<<"该三角形的面积是"<<s<<endl;
reutrn 0;
}
#include<bits/stdc++.h>
using namespace std;
int main(){
double s,h,s;
cin>>a>>h;
s=a*h/2;
reutrn 0;
}
(下面的程序没有输出,不符合题目要求。)
② 可读性(Readability): 算法应容易供人阅读和交流。可读性好的算法有助于对算法的
理解和修改。程序层次划分更清晰 ,易读。
③ 健壮性(Robustness): 算法应具有容错处理。当输入非法或错误数据时,算法应能适
当地作出反应或进行处理,而不会产生莫名其妙的输出结果。
举例:
输入练习——三个整数
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,c;
cin>>a>>b>>c;
cout<<a<<" "<<b<<" "<<c<<" ";
reutrn 0;
}
输入三个整数,并按照输入顺序把整数输出。
在运行时,如果输入的是浮点型数据,对应的输出会出错。
在某官网注册信息时,平台要求登录密码设置为由特殊字符、大写字母、小写字母和数字组
成的 6~18 位组成。如果设置的密码时 19 位,或者密码中没有大写字母等(没有按照要求,
设置密码),在提交时会提醒密码不合法,需要重新输入。
程序在执行 while 循环前预先判断 N 是否为 1,排除 N ==1 的情况。
比较实用的算法,除了能处理一般情况外,还应能够处理各种极端的输入实例。
④ 效率与存储量需求: 效率指的是算法执行的时间;存储量需求指算法执行过程中所需要
的最大存储空间。一般地,这两者与问题的规模有关。
例如求 100 以内还是 1000 以内的素数;
3.算法效率
算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量。而度量
一个程序的执行时间通常有两种方法:
1、事后统计的方法 (计算机内部进行执行时间和实际占用空间的统计)
2、事前分析估算的方法 (求出该算法的一个时间界限函数)
一个用高级程序语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:
1、依据的算法选用何种策略;
(两个程序都是计算年份中各位数字均不相同且比给出的年份大的最小年份,左侧程序采用
函数调用的形式,右侧是嵌套 for 循环。显然左侧程序输出数据占用空间更小,时间更短一
些。)
2、问题的规模。例如求 100 以内还是 1000 以内的素数;
3、书写程序的语言。对于同一个算法,实现语言的级别越高,执行效率就越低;
4、编译程序所产生的机器代码的质量;
5、机器执行指令的速度。
(随后会更4.算法的时间复杂度,希望大家多多支持哈)