拉钩教育-重学数据结构与算法

01 | 复杂度:如何衡量程序运行的效率?

复杂度通常包括时间复杂度和空间复杂度,在具体计算时要注意以下几点:

  1. 它与具体常系数无关,O(n)和O(2n)表示的是同样的复杂度。
  2. 复杂度相加时,选择高阶作为结果,也就是说O(n^2)+O(n)和O(n^2)表示同样的复杂度。
  3. O(1)也是表示一个特殊的复杂度,即任务与算例个数n无关。

时间复杂度与代码的结构设计高度相关,空间复杂度与代码中的数据结构的选择高度相关。

02 | 数据结构:将“昂贵”的时间复杂度转换成“廉价”的空间复杂度

我们需要从时间复杂度和空间复杂度两个维度来考虑,常用的降低时间复杂度的方法有递归、二分法、排序算法、动态规划等;而降低空间复杂度的核心思路就是,能用低复杂度的数据结构能解决问题,就千万不要用高复杂度的数据结构。

程序优化的核心思路,梳理如下:

  1. 暴力解法。在没有任何时间、空间约束下,完成代码任务的开发。
  2. 无效操作处理。将代码中无效计算、无效存储剔除,降低时间或空间复杂度。这需要利用递归、二分法、排序算法、动态规划等常用的算法思维。
  3. 时空转换。设计合理的数据结构,完成时间复杂度向空间复杂度的转移。需要你对数据的操作进行细分,全面掌握常见数据结构的基础知识,围绕问题,有针对性的设计数据结构。

03 | 增删查:掌握数据处理的基本操作,以不变应万变

要想灵活使用数据结构,需要先弄清数据在代码中被处理、加工的最小单位动作,也就是数据结构的基本操作,有了这些动作之后,你就可以基于此去选择更合适的数据结构了。

字典的查找是通过键值对的匹配完成的,它可以在O(1)时间复杂度内,实现对数值条件查找。

设计合理的数据结构,需要从问题本身出发,我们可以采用这样的思考顺序:

  • 首先我们分析这段代码到底对数据先后进行了哪些操作。
  • 然后再根据分析出来的数据操作,找到合理的数据结构。

经过对代码的拆解,你会发现即便是很复杂的代码,它对数据的处理也只有三个基本操作,增、删、查。围绕这三个基本操作进行分析,就能得出解决问题的最优方案。常用的分析步骤如下:

  • 首先,这段代码对数据进行了哪些操作?
  • 其次,这些操作中,哪个操作最影响效率,对时间复杂度的损耗最大?
  • 最后,哪种数据结构最能帮助你提高数据操作的使用效率?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(读书笔记)