数据结构+算法=程序
数据结构是对数据(操作对象)的描述,及数据的类型和组织形式,算法则是对操作步骤的描述
算法的概念
特性:
1. 有穷性:
算法中的每个步骤都能在有限时间内完成(程序可不满足此条件)
2. 确定性:
算法的每一步必须确切定义,在任何条件下算法只有一条执行路径
3. 可行性:
算法中的所有操作必需通过已实现的基本操作运算有限次实现
4. 有输入:
一个算法应有零个或多个输入
5. 有输出:
一个算法应有一个或多个输出
算法的评价标准
- 正确性:
程序无语法错误;对(几组或苛刻的或一切的)输入数据可得出满足规格说明要求的结果 - 可读性:
算法被理解的难易程度 - 健壮性:
对非法输入的抵抗能力 - 高效率与低存储量需求:
效率(算法执行时间),存储量(算法存储过程中所需的最大存储空间)均与问题规模有关
算法的描述
描述工具
自然语言、框图、高级程序设计语言
算法性能分析
衡量算法效率的方法
方法 | 区别 |
---|---|
事前分析估算法 | 预先比较,比较常用 |
事后统计法 | 必需在计算机实地运行程序,易有其他因素改变算法本质 |
算法执行时间相关因素
- 算法采用的策略;
- 算法解决问题的规模;
- 编程采用的语言;
- 编译程序产生的机器代码的质量;
- 执行算法的计算机速度;
后三条受计算机硬件和软件的制约
一个特定算法的运行时间只依赖于问题的规模
一、时间复杂度
-
定义:
评估执行程序所需的时间,可估算出程序对处理器的使用程度; -
语句频度(时间频度)
该语句在一个算法中重复执行的次数,记为 T(n); -
时间复杂度
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,记作T(n)=O(f(n)),它称为算法的渐进时间复杂度,简称时间复杂度。 -
举例
-
常数阶
语句执行一次,时间复杂度为 O(1);
int sum = 0,n=100; sum = (n+1)*n/2; printf("%d",sum);
-
线形阶
主要要分析循环结构的运行情况
for( int i = 0; i < n; i++){
//时间复杂度为O(1)的算法
......
}此算法时间复杂度为O(n)
- 对数阶
int num = 1;
while( num < n){
num*=2;
//时间复杂度为O(1)的算法
......
}
//假设循环的次数为X,则由2^x=n得出x=log₂n,
//因此得出这个算法的时间复杂度为O(log₂n)
平方阶
for( int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
//时间复杂度为O(1)的算法;
............
}
}
//循环次数为 n² ,时间复杂度为O(n²)
- 比较
时间复杂度的对比
常用的时间复杂度按照耗费的时间从小到大依次是
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!)
二、空间复杂度
- 定义:
评估执行程序所需的存储空间,可估算出程序对内存的使用程度,
记为 S(n) = O(f(n)) - 空间复杂度所需考虑因素
输入数据、程序本身、辅助变量