代码效率优化方法论
被动学习掌握不了全部的知识。
从代码的开发和优化去不断加强算法和数据结构的学习。
方法论:把‘烂’代码优化成高效率的代码的方法和路径。
基础知识:
编写代码的核心 => 完成程序计算,计算过程就是对算法和数据结构的应用(ps:代码计算消耗的资源是时间和空间,要提高时间和空间的利用,需要降低代码复杂度。)
复杂度是什么:
-
复杂度是衡量代码运行(效率的重要的)度量因素。
-
复杂度通常包括时间复杂度和空间复杂度
-
复杂度是一个关于输入数据量 n 的函数
-
时间复杂度:代码执行需要的时间,与代码结构的设计高度相关
-
空间复杂度:代码所耗费的存储空间,与代码中数据结构高度相关
-
计算复杂度需要注意的:
-
他与常系数无关,O(n) 和 O(2n) 表示为同一复杂度。
-
复杂度相加时候,取最高复杂度,O(n)+O(n^2) 和 O(n^2) 是同样的复杂度。
-
O(1) 特殊的复杂度:与输入数据量 n 无关(不管多少次多计算,始终只要输出一次)。如数组查找对应索引的值,对象查找 key 值对应的 value
-
ps:优化时间复杂度很重要,处理10万的数据,代码结构的不同,计算机计算的次数往往有天壤之别的。
问题:为啥 O(n) 和 O(2n) 的时间复杂度是一样的,如果执行一个for循环是O(n),连续执行100个for循环是O(100n),那执行100个for循环花费的时间不是一个for循环的100倍吗? 答案:执行时间是100倍,但他们的复杂度是一样的,复杂度不等于执行时间。复杂度指的是,处理时间与输入数据量的关系。O(n)表示是线性关系,不管是2n还是100n都是线性的。
问题:O(n), O(2n), O(1) ,O(n)+O(n^2) 复杂度排序 答案:O(1) < O(n) = O(2n) < O(n)+O(n^2)
经验性结论:时间复杂度
- 一个顺序结构的代码:O(1)
- 二分查找(分而治之策略):为O(log n)
- 一个 简单 的for循环:为 O(n)
- 两个 顺序 执行的for循环:为O(2n)
- 两个 嵌套 的for循环:O(n^2)
数据结构:将“昂贵”的时间复杂度转换成“廉价”的空间复杂度
数据结构是链接时空的桥梁 (时空转移) 程序优化思路:
- 第一步:暴力解法,在没有时间和空间的要求下,完成程序计算
- 第二步:剔除无效操作,将代码中的无效操作,无效存储给一一剔除,降低时间和空间复杂度(需要学会并掌握 递归,二分法,排序算法,动态规划等常用算法思维)
- 第三步:设计合理数据结构,完成时间复杂度向空间复杂度转移(对数据的操作进行细分,全面掌握常见数据结构的基础知识)
时空转移(数据结构)
- 数据在代码中被处理和加工的最小单位动作是 增、删、查
- 不同的数据结构,增、删、查的复杂度不同,