为什么要学习数据结构和算法?_数据结构这门课工作中是不是用不到-程序员宅基地

技术标签: 算法  面试  数据结构与算法  数据结构  

是不是觉得数据结构和算法,跟os、计网一样,属于脱离实际工作的屠龙术?
除了面试,其实这辈子也用不着?

尽管计算机专业同学在大学都学过这些课程,甚至很多培训机构也会培训,但很多程序员对数据结构和算法依旧一窍不通。绝大多数人只听说过数组、链表、快排这些最简单的数据结构和算法,稍微复杂一点的就完全没概念。

很多人说实际工作中根本用不到数据结构和算法。所以,就算不懂这块知识,只要Java API、开发框架用得熟练,照样可以把代码写得“飞”起来。

事实真的是这样吗?

想要通关大厂面试,数据结构和算法是开胃菜

BAT字节、Google、微软,面试都喜欢考算法、手写代码并运行。有些人虽然技术八股文不错,但每次去面试都会“跪”在算法上,很可惜。

那你可曾想过,为何这些大公司喜欢考察算法?

校招时,学生一般都没有实际项目经验,公司只能考察他们的基础知识是否牢固。
社招更不用说,越注重技术的公司,越会重点考察数据结构与算法这类基础知识。
因为相比短期能力,他们更看中候选人的长期潜力。

我不懂算法,照样找到了高薪大厂工作啊。我是不是就不用研究算法了?

要以发展的眼光看待,我们学任何知识都是为了解决实际问题,学习算法自然有用处。难道你真愿意一直做个crud boy?

可我整天工作就是crud 啊,哪里用到过算法?

诚然,大部分业务开发都是利用封装好的API堆砌、转译业务逻辑,几乎无需自行实现算法。
但不需要自己实现≠什么都不需要了解

若不知道这些类库背后的原理,不懂得时间、空间复杂度分析,你如何能用好、用对它们?
存储某业务数据时,你如何知道应该用ArrayList,还是LinkedList?
调用某方法后,你如何评估代码的性能和资源消耗?

业务开发用到的各种框架、中间件和底层系统,如MySQL、Spring、MQ和Redis等。这些基础组件中,其实都内置了很多基础算法思想。
如Redis中,有序集合用什么数据结构实现?为什么要用跳表?为什么不用二叉树?

若能清晰这些底层原理,就能更好利用它们。即便出现问题,也方便定位。

实际工作中的算法应用到处可见,如何实时地统计业务接口的99%响应时间?

你可能想,每次查询时,从小到大排序所有的响应时间,若总共有1200个数据,那第1188个数据就是99%的响应时间。
每次用这个方法查询的话都要排序,效率太低。但若你知道“堆”数据结构,用两个堆即可高效解决。

现在开源的技术文章、架构、项目很多,照猫画虎做一套基础框架并不难。我就拿RPC框架举例。

不同人做出的RPC框架,架构设计思路其实都差不多,所实现的功能也相差无几。但就是有人做的框架,Bug很多、性能一般、扩展性也不好,只能在自己公司仅有的几个项目里面玩一下。
而有人的框架就能开源到GitHub,甚至被Apache收录。

为什么会有这么大差距?

编程高手竞争就在细节:算法是不是足够优化,数据存取的效率是不是足够高,内存是不是够节省等等。
所以细节决定成败!

对编程还有追求?不想被35优化?那就不要只会写只是能run的代码!

何为编程高手?不同人可能观点不同。但在我看来,性能好坏至少算一项关键指标。若你连代码时间复杂度、空间复杂度都会分析,怎么可能写出高性能代码?

我在小公司工作的呀,非互联网,用户量少,处理数据量也小,qps几乎0,开发不需要考虑那些性能问题,完成功能就下班了,用不用数据结构和算法,无足轻重。

那你就甘愿“十年如一日”重复 crud 了吗?
大家都知道这行35岁后容易被行业淘汰,原因其实就在此。有人写代码,从不考虑非功能性需求,只是完成功能,能run就行;做事情的时候,也从无长远规划,只顾眼前三分利。
这样即使十年业务积累,跟应届生一年积累没有本质区别。怎么不会被淘汰呢?

大公司里性能几乎是时刻都要考虑的。一个简单的ArrayList、Linked List的选择问题,就可能会产生成千上万倍的性能差别。
数据结构和算法的意义就彰显了。

数据结构和算法这个东西,如果你不去学,可能真的这辈子都用不到,也感受不到它的好。但一旦掌握,你就会常常被它的强大威力所折服。
之前你可能需要费很大劲儿来优化的代码,需要花很多心思来设计的架构,用了数据结构和算法之后,很容易就能解决。

总结

学习数据结构和算法,并非为了死记硬背几个知识点。而是为建立时间复杂度、空间复杂度意识,写出高质量代码,能够设计基础架构,提升编程技能,训练逻辑思维,积攒人生经验,以此获得工作回报,实现你的价值,完善你的人生。

掌握数据结构与算法,看待问题的深度,解决问题的角度就会完全不同。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33589510/article/details/121190276

智能推荐

容斥原理_msk&1==0-程序员宅基地

文章浏览阅读634次。转自于:http://www.cppblog.com/vici/archive/2011/09/05/155103.html这篇文章发表于http://e-maxx.ru/algo/inclusion_exclusion_principle,原文是俄语的。由于文章确实很实用,而且鉴于国内俄文资料翻译的匮乏,我下决心将其翻译之。由于俄语对我来说如同乱码,而用Google直接翻译中文的话又变得面目_msk&1==0

