数据结构与算法学习的必要性是什么?

发表时间: 2021-03-04 22:24

最近,很多粉丝后台留言:“猿人,能不能帮忙整理一份学习数据结构与算法的书籍资料,我感觉现在对数据结构与算法这块基础很薄弱,需要补习下”。为了满足每一位粉丝的需求,猿人花半个月的时间给大家整理了一份学习资料(精华电子书),希望有需要的粉丝能认真阅读。

编程好比是一辆汽车,而数据结构和算法是汽车内部的变速箱。一个开车的人不懂变速箱的原理也是能开车的,同理一个不懂数据结构和算法的人也能编程。但是如果一个开车的人懂变速箱的原理,比如降低速度来获得更大的牵引力,或者通过降低牵引力来获得更快的行驶速度。那么爬坡时使用1档,便可以获得更大的牵引力;下坡时便使用低档限制车的行驶速度。回到编程而言,比如将一个班级的学生名字要临时存储在内存中,你会选择什么数据结构来存储,数组还是ArrayList,或者HashSet,或者别的数据结构。如果不懂数据结构的,可能随便选择一个容器来存储,也能完成所有的功能,但是后期如果随着学生数据量的增多,随便选择的数据结构肯定会存在性能问题,而一个懂数据结构和算法的人,在实际编程中会选择适当的数据结构来解决相应的问题,会极大的提高程序的性能。

一、数据结构

数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。

1.1 常用数据结构

1.2 优缺点

二、算法

算法是一组完成任务的指令,任何代码片段都可视为算法。

优秀的小伙伴都知道,学好算法与数据结构,不单单是为了应付技术面试的需要,更重要是提升自身编程水平。那么程序员到底需不需要精通算法呢?首先,一个出色的程序员并不一定要精通算法,毕竟发展的方向很多。但是,一个人连基本的算法都掌握不了,他肯定成不了优秀的程序员。前者是选择,后者是能力,能力不够的人谈选择,就是找借口。有个程序员小哥哥说:搬砖 + 算法 = 稳定快速的搬砖,真相了,高质量的代码,才能让项目运行如飞!确认过眼神 ,修炼过算法的人,是高手程序员没错了。

在Java中,算法通常都是由类的方法来实现的。前面的数据结构,比如链表为啥插入、删除快,而查找慢,平衡的二叉树插入、删除、查找都快,这都是实现这些数据结构的算法所造成的。我们讲的各种排序实现也是算法范畴的重要领域。

2.1 算法的五个特征

①、有穷性:对于任意一组合法输入值,在执行有穷步骤之后一定能结束,即:算法中的每个步骤都能在有限时间内完成。

②、确定性:在每种情况下所应执行的操作,在算法中都有确切的规定,使算法的执行者或阅读者都能明确其含义及如何执行。并且在任何条件下,算法都只有一条执行路径。

③、可行性:算法中的所有操作都必须足够基本,都可以通过已经实现的基本操作运算有限次实现之。

④、有输入:作为算法加工对象的量值,通常体现在算法当中的一组变量。有些输入量需要在算法执行的过程中输入,而有的算法表面上可以没有输入,实际上已被嵌入算法之中。

⑤、有输出:它是一组与“输入”有确定关系的量值,是算法进行信息加工后得到的结果,这种确定关系即为算法功能。

2.2 算法的设计原则

1、正确性:算法的正确性是指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需要、能够得到问题的正确答案。

2、可读性:设计算法的目的,一方面是为了让计算机执行,但还有一个重要的目的就是为了便于他人的阅读,让人理解和交流,自己将来也可阅读。如果可读性不好,时间长了自己都不知道写了什么,可读性是评判算法(也包括实现它的程序代码)好坏很重要的标志。

3、健壮性:当输入的数据非法时,算法应当恰当地做出反应或进行相应处理,而不是莫名其妙的输出结果。并且处理出错的方法不应是中断程序的执行,而应是返回一个表示错误或错误性质的值,以便于在更高的抽象层次上进行处理。

