首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何选择数据结构和算法(转)

如何选择数据结构和算法(转)

作者头像
Michael阿明
发布于 2021-02-20 03:04:22
发布于 2021-02-20 03:04:22
4690
举报

熟知每种数据结构和算法的功能、特点、时间空间复杂度,还是不够的。工程上的问题往往都比较开放,往往需要综合各种因素,比如编码难度、维护成本、数据特征、数据规模等,最终选择一个工程的最合适解,而非理论上的最优解。

1. 时间、空间复杂度 != 性能

  • 复杂度不是执行时间和内存消耗的精确值 大O表示法表示复杂度的时候,复杂度给出的只能是一个非精确量值的趋势。
  • 代码的执行时间有时不跟时间复杂度成正比 时间复杂度是O(nlogn)的算法,比时间复杂度是O(n2)的算法,执行效率要高。前提是,算法处理的是大规模数据的情况。
  • 对于处理不同问题的不同算法,其复杂度大小没有可比性

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

  • 在数据规模很小的情况下,普通算法和高级算法之间的性能差距会非常小。 大部分情况下,我们直接用最简单的存储结构和最暴力的算法就可以了。

比如,对于长度在100以内的字符串匹配,我们直接使用朴素的字符串匹配算法就够了。如果用KMP、BM这些更加高效的字符串匹配算法,实际上就大材小用了。因为这对于处理时间是毫秒量级敏感的系统来说,性能的提升并不大。相反,这些高级算法会徒增编码的难度,还容易产生bug

3. 结合数据特征和访问方式来选择数据结构

如何将一个背景复杂、开放的问题,通过细致的观察、调研、假设,理清楚要处理数据的特征与访问方式,这才是解决问题的重点。

比如前面讲过,Trie树这种数据结构是一种非常高效的字符串匹配算法。但是,如果你要处理的数据,并没有太多的前缀重合,并且字符集很大,显然就不适合利用Trie树了。所以,在用Trie树之前,我们需要详细地分析数据的特点,甚至还要写些分析代码、测试代码,明确要处理的数据是否适合使用Trie 树这种数据结构。

再比如,图的表示方式有很多种,邻接矩阵、邻接表、逆邻接表、二元组等等。你面对的场景应该用哪种方式来表示,具体还要看你的数据特征和访问方式。如果每个数据之间联系很少,对应到图中,就是一个稀疏图,就比较适合用邻接表来存储。相反,如果是稠密图,那就比较适合采用邻接矩阵来存储。

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

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

比如最终推荐人的例子。如果某个用户是经过层层推荐才来注册的,获取他的最终推荐人的时候,就需要多次访问数据库,性能显然不高。 我们知道,某个用户的最终推荐人一旦确定,就不会变动。所以,可以离线计算每个用户的最终推荐人,并且保存在表中的某个字段里。当要查看某个用户的最终推荐人的时候,访问一次数据库就可以获取到。

  • 如果数据是存储在内存中,那还需要考虑,代码是内存密集型的还是CPU密集型的。

所谓CPU密集型,简单点理解就是,代码执行效率的瓶颈主要在CPU执行的效率。我们从内存中读取一次数据,到CPU缓存或者寄存器之后,会进行多次频繁的CPU计算(比如加减乘除),CPU计算耗时占大部分。所以,在选择数据结构和算法的时候,要尽量减少逻辑计算的复杂度。比如,用位运算代替加减乘除运算等。

所谓内存密集型,简单点理解就是,代码执行效率的瓶颈内存数据的存取。对于内存密集型的代码,计算操作都比较简单,比如,字符串比较操作,实际上就是内存密集型的。每次从内存中读取数据之后,我们只需要进行一次简单的比较操作。所以,内存数据的读取速度,是字符串比较操作的瓶颈。因此,在选择数据结构和算法的时候,需要考虑是否能减少数据的读取量,数据是否在内存中连续存储,是否能利用CPU缓存预读

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

大部分常用的数据结构和算法,编程语言都提供了现成的类和函数实现。比如,Java中的HashMap就是散列表的实现,TreeMap就是红黑树的实现等。除非有特殊的要求,一般直接使用编程语言中提供的这些类或函数。

这些编程语言提供的类和函数,经过无数验证过的,不管是正确性、鲁棒性,都要超过你自己造的轮子。

重复造轮子,并没有那么简单。你需要写大量的测试用例,并且考虑各种异常情况,还要团队能看懂、能维护。出力不讨好。

这也是很多高级的数据结构和算法,比如Trie树、跳表等,在工程中,并不经常被应用的原因。但这并不代表,学习数据结构和算法是没用的。深入理解原理,有助于你能更好地应用这些编程语言提供的类和函数。能否深入理解所用工具、类的原理,这也是普通程序员跟技术专家的区别。

