数据结构与算法之美
王争
前 Google 工程师
283752 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 81 讲
基础篇 (38讲)
数据结构与算法之美
15
15
1.0x
00:00/00:00
登录|注册

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

做Benchmark基准测试,避免性能下降
估算数据规模和性能压力,做到未雨绸缪
不要过度优化微小的性能差距
深入理解原理,有助于更好地应用现成类和函数
使用编程语言提供的现成类和函数实现
对于内存密集和CPU密集的问题,减少逻辑计算复杂度或数据读取量
对于磁盘IO密集的问题,减少磁盘IO次数
根据图的稀疏程度选择邻接表或邻接矩阵表示
例如,根据数据的前缀重合和字符集大小选择是否使用Trie树
理清要处理数据的特征与访问方式,转化成合理的数据结构模型
在小规模数据下,性能差距很小,选择简单、容易维护的数据结构和算法
对于处理不同问题的不同算法,其复杂度大小没有可比性
代码的执行时间有时不跟时间复杂度成正比
复杂度不是执行时间和内存消耗的精确值
千万不要漫无目的地过度优化
善用语言提供的类,避免重复造轮子
区别对待IO密集、内存密集和计算密集
结合数据特征和访问方式来选择数据结构
抛开数据规模谈数据结构和算法都是“耍流氓”
时间、空间复杂度不能跟性能划等号
数据结构和算法在实际开发中的应用

该思维导图由 AI 生成,仅供参考

你好,我是王争,今天是一篇总结课。我们学了这么多数据结构和算法,在实际开发中,究竟该如何权衡选择使用哪种数据结构和算法呢?今天我们就来聊一聊这个问题,希望能帮你把学习带回实践中。
我一直强调,学习数据结构和算法,不要停留在学院派的思维中,只把算法当作应付面试、考试或者竞赛的花拳绣腿。作为软件开发工程师,我们要把数据结构和算法,应用到软件开发中,解决实际的开发问题。
不过,要想在实际的开发中,灵活、恰到好处地应用数据结构和算法,需要非常深厚的实战经验积累。尽管我在课程中,一直都结合实际的开发场景来讲解,希望带你真枪实弹地演练算法如何解决实际的问题。但是,在今后的软件开发中,你要面对的问题远比我讲的场景要复杂、多变、不确定。
要想游刃有余地解决今后你要面对的问题,光是熟知每种数据结构和算法的功能、特点、时间空间复杂度,还是不够的。毕竟工程上的问题不是算法题。算法题的背景、条件、限制都非常明确,我们只需要在规定的输入、输出下,找最优解就可以了。
而工程上的问题往往都比较开放,在选择数据结构和算法的时候,我们往往需要综合各种因素,比如编码难度、维护成本、数据特征、数据规模等,最终选择一个工程的最合适解,而非理论上的最优解
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

在实际软件开发中,灵活应用数据结构和算法需要综合考虑多种因素,而非简单地追求理论上的最优解。本文总结了六条经验,帮助读者更好地权衡选择使用哪种数据结构和算法。首先,时间、空间复杂度不能简单等同于性能,因为复杂度并不是执行时间和内存消耗的确切数据量。其次,抛开数据规模,数据结构和算法在小数据规模下的性能差距很小,因此在这种情况下,选择简单、容易维护、容易实现的方式即可。结合数据特征和访问方式来选择数据结构是关键,需要理清要处理数据的特征与访问方式,才能找到满足需求的算法。需要区别对待IO密集、内存密集和计算密集,合理选择数据存储格式和存取方式,减少性能瓶颈。文章还提到了善用语言提供的类,避免重复造轮子,以及千万不要漫无目的地过度优化的观点。总的来说,本文强调了在实际软件开发中,灵活应用数据结构和算法需要综合考虑多种因素,而非简单地追求理论上的最优解。这些经验可以帮助读者更好地理解如何在实际开发中选择合适的数据结构和算法,解决实际的开发问题。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据结构与算法之美》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(36)

  • 最新
  • 精选
  • 安然自若
    代码在哪里🧐

    作者回复: https://github.com/wangzheng0822/algo

    2019-07-09
  • 观弈道人
    课程要结束了,可惜拉下好多内容。
    2019-02-18
    30
  • 猫头鹰爱拿铁
    已经开始二刷了。二刷完后打算再做一遍习题吧。 关于选择数据结构这块,我觉得确实要好好研究下底层的数据结构实现。这个对自己的成长也是有好处的。例如看完hashmap的源码会对巧妙使用位运算提升性能有更深层次的体会。然后就是工程中还要考虑实际场景,例如并发等等,如果不研究深一点数据结构,哪怕对应到散列表,jdk有hashtable,hashmap,concurrentmap选啥呢。
    2019-02-18
    4
    19
  • 牧民牛仔
    老师的课程设计的很合理,对应的数据结构及算法章节,随时可查,随时可以复习。点个赞
    2019-02-18
    17
  • 李伟
    在平时工作上,看到有些前人留下来的代码,看起来效率不是很高,但是却没有人去优化它,应该就是属于老师今天说的这种情况!
    2019-02-18
    2
    16
  • 传说中的成大大
    这篇文章让我想起了以前看书学习设计模式中德一个忠告,滥用设计模式比不用设计模式更糟糕!
    2019-02-18
    11
  • 王子瑞Aliloke有事电联
    学习好基础的知识,力求能开发出ES,Kafka,MQ 这一类的优秀开源工具。 一刷还没完成,但数据结构与算法,我一定会精通的,计划花200+小时的认真学习,精通数据结构与算法
    2019-02-20
    7
    10
  • 纯洁的憎恶
    1.目标不同,评价标准不同。 2.根据环境特征选择解决方法。 3.将复杂、开放的问题,合理抽象为特定范式。 4.善于找到问题的瓶颈,并优先解决。 5.善于借助前人的经验,并尽可能理解他们的经历与选择。 6.注意成本收益,投入恰到好处,切忌严重过度投入。
    2019-02-18
    8
  • 未来的胡先森
    这门专栏要不断的回过头去复习巩固,关键还是要不断的 coding 练习
    2019-02-18
    6
  • 呦呦鹿鸣
    是的,用最小的成本满足需求,这或许就是终极原则了。做设计时应该要有取舍,权衡各方面的优劣,切勿过度设计
    2019-02-18
    4
收起评论
显示
设置
留言
36
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部