一、代码效率优化方法论
复杂度:如何衡量程序运行的效率?
// 复杂度是衡量代码运行效率的重要度量因素。
/*
衡量复杂度一般围绕两个维度:
1.这段代码消耗的资源是什么。也就是我们口中的时间复杂度和空间复杂度。
2.这段代码对于资源的消耗是多少。与输入的数据量高度相关。
*/
/*
复杂度计算遵循的几个原则:
1.复杂度与具体的常系数无关;
🌰O(n)和O(2n)表示同样的复杂度
2.多项式的复杂度相加的时候,选择高者作为结果。
🌰O(n^2)+O(n)和O(n^2)表示同样的复杂度
O(1)表示一个特殊复杂度,含义为某个任务通过有限可数的资源即可完成。与输入数据量n无关
*/
/* 时间复杂度与代码结构的关系
时间复杂度与代码的结构设计高度相关;
空间复杂度与代码中数据结构的选择高度相关。
*/
/*
小tip
一个顺序结构的代码,时间复杂度是O(1)
二分查找,或者更通用地说是采用分而治之的二分策略,时间复杂度都是O(logn)
一个简单的for循环,时间复杂度是O(n)
两个顺序执行的for循环,时间复杂度是O(n)+O(n)=O(2n),也是O(n)
两个嵌套的for循环,时间复杂度是O(n^2)
*/
数据结构:将“昂贵”的时间复杂度转换成“廉价”的空间复杂度
// 代码效率优化的最终目标:采用尽可能低的时间复杂度和空间复杂度,去完成一段代码的开发。
// 时间昂贵、空间廉价
// 常用降低时间复杂度的方法:递归、二分法、排序算法、动态规划等
// 降低空间复杂度的核心思路就是,能用低复杂度的数据结构解决问题,就千万不要用高复杂度的数据结构。
/*
降低复杂度的步骤“
1、暴力解法。在没有任何时间、空间约束下,完成代码任务的开发。
2、无效操作处理。将代码中的无效计算、无效存储剔除,降低时间或空间复杂度。(学会并掌握递归、二分法、排序算法、动态规划等常用的算法思维)
3、时空转换。设计合理数据结构,完成时间复杂度向空间复杂度的转移。(对数据的操作进行细分,全面掌握常见数据结构的基础知识)
*/