算法和算法评价
算法的基本概念
算法:求解问题的步骤
程序:数据结构+算法
算法的5个重要特性:
- 有穷性:一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成。算法必须是有穷的,而程序可以是无穷的。
- 确定性:算法中每条指令必须有确切的含义,对于相同的输入只能得出相同的输出。
- 可行性:算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。
- 输入:一个算法有零个或多个输入。
- 输出:一个算法有一个或多个输出。必须有一个及一个以上输出。
一个好的算法要满足:
- 正确性:算法应能够正确地解决求解问题。
- 可读性:算法应具有良好的可读性,以帮助人们理解
- 健壮性:输入非法数据时,算法能适当地做成反应或进行处理。
- 高效率低存储:时间复杂度低,空间复杂度低。
算法效率的度量
算法效率的度量是通过时间复杂度和空间复杂度来描述的。
时间复杂度
时间复杂度:事先预估算法时间开销T(n)与问题规模n的关系。
最好时间复杂度:最好情况下算法的时间复杂度。
最坏时间复杂度:最坏情况下算法的时间复杂度。
平均时间复杂度:所有输入示例等概率出现的情况下,算法的期望运行时间。
- 可以只考虑阶数高的部分。
- 问题规模足够大时,常数项系数也可以忽略。
- 加法规则:只保留最高阶的项,且系数变为1。
- 乘法规则:多项相乘,都保留,阶数相加。
- 顺序执行的代码只会影响常数项,可以忽略。
- 只需挑循环中的一个基本操作分析它的执行次数与n的关系即可。
- 如果有多层嵌套循环,只需关注最深层循环循环了几次。
- O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2) < O(n3) < O(n!) < O(nn)
- 巴啦啦能量——常对幂指阶
空间复杂度
空间复杂度:内存开销S(n)与问题规模n之间的关系。
算法原地工作:指算法所需的辅助空间为常量,即O(1)。
- 加法规则:只保留最高阶的项,且系数变为1。
- 乘法规则:多项相乘,都保留,阶数相加。
- O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2) < O(n3) < O(n!) < O(nn)
- 空间复杂度 = 递归调用的深度