1.解决问题的策略;
2.策略施加在数据结构的数据上。
(策略:一个有限长度的可执行的指令序列)
1.有穷性:
(1)优先步骤内;
(2)有限时间内。
2.确定性:
(1)算法的每种情况都有确定的规定;
(2)算法的执行者和阅读者不产生二义性;
(3)每种情况只有唯一的解决路径。
3.可行性:
(1)算法每个操作都可运行(基本操作);
(2)基本操作通过已实现的运算操作,在有限时间内可实现。
4.输入:每个算法必须有输入(包括显性输入和隐性输入(初始化))。
5.输出:每个算法必须有输出。
1.正确性:
(1)满足需求规格说明(功能、性能、安全性、完整性、界面、环境);
(2)无语法错误;
(3)输入的数据输出满意的结果==(合法数据得到正确结果,非法数据得到应有的反馈)==;
(4)经过任何典型的、经典的、苛刻的数据都能得到满意结果;
(5)一切合法数据得到正确结果。
2.可读性:
(1)易于人的理解——加注释(序言式,功能性);
(2)易于发现隐藏的错误。
3.健壮性(鲁棒性):
(1)针对非法数据;
(2)输入非法数据算法不可中断并且可以得到应有的反馈;
(3)返回一个错误信息或者错误值。
1.高效率:
(1)算法执行时间短;
(2)数据结构简单,算法高效。
2.低存储:尽可能的降低存储空间。
1.必须先执行;
2.因为一些非算法的因素,掩盖算法可能存在的问题。
影响算法效率的因素:
1.算法策略
2.问题规模
3.采用的语言
4.编译器以及编译出的机器代码
5.机器指令执行效率(CPU)
1.依赖于问题的规模
2.用问题规模函数 O(f(n))
1.时间复杂度
(1)准则:计算算法的重复执行次数
(2)如何估算算法的执行次数
//①顺序结构
t=x;
x=y;
t=t;//运行三次,O(1)
//②选择结构
if(!(x-3)){
...
}else{
...
}//运行4次,O(1)
//③循环结构
int i ,sum=0;
for(i=1;i<101;++i){
sum+=i;
}
printf("%d\n",sum);
______________________
//改写成goto语句:
int i,sum=0; //1'
i=1; //1'
fan1: if(i==101) goto fan2; //101'——>n'
sum+=i; //101'——>n'
++i; //101'——>n'
goto fan1; //101'——>n'
fan2: printf("%d\n",sum); //1'
//次数为4n+5次,O(n);
2.空间复杂度
(1)作用:衡量算法的存储需求。
(2)包括:
①输入数据所占空间
②程序本身所占空间 (X)
③辅助变量所占空间 ()
注意:
①若输入数据所占空间只与问题本身有关,与算法无关,那么只考虑辅助变量空间;
②原地工作:若所需空间,相对于属于数据是一个常量,那么可称为原地工作;
③若所需要的存储量依赖于特定输入,就按最差的情况考虑。