基本概念
算法基本概念知识图谱:
算法是什么
- 程序=数据结构+算法——先设计数据结构,在根据实际问题需求,设计相应的算法,形成一个程序。
- 数据结构:现实世界问题信息化(逻辑结构),信息存储入计算机(存储结构),实现对数据结构的基本操作(数据运算)
- 算法:处理信息,解决实际问题
算法特性
- 有穷性
- 确定性
- 可行性、输入以及输出
好算法特质——设计算法的追求目标
- 正确性——正确解决问题
- 可读性——可让他人能够理解,无歧义描述解决问题步骤
- 健壮性——对非法输入做出反应或处理,要有检测非法输入的逻辑
- 高效率——执行速度快,时间复杂度低
- 低存储量需求—— 不费内存,空间复杂度低
算法效率度量
时间复杂度:(低时间复杂度很重要,算法性能将在问题规模很大时体现)
空间复杂度:
时间复杂度
- 评估算法时间开销要注意:
- 时间复杂度——在算法运行之前,预估算法时间开销与问题规模之间的关系
在算时间复杂度时会有两个问题,问题如下:
- 简化时间复杂度表达式:——只考虑阶数,用大O记法表示
当问题规模足够大时,可以只考虑表达式中阶数最高部分
数量级之间的比较关系如下(常对幂指阶):
- 多行代码该怎么考虑时间复杂度表达式:——只考虑最深层循环次数与问题规模间关系
- 下面将展示几个计算时间复杂度的练习题:
练习1
练习2
空间复杂度
- 程序运行时,将代码装入内存中,当算法所需内存空间为常量时,叫算法原地工作。下面将介绍几个因变量导致的内存开销的空间复杂度计算例子:
例子1
例子2
例子3
例子4
- 一般程序代码在内存中占据的空间是固定的,与问题规模无关;计算空间复杂度时,主要要注意的是分配的变量是否与问题规模有关系,一个好的数据结构将帮助程序节省空间复杂度。
- 除了变量会带来内存开销外,函数递归也会带来内存开销。下面将介绍几个函数递归方面的空间复杂度计算例子:
例子1:函数递归中,内存开销主要与递归深度有关联。在这个例子中,每一层函数的变量所占用的空间大小一样,问题规模则与递归深度有关。
例子2:在这个例子中,每一层递归函数数组占用空间都是变化的,变量存储空间随着递归深度而改变。问题规模不仅和变量有关,还和递归深度有关。