linux dev/shm,巧用linux服务器下的/dev/shm/,避开磁盘IO不给力!-程序员宅基地

文章浏览阅读280次。巧用linux服务器的/dev/shm/,如果合理使用,可以避开磁盘IO不给力,提高网站访问速度。首先让我们认识一下,什么是tmpfs和/dev/shm/?tmpfs是Linux/Unix系统上的一种基于内存的文件系统。tmpfs可以使用您的内存或swap分区来存储文件。由此可见,tmpfs主要存储暂存的文件。它有如下2个优势 : 1. 动态文件系统的大小。2. tmpfs 的另一个主要的好处是它..._linux 把缓存目录放入 /dev/shm

直播回顾|大规模点云显示技术-程序员宅基地

文章浏览阅读70次。点击上方“计算机视觉工坊”,选择“星标”干货第一时间送达大家好,本公众号现已开启线上视频公开课,主讲人通过B站直播间(bilibili号:3D视觉工坊:https://space.bili..._点云显示技术

【phpBB 】style button dose not show on Admin control panel-程序员宅基地

文章浏览阅读484次。Could not get style shows in Administrator Control panel , 登陆到PHPBB的管理员后台之后, 无法安装和检测到任何的style, 但是事实上已经上传style包。

yum install dockers 20 依赖_docker 20依赖-程序员宅基地

文章浏览阅读436次。执行:执行yum install docker-ce docker-ce-cli containerd.io报错解决报错container-selinux 」= 2:2.74 ; slirp4netns >= 0.4 ; fuse-overlayfs >= 0.7错误:软件包:3:docker-ce-19.03.12-3.el7.x86_64 (docker-ce-stable) 需要:container-selinux >= 2:2.74错误:软件包:dock_docker 20依赖

GDB调试:教你简单了解并使用GDB调试程序-程序员宅基地

文章浏览阅读3.1k次。(GNU symbolic debugger) 是由 GNU 软件系统社区提供的。当下的 GDB 支持调试多种编程语言编写的程序,包括 C、C++、Go、Objective-C、OpenCL、Ada 等。实际场景中,GDB 更常用来调试 C 和 C++ 程序,同 GCC 配套组成了一套完整的开发环境。何谓调试?就是让代码一步一步慢慢执行,跟踪程序的运行过程。比如,可以让程序停在某个地方,查看当前所有变量的值,或者内存中的数据;也可以让程序一次只执行一条或者几条语句,看看程序到底执行了哪些代码。_gdb调试程序

随便推点

通过dba_hist_*来进行诊断-程序员宅基地

文章浏览阅读94次。在Oracle10g中增加了dba_his_*类统计信息表,在瓶颈时间过时了的时候,可以参考这些表来诊断瓶颈来源。 1、确定时间段:select * fromdba_hist_snapshot ..._dba_hist_proc

(续)linux SD卡初始化---mmc_sd_init_card函数-程序员宅基地

文章浏览阅读168次。mmc_sd_init_card剩下的关于UHS-I的分支结构。uhs-I的初始化流程图如图:红线标出的部分是已经做了的事,与上一篇那个流程图是一致的,之后就是if分支中做的事。if分支中的函数mmc_sd_init_uhs_card:/* * UHS-I specific initialization procedure */static int mmc_sd..._mmc/sd controller initialization. mmc/sd card: mid: 0x70 read block: 512 byt

CodeForces - 998D - Roman Digits(打表 找规律)(本来应该是推公式的题吧)_let's introduce a number system which is based on -程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏2次。题目链接:http://codeforces.com/problemset/problem/998/D题目:Let's introduce a number system which is based on a roman digits. There are digits I, V, X, L which correspond to the numbers 1, 5, 10 and 5..._let's introduce a number system which is based on a roman digits. there are

Android应用程序自适应屏幕大小的解决办法_<application android:screenorientation="landscape-程序员宅基地

文章浏览阅读1.4k次。android应用自适应多分辨率的解决方法 1. 首先是建立多个layout文件夹(drawable也一样)。在res目录下建立多个layout文件夹,文件夹名称为layout-800x480等。需要适应那种分辨率就写成什么。注意: a. 较大的数字要写在前面:比如layout-854x480而不能写layout-480x854._

XPATH如何选择不包含某一个属性的节点?_xpath筛选不包含的节点-程序员宅基地

文章浏览阅读3.3w次,点赞4次,收藏12次。XPATH如何选择不包含某一个属性的节点?今天博主在写一个xpath的时候就碰到了这个问题。我们知道选择包含某一特定属性的节点,可以使用例如//tbody/tr[@class]来选择。那么不含某属性的节点如何用xpath取得呢?这里可以用到not。例如排除一个属性的节点可以使用//tbody/tr[not(@class)]来写,排除一个或者两个属性可以使用//tbody/tr[no_xpath筛选不包含的节点

IP端口扫描工具(Tenable Nessus)的简介-程序员宅基地

文章浏览阅读2.2k次。Tenable Nessus是一款使用方便的 IP、端口扫描工具。 利用它可以获得被扫描计算机的 ping 响应时间、主机名称、计算机名称、工作组、登录用户名、MAC地址、TTL、NetBios 信息等;您也可以指定扫描端口,查看目标计算机开放端口的情况。Nessus是一个顶级的漏洞扫描程序,它由Tenable Network SecurityNessus 被认为是目前全世界最..._tenable nessus