有人说,懂算法,才能会编程,说的其实一点都不夸张。计算机历史上一直有一个经典的公式,那就是:程序 = 数据结构 + 算法,数据结构是程序重要基础之一。
不管是工作多年还是刚进入开发领域的,我们不可避免地要与数据结构打交道,尽管现在很多的编程语言已经封装好了大量优秀的数据结构可以供我们直接使用,但是对底层实现的了解和掌握仍是一个优秀技术人员所必备的,也是多数大公司的硬性要求。随着你的编程之路越走越远,就会逐渐意识到数据结构和算法的重要性。
讲到数据结构,就不得不讲到目前比较热门的红黑树、B+树。在互联网大厂面试中,常会被问到HashMap、索引、性能调优之类的问题。
说到HashMap,就一定要说到红黑树,红黑树作为一种平衡二叉查找树,是一种用途较广的数据结构,在jdk1.8中使用红黑树提升HashMap的性能。而讲到性能调优,MySQL索引就会被提及,如何基于索引B+树精准建立高性能索引,要与面试官侃侃而谈,就要深入去理解和掌握,在面试中才能脱颖而出。
据我了解,程序员有相当一部分对“数据结构”和“算法”的基础概念都不是很清晰,这直接导致很多人在看到有关这部分的内容就会望而却步。
实际上,当你了解了“数据结构”和“算法”存在的真正意义,以及一些实际的应用场景,对它有了一个整体的认知之后,你可能会对它产生强烈的兴趣。当然,它带将带给你的收益也是相当可观的。
很多同学在看到“数据结构”和“算法”后会有一定的抵触心理,或者尝试去练习,但是被难倒,从而放弃。
这很大一部分原因是因为你还不够了解学习他们的意义,或者没有掌握合理的练习方法。实际上,当你有了一定的目的性,并且有了合理的练习方法,再来学习这部分内容会变得得心应手。
在本文中,我就来分享一下我学习“数据结构”和“算法”的一些经验和方法。
1.1 类别说明
数据结构和算法的种类非常之多,拿树举例,树的种类包括:二叉树、B树、B+树、Trie树、红黑树等等,本文只选择了二叉树。
对初学者来讲,没有必要对某些比较偏的类型和解法多做了解,一是浪费宝贵的时间,二是应用的不多。
本文选择的数据结构和算法的类别均是出现频率最高,以及应用最广的类别。
1.2 题目说明
另外,做题时找对典型题目非常重要,可以让你更快速更高效的掌握知识,本文后面也会给出每种类型的典型题目供大家参考。
题目来源:
awesome-coding-js:一个前端算法开源项目,包括我做过的题目以及详细解析
leetcode
剑指offer