总结1--在实际开发中,如何权衡选择使用哪种数据结构和算法?

文章目录

  • 前言
  • 一、时间、空间复杂度不能跟性能划等号
    • 1. 代码的执行时间有时不跟时间复杂度成正比
    • 2. 对于处理不同问题的不同算法,其复杂度大小没有可比性
  • 二、抛开数据规模谈数据结构和算法都是“耍流氓”
  • 三、结合数据特征和访问方式来选择数据结构
  • 四、区别对待 IO 密集、内存密集和计算密集
  • 五、善用语言提供的类,避免重复造轮子
  • 六、千万不要漫无目的地过度优化
  • 总结


前言

作为软件开发工程师,我们要把数据结构和算法,应用到软件开发中,解决实际的开发问题。

不过,要想在实际的开发中,灵活、恰到好处地应用数据结构和算法,需要非常深厚的实战经验积累。光是熟知每种数据结构和算法的功能、特点、时间空间复杂度,还是不够的。

工程上的问题往往需要综合各种因素,比如编码难度、维护成本、数据特征、数据规模等,最终选择一个工程的最合适解,而非理论上的最优解


一、时间、空间复杂度不能跟性能划等号

复杂度给出的只能是一个非精确量值的趋势

1. 代码的执行时间有时不跟时间复杂度成正比

时间复杂度是 O(nlogn) 的算法,比时间复杂度是 O(n^2) 的算法,执行效率要高。这样说的一个前提是,算法处理的是大规模数据的情况。对于小规模数据的处理,算法的执行效率并不一定跟时间复杂度成正比,有时还会跟复杂度成反比。

2. 对于处理不同问题的不同算法,其复杂度大小没有可比性

对于不同的问题、不同的数据类型,不同算法之间的复杂度大小并没有可比性。

二、抛开数据规模谈数据结构和算法都是“耍流氓”

在平时的开发中,在数据规模很小的情况下,普通算法和高级算法之间的性能差距会非常小。

如果代码执行频率不高、又不是核心代码,这个时候,我们选择数据结构和算法的主要依据是,其是否简单、容易维护、容易实现。大部分情况下,我们直接用最简单的存储结构和最暴力的算法就可以了。

三、结合数据特征和访问方式来选择数据结构

面对实际的软件开发场景,当我们掌握了基础数据结构和算法之后,最考验能力的并不是数据结构和算法本身,而是对问题需求的挖掘、抽象、建模。如何将一个背景复杂、开放的问题,通过细致的观察、调研、假设,理清楚要处理数据的特征与访问方式,这才是解决问题的重点。 只有理清楚了这些东西,我们才能将问题转化成合理的数据结构模型,进而找到满足需求的算法。

四、区别对待 IO 密集、内存密集和计算密集

如果你要处理的数据存储在磁盘,比如数据库中。那代码的性能瓶颈有可能在磁盘 IO,而并非算法本身。这个时候,你需要合理地选择数据存储格式和存取方式,减少磁盘 IO 的次数。

五、善用语言提供的类,避免重复造轮子

对于大部分常用的数据结构和算法,编程语言都提供了现成的类和函数实现。

六、千万不要漫无目的地过度优化

一段代码执行只需要 0.01 秒,你非得用一个非常复杂的算法或者数据结构,将其优化成 0.005 秒。即便你的算法再优秀,这种微小优化的意义也并不大。相反,对应的代码维护成本可能要高很多。
滥用设计模式比不用设计模式更糟糕!

总结

我们在利用数据结构和算法解决问题的时候,一定要先分析清楚问题的需求、限制、隐藏的特点等。只有搞清楚了这些,才能有针对性地选择恰当的数据结构和算法。

这种灵活应用的实战能力,需要长期的刻意锻炼和积累。这是一个有经验的工程师和一个学院派的工程师的区别。

你可能感兴趣的:(数据结构与算法)