6. 千万不要漫无目的地过度优化

一段代码执行只需要0.01秒,你非得用一个非常复杂的算法或者数据结构,将其优化成0.005秒。这种微小优化的意义也并不大。维护成本高。

要学会估算。不仅要对普通情况下的数据规模和性能压力做估算,还需要对异常以及将来一段时间内,可能达到的数据规模和性能压力做估算。这样,我们才能做到未雨绸缪,写出来的代码才能经久可用。

还有,当你真的要优化代码的时候,一定要先做Benchmark 基准测试。这样才能避免你想当然地换了一个更高效的算法,但真实情况下,性能反倒下降了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/08/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据结构和算法
10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
分母为零
2019/12/04
5850
深入学习与探索:高级数据结构与复杂算法
在计算机科学领域,数据结构和算法是构建强大和高效程序的关键要素。随着问题的复杂性不断增加,对于更高级的数据结构和算法的需求也逐渐增加。本文将深入学习和探索一些高级数据结构和复杂算法,包括B+树、线段树、Trie树以及图算法、字符串匹配算法和近似算法等。
IT_陈寒
2023/12/13
2250
深入学习与探索:高级数据结构与复杂算法
数据结构面试常见问题:必备知识点与常见问题解析
使用快慢指针(快指针每次移动两步,慢指针每次移动一步),若两者相遇则存在环。相遇后,令其中一个指针回到起点,两个指针每次移动一步,再次相遇点即为环的入口。
Jimaks
2024/05/15
2270
为什么数据结构与算法对前端开发很重要
一个具有层级结构的数据,实现这个功能非常容易,因为这个结构和组件的结构是一致的,递归遍历就可以了。
五分钟学算法
2019/05/31
6600
对字符串匹配算法的一点理解
| 导语 字符串匹配算法通常分为两个步骤:预处理(Preprocessing)和匹配(Matching)。所以算法的总运行时间为预处理和匹配的时间的总和。 1.明确你的目标是算法选择最重要的事 文本匹配算法有很多,按照匹配模式串的个数,通常分为单模匹配和多模匹配,根据匹配的精确程度,可以分为精确匹配和模糊匹配。 无论是单模还是多模,精确抑或模糊,都是由最简单的暴力匹配算法作为基础,通过一点点微小进步,缓慢的优化拓展出来的,一系列基于特定数据结构的算法集合。除了作为字符串匹配算法之源头的暴力匹配算法外,其余
腾讯Bugly
2019/05/16
2.1K0
对字符串匹配算法的一点理解
如何学习数据结构与算法
什么是数据结构?什么是算法? 从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。 从狭义上讲,也就是我们专栏要讲的,是指某些著名的数据结构和算法,比如队列、栈、堆、二分查找、动态规划等。 数据结构和算法解决的是如何更省、更快地存储和处理数据的问题。因此,我们就需要一个考量效率和资源消耗的方法,这就是复杂度分方法。
Jingbin
2019/04/19
4320
数据结构与算法必备的 50 个代码实现
数据结构和算法是程序员的内功心法和基本功。无论是人工智能还是其它计算机科学领域,掌握扎实的数据结构和算法知识,往往会助力不少!今天给大家推荐一份不错的数据结构与算法资源。特点是:全代码实现!
红色石头
2022/01/12
7200
数据结构与算法必备的 50 个代码实现
【灵魂 |数据结构与算法】 数据结构必备经法(开山篇),一起修炼算法经法!
比如 BAT、Google、Facebook,面试的时候都喜欢考算法、让人现场写代码。公司只能考察他们的基础知识是否牢固。社招就更不用说了,越是厉害的公司,越是注重考察数据结构与算法这类基础知识。相比短期能力,他们更看中你的长期潜力。
计算机魔术师
2023/12/05
2050
java数据结构与算法-思维导图
因为最近在学习数据结构与算法相关的知识,所以打算通过写笔记的方式加强自己对数据结构与算法的理解,也是为了方便以后复习。这里整理记录了一份数据结构与算法的思维导图,也是为了以后学习更有方向性。
李林LiLin
2020/09/26
1.2K0
Go 数据结构和算法篇(十三):字符串匹配之 Trie 树
Trie 树,也叫「前缀树」或「字典树」,顾名思义,它是一个树形结构,专门用于处理字符串匹配,用来解决在一组字符串集合中快速查找某个字符串的问题。
学院君
2023/03/03
1.6K0
Go 数据结构和算法篇(十三):字符串匹配之 Trie 树
Leetcode 题目解析:211. 添加与搜索单词 - 数据结构设计
在考察算法题时,我们往往离不开数据结构。而常见和常用的数据结构,以堆、栈、单/双链表、HashMap、各种二叉树(二叉树、平衡二叉树、搜索二叉树、红黑树)最为常见。另外,像bitmap等也比较多,尤其是需要位操作的时候。但还有一些数据结构也会占有一席之地,例如树中的Trie树(字典树),在检索类题目中也非常常见。
程序员架构进阶
2021/11/04
6630
经典数据结构和算法回顾
最近想回过头来看看以前写的一些代码,可叹为何刚进大学的时候不知道要养成写博客的好习惯。现在好多东西都没有做记录,后面也没再遇到相同的问题,忘的都差不多了。只能勉强整理了下面写的一些代码,这些代码有的有参考别人的代码,但都是自己曾经一点点敲的,挂出来,虽然很基础,但希望能对别人有帮助。
哲洛不闹
2018/09/18
6550
经典数据结构和算法回顾
重学数据结构和算法(三)之递归、二分、字符串匹配
周末你带着女朋友去电影院看电影,女朋友问你,咱们现在坐在第几排啊?电影院里面太黑了,看不清,没法数,现在你怎么办?别忘了你是程序员,这个可难不倒你,递归就开始排上用场了。 于是你就问前面一排的人他是第几排,你想只要在他的数字上加一,就知道自己在哪一排了。但是,前面的人也看不清啊,所以他也问他前面的人。就这样一排一排往前问,直到问到第一排的人,说我在第一排,然后再这样一排一排再把数字传回来。直到你前面的人告诉你他在哪一排,于是你就知道答案了。 我们用递推公式将它表示出来就是这样的:
六月的雨
2021/04/25
7560
重学数据结构和算法(三)之递归、二分、字符串匹配
搜索中常见数据结构与算法探究(二)
Tech    导读    本文介绍了几个常见的匹配算法,通过算法过程和算法分析介绍了各个算法的优缺点和使用场景,并为后续的搜索文章做个铺垫;读者可以通过比较几种算法的差异,进一步了解匹配算法演进过程以及解决问题的场景;KMP算法和Double-Array TireTree是其中算法思想的集大成者,希望读者重点关注。 01 前言 上文探究了数据结构和算法的一些基础和部分线性数据结构和部分简单非线性数据结构,本文我们来一起探究图论,以及一些字符串模式匹配的高级数据结构和算法。《搜索
京东技术
2022/04/02
3880
搜索中常见数据结构与算法探究(二)
重学数据结构和算法(一)之复杂度、数组、链表、栈、队列、图
最近学习了极客时间的《数据结构与算法之美]》很有收获,记录总结一下。 欢迎学习老师的专栏:数据结构与算法之美 代码地址:https://github.com/peiniwan/Arithmetic
六月的雨
2021/03/02
6270
重学数据结构和算法(一)之复杂度、数组、链表、栈、队列、图
一位算法工程师的自我修养
数据结构与算法 基本算法思想 动态规划 贪心算法 回溯算法 分治算法 枚举算法 算法基础 时间复杂度 空间复杂度 最大复杂度 平均复杂度 基础数据结构 数组 动态数组 树状数组 矩阵 栈与队列 栈 队列 阻塞队列 并发队列 双端队列 优先队列 堆 多级反馈队列 线性表 顺序表 链表 单链表 双向链表 循环链表 双向循环链表 跳跃表 并查集 哈希表(散列表) 散列函数 碰撞解决办法: 开放地址法 链地址法 再次哈希法 建立公共溢出区 布隆过滤器 位图 动态扩容 树 二叉树: 各种遍历,递归与非递归 二
攻城狮Chova
2022/01/22
4900
常用的算法和数据结构 面试_数据结构与算法面试题80道
定义:最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。
全栈程序员站长
2022/09/23
8370
常用的算法和数据结构 面试_数据结构与算法面试题80道
☆打卡算法☆LeetCode 211. 添加与搜索单词 - 数据结构设计 算法解析
大家好,我是小魔龙,Unity3D软件工程师,VR、AR,虚拟仿真方向,不定时更新软件开发技巧,生活感悟,觉得有用记得一键三连哦。
恬静的小魔龙
2022/09/27
2580
☆打卡算法☆LeetCode 211. 添加与搜索单词 - 数据结构设计  算法解析
常见的数据结构
数据结构为数据组织、管理和存储提供了一种有效的方法,同时还提供了对数据执行操作的方法。选择正确的数据结构可以使代码更有效率,更易于理解和维护。以下是数据结构对编程的一些意义:
运维开发王义杰
2023/08/10
2460
常见的数据结构
如何实现搜索框的关键词提示功能
我们都使用过主流的搜索引擎,谷歌、 bing,当然还有搜狗、百度之类。当你搜索某一关键词时,它会贴心在下拉框补全一些热门关键词,像下图这样:
somenzz
2020/11/25
3.3K0
如何实现搜索框的关键词提示功能
推荐阅读
相关推荐
数据结构和算法
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档