工程中选择数据结构和算法的依据
1. 时间、空间复杂度不能和性能划等号
时间、空间复杂度不是时间执行和内存消耗的精确值。它们只是表示了随着数据量的增长,时间、空间的增长趋势。
代码的执行时间有时不跟时间复杂度成正比。我们常说算法是O(nlogn),O(n2n^2n2)这些都是基于大数据量(例如>50>50>50),在小数据量的时候可能O(n2n^2n2)比O(nlogn)更快。
对于不同问题,不同算法之间不能做复杂度比较。复杂度只能表征不同算法在处理同类型数据、同样问题时候的算法 优劣。
2. 抛开数据规模谈数据结构和算法都是“耍流氓”
数据规模小,算法之间的优越性体现不出来。
代码执行频率过低,算法优化的效果体现不出来。
代码执行频率不高,并且是非核心代码,选择简单、易懂的数据结构和算法。
流入100以内的字符串比较用暴力匹配就挺好。使用KMP等更容易出问题,增加维护成本。
3.结合数据特征和访问方式选择数据结构
例如Trie树在字符串有公共前缀的情况下使用能提高搜索效率。如果数据之间都没有公共前缀,用Trie树就不合适了。
例如图使用邻接表存储还是邻接矩阵存储,看图是稀疏矩阵吗。如果是,就用邻接表,不是就用邻接矩阵存储。
4. 区别对待 IO 密集、内存密集和计算密集
IO密集:例如数据存储在磁盘上,需要每次读取。通过减少IO的次数,提高性能 。例如数据库查询是IO密集型,减少数据库操作次数,提高性能。
计算密集:代码执行效率的瓶颈在CPU执行上。例如已经将数据加载到内存中。优化的时候要减少逻辑计算复杂度。例如用位运算代替加减法。
内存密集:计算操作都比较简单,代码执行效率的瓶颈在数据加载到内存。例如字符串比较。因此,在选择数据结构和算法的时候,需要考虑是否能减少数据的读取量,数据是否在内存中连续存储,是否能利用 CPU 缓存预读。
5.善用语言提供的类库,避免重复造轮子
6.有目的的优化,不过度优化
在有必要的时候,在核心代码、在执行频率高的代码做优化。
我们要学会估算。估算能力实际上也是一个非常重要的能力。我们不仅要对普通情况下的数据规模和性能压力做估算,还需要对异常以及将来一段时间内,可能达到的数据规模和性能压力做估算。这样,我们才能做到未雨绸缪,写出来的代码才能经久可用。
当真的要优化代码的时候,一定要先做 Benchmark 基准测试。这样才能避免你想当然地换了一个更高效的算法,但真实情况下,性能反倒下降了。
工程中选择数据结构和算法的依据相关推荐
- 如何选择数据结构和算法(转)
文章目录 1. 时间.空间复杂度 != 性能 2. 抛开数据规模谈数据结构和算法都是"耍流氓" 3. 结合数据特征和访问方式来选择数据结构 4. 区别对待IO密集.内存密集和计算密 ...
- 搜索中常见数据结构与算法探究(二)
本文介绍了几个常见的匹配算法,通过算法过程和算法分析介绍了各个算法的优缺点和使用场景,并为后续的搜索文章做个铺垫:读者可以通过比较几种算法的差异,进一步了解匹配算法演进过程以及解决问题的场景:KMP算 ...
- 在Object-C中学习数据结构与算法之排序算法
笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...
- JavaScript中的数据结构和算法
JavaScript不仅是一门用于网页交互的脚本语言,还可以用于编写高效的数据结构和算法.在本文中,我们将介绍JavaScript中可用的数据结构和常见的算法,并说明它们在实际应用中的用途和性能. 数 ...
- iOS标准库中常用数据结构和算法之内存池
上一篇:iOS标准库中常用数据结构和算法之位串 ⛲️内存池 内存池提供了内存的复用和持久的存储功能.设想一个场景,当你分配了一块大内存并且填写了内容,但是你又不是经常去访问这块内存.这样的内存利用率将 ...
- iOS标准库中常用数据结构和算法之二叉排序树
上一篇:iOS标准库中常用数据结构和算法之排序 ?二叉排序树 功能:二叉排序树的标准实现是一颗平衡二叉树.二叉排序树主要用来解决高效插入和高效检索以及进行排序的问题.系统分别提供了二叉排序树节点的查找 ...
- 【离散数学中的数据结构与算法】六 排列与组合二
接着上一篇学习:[离散数学中的数据结构与算法]五 排列与组合一 上一篇文章主要学习了可重复选取的可重排列和不可重复选取的排列.他们都是在n个不同的对象中选取. 今天我们俩学习的是,当这个n个对象中有相 ...
- JavaScript中有关数据结构和算法的最佳书籍
If you're trying to learn about data structures or algorithms, you're in luck - there are a lot of r ...
- c语言消消看算法,论消去游戏中的数据结构与算法.doc
论消去游戏中的数据结构与算法 PAGE PAGE PAGE 32 摘要: 近年来,随着经济的日益发展,人们的生活水平不断提高,生活质量也在渐渐的改善.适当的游戏对人们的业余生活是不可必缺的.说到游戏, ...
最新文章
- Ambari安装之部署3个节点的HA分布式集群
- SVM在R语言中的使用
- 【软考-系统架构师】计算机操作系统相关考题答案详解
- 记录一个layui框架之自定义模块出现的问题
- Courses hdu 1083(匹配)
- Silverlight 2.5D RPG游戏技巧与特效处理:(七)动画特写
- 数据显示,中国近一半的独角兽企业由“BATJ”四巨头投资
- group by 汇总
- 近40万辆奥迪车被召回,有你的吗?
- [APIO2009]抢掠计划
- 在moss上自己总结了点小经验。。高手可以飘过
- 什么是Code Review(转)
- 苹果屏蔽更新描述文件_安装iOS屏蔽更新描述文件教程方法
- 算法入门篇:排序算法(一)
- mfc对话框ok没效果_利用PS制作逼真双重曝光效果案例演示,合成紫色城市建筑风格海报图片...
- 台大·林轩田·机器学习基石·第二讲
- java使用cmd编译中文时错误,解决Notepad++编写的Java程序在cmd窗口编译时中文注释报错问题...
- 【AI 2021】Adobe Illustrator 2021 软件下载及安装教程
- 一种夸张的炒股计算方法
- 三极管计数系统的设计与实现matlab,运动控制系统课程设计-双闭环直流电动机调速系统设计及MATLAB仿真汇.docx...
热门文章
- 【JZOJ4819】【NOIP2016提高A组模拟10.15】算循环
- 在Win7虚拟机下搭建Hadoop2.6.0伪分布式环境
- (运维日志)在win7安装Oracle并部署Oracle数据库
- oracle数据库跟mysql的区别_关于Oracle数据库与MySQL数据库的几点区别
- vue axios解决post传参数问题
- TCP/UDP相关知识
- 使用nginx搭建https服务器
- plsql 弹出 register,plsql注册码
- 宝塔面板进行ssl配置,显示待域名确认
- typescript mongodb 教程搜集