如何权衡选择使用哪种数据结构和算法?
极客时间编辑部
讲述:杜力大小:2.00M时长:04:22
工程上的问题,远比课本上的要复杂。极客时间作者王争建议,软件开发工程师把数据结构和算法应用到软件开发中,解决实际的开发问题。同时,他总结了六条经验以供开发者参考。
1. 时间、空间复杂度不能跟性能划等号
在实际的软件开发中,复杂度不能与性能简单划等号,不能表示执行时间和内存消耗的确切数据量。原因主要有以下几点:
第一,复杂度不是执行时间和内存消耗的精确值;
第二,代码的执行时间有时不跟时间复杂度成正比;
第三,对于处理不同问题的不同算法,其复杂度大小没有可比性。
2. 抛开数据规模谈数据结构和算法都是“耍流氓”
在平时的开发中,在数据规模很小的情况下,普通算法和高级算法之间的性能差距会非常小。如果代码执行频率不高、又不是核心代码,这时开发者选择数据结构和算法的主要依据是,其是否简单、容易维护、容易实现。大部分情况下,直接用最简单的存储结构和最暴力的算法就可以了。如果使用高级算法,反而会徒增编码的难度,还容易产生 bug。
3. 结合数据特征和访问方式来选择数据结构
面对实际的软件开发场景,当开发者掌握了基础数据结构和算法之后,最考验能力的并不是数据结构和算法本身,而是对问题需求的挖掘、抽象、建模。如何将一个背景复杂、开放的问题,通过细致的观察、调研、假设,理清楚要处理数据的特征与访问方式,这才是解决问题的重点。
4. 区别对待 IO 密集、内存密集和计算密集
如果你要处理的数据存储在磁盘,比如数据库中。那代码的性能瓶颈有可能在磁盘 IO,而并非算法本身。这个时候,你需要合理地选择数据存储格式和存取方式,减少磁盘 IO 的次数。如果你的数据是存储在内存中,那你还需要考虑,代码是内存密集型的还是 CPU 密集型的。
5. 善用语言提供的类,避免重复造轮子
实际上,对于大部分常用的数据结构和算法,编程语言都提供了现成的类和函数实现。在实际的软件开发中,除非有特殊的要求,你都可以直接使用编程语言中提供的这些类或函数。
这些编程语言提供的类和函数,都是经过无数验证过的,不管是正确性、鲁棒性,都要超过你自己造的轮子。而且重复造轮子,并没有那么简单。你需要写大量的测试用例,并且考虑各种异常情况,还要团队能看懂、能维护。这显然是一个出力不讨好的事情。
但这并不代表,学习数据结构和算法是没用的。深入理解原理,有助于你能更好地应用这些编程语言提供的类和函数。能否深入理解所用工具、类的原理,这也是普通程序员跟技术专家的区别。
6. 千万不要漫无目的地过度优化
掌握了数据结构和算法这把锤子,不要看哪里都是钉子。比如,一段代码执行只需要 0.01 秒,你非得用一个非常复杂的算法或者数据结构,将其优化成 0.005 秒。即便你的算法再优秀,这种微小优化的意义也并不大。相反,对应的代码维护成本可能要高很多。
当然,不过度优化并不代表你在软件开发的时候,可以不加思考地随意选择数据结构和算法。你要学会估算。估算能力实际上也是一个非常重要的能力。你不仅要对普通情况下的数据规模和性能压力做估算,还需要对异常以及将来一段时间内,可能达到的数据规模和性能压力做估算。这样,你才能做到未雨绸缪,写出来的代码才能经久可用。
除了上述 6 点之外,建议你在利用数据结构和算法解决问题的时候,一定要先分析清楚问题的需求、限制、隐藏的特点等。这需要长期的刻意锻炼和积累,也是一个有经验的工程师和一个学院派工程师的区别。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
请先领取课程
免费领取
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论