1. 评估算法优劣的核心指标是什么
- 时间复杂度(Time Complexity):
-
- 时间复杂度是评估算法效率的主要指标,它表示算法执行时间随输入规模(如数组长度、图的大小等)增长的趋势。
- 常见的时间复杂度有:O(1)(常数时间)、O(log n)(对数时间)、O(n)(线性时间)、O(n log n)(线性对数时间)、O(n^2)(平方时间)等。
- 在选择算法时,我们倾向于选择时间复杂度较低的算法,因为这意味着算法的执行速度更快,尤其是在处理大规模数据时。
- 额外空间复杂度(Space Complexity):
-
- 空间复杂度评估算法执行过程中除输入数据外所需额外存储空间的大小。
- 空间复杂度同样随着输入规模的增长而增长,常见的空间复杂度有:O(1)(常数空间)、O(n)(线性空间)等。
- 在选择算法时,如果输入数据规模很大,空间复杂度也是一个需要考虑的因素,因为过多的额外空间可能导致内存不足。
- 常数项时间(Constant Time Factors):
-
- 常数项时间是指不随输入规模变化的时间消耗,例如算法中的固定次数循环、固定次数的比较等。
- 在时间复杂度相同的情况下,常数项时间较小的算法在实际执行中可能具有更快的运行速度。
- 实现细节(如编程语言、数据结构选择等)会影响常数项时间,因此在比较不同算法时,这些细节也需要考虑。
2. 什么是时间复杂度?时间复杂度怎么估算?
- 时间复杂度:算法执行过程中所需的基本操作数量(如比较、交换、移动等)与输入数据规模(如数组长度、图的大小等)之间的关系 (算法流程的总操作数量与样本数量之间的表达式关系)
- 时间复杂度估算:只看表达式最高阶项的部分
3. 什么是常数时间的操作?
如果一个操作的执行时间不以具体样本量为转移,每次执行时间都是固定时间。称这样的操作为常数时间的操作
常见的常数时间的操作:
常见的算术运算(+、-、*、/、% 等)
常见的位运算(>>、>>>、<<、|、&、^等)
赋值、比较、自增、自减操作等
数组寻址操作
4. 如何确定算法流程的总操作数量与样本数量之间的表达式关系?
- 想象该算法流程所处理的数据状况,要按照最差情况来。
- 把整个流程彻底拆分为一个个常数时间的操作。
- 如果数据量为N,看常数时间的操作的数量和数据量N是什么关系。
5. 如何确定算法流程的时间复杂度?
当完成了表达式的建立,只要把最高阶项留下即可。低阶项都去掉,高阶项的系数也去掉。
时间复杂度通常只关注算法中执行次数最多的操作,也就是最高阶项。这是因为当输入规模变得非常大时,高阶项的执行次数将远超过低阶项,从而主导了整个算法的运行时间。
记为:O(忽略掉系数的高阶项)
通过三个具体的例子,来实践一把时间复杂度的估算