4、高效率与低存储量:通常,算法的效率指的是算法的执行时间;算法的存储量指的是算法执行过程中所需要的最大存储空间,两者的复杂度都与问题的规模有关。算法分析的任务是对设计的每一个具体的算法,利用数学工具,讨论其复杂度,探讨具体算法对问题的适应性。

三、如何找资料学习

第一篇要给大家推荐的是BAT LeetCode 刷题手册,想通过 LeetCode 提⾼算法能⼒的编程爱好者一定要认真阅读此手册。

本电⼦书的左上⻆有搜索栏,可以迅速帮你找到你想看的章节和题号。

关于题解,笔者建议这样使⽤:先⾃⼰读题,思考如何解题。如果 15 分钟还没有思路,那么先看笔者的解题思路,但是不要看代码。有思路以后⾃⼰⽤代码实现⼀遍。如果完全不会写,那就看笔者提供的代码,找出⾃⼰到底哪⾥不会写,找出问题记下来,这就是⾃⼰要弥补的知识漏洞。如果⾃⼰实现出来了,提交以后有错误,⾃⼰先debug。AC 以后没有到 100% 也先⾃⼰思考如何优化。如果每道题⾃⼰都能优化到 100% 了,那么⼀段时间以后进步会很⼤。所以总的来说,实在没思路,看解题思路;实在优化不到 100%,看看代码。

猿人推荐,文末获取:

  • BAT LeetCode 刷题手册

同时也给大家整理了Java经典算法,读者可以一个个去验证,去调试,思考下如果在面试过程中出现了这样的算法题,该如何实现?

猿人推荐,文末获取:

  • JAVA经典算法

啊哈算法是一本让你在学习算法的过程中感到愉悦的书籍,学习算法是很枯燥的,但这本书里的内容有趣、能通俗易懂的讲解算法知识,有趣的形式讲解排序、栈、队列、链表、枚举等知识,图文并茂,非常值得推荐。

猿人推荐,文末获取:

  • 啊哈算法

一个简单而又功能强大的程序,令用户欣喜而又不让程序员苦恼,这正是程序员的终极目标。编程珠玑这本书通过基础、性能、实战应用三部分给程序员讲解了如何写代码,如何编程,代码调优的法则等等。

猿人推荐,文末获取:

  • 编程珠玑

大家知道,程序是利用计算机高速运算能力来协助我们处理一些需要海 量运算得出结果的问题,应用程序花哨的界面和有效的用户体验,归根 到底都需要在后台看不见的地方进行运算,得出我们需要的结果——无 论是在气象预报还是“极品飞车”。

正所谓“巧妇难为无米之炊”,再强大的计算机,也是要有“米”下锅才可以干活的,否则就是一堆破铜烂铁。这个“米”就是数据。

大话数据结构这本书就是这样让你如此轻松、结合实际例子来进行讲解学习,生动而有趣。

猿人推荐,文末获取:

  • 大话数据结构

同时还给大家整理了数据结构与算法分析 Java 描述、算法(第四版)、算法导论中文第三版、算法图解等资料书籍,都是精华电子书籍。

猿人推荐,文末获取:

  • 数据结构与算法分析 Java 描述
  • 算法(第四版)
  • 算法导论中文第三版
  • 算法图解
我是「猿码天地」,一个热爱技术、热爱编程的IT猿。技术是开源的,知识是共享的!写作是对自己学习的总结和记录,如果您对 Java、分布式、微服务、中间件、Spring Boot、Spring Cloud等技术感兴趣,可以关注我的动态,我们一起学习,一起成长!用知识改变命运,让家人过上更好的生活,互联网人一家亲!——猿人《猿码天地》
你多学一样本事,就少说一句求人的话,现在的努力,是为了以后的不求别人,实力是最强的底气。记住,活着不是靠泪水博得同情,而是靠汗水赢得掌声。——《写给程序员朋友》

获取方式:私信回复“S001免费领取!