# 👨🏫 宝典介绍
图灵奖获得者,Pascal之父尼克劳斯·维尔特曾经说过:程序 = 数据结构 + 算法。

编程从本质上来说就是算法加数据结构。甚至可以说一切计算机技术,包括本科阶段要学的计算机操作系统、计算机网络、数据库系统等等,以及各种技术框架和库无不建立在算法和数据结构之上的。
然而现实是大部分工作很少会直接用到算法或数据结构,多数都是写CRUD或处理业务逻辑。即使完全不懂算法和数据结构,也可以把工作做好。
所以对于初入门的程序员来说,算法和数据结构似乎是可有可无的。很多人算法的巅峰水平可能就是大学毕业的时候,随着工作年限增长,不常用的算法与数据结构知识基本就忘光了。
矛盾的是,工作不常用的算法和数据结构却在程序员面试中频频出现。面试前去LC刷题几乎是每个程序员都有的经历。
很多人因此抱怨“面试造火箭,工作拧螺丝”,为什么越来越多公司面试要手撕算法题?
首先,互联网工业界需要的人才特质:学东西快、聪明、反应迅速;精力体力好,能快速出活。这一点国内外都一样。
面试考算法做题,主要是为了筛选出一批聪明又勤奋的人,同时也保证这些人能写代码,懂系统,又懂数据结构与算法。真正到实际工作的时候,只要简单说明下框架、其他技术和工具上手适应后就能马上出活了。
其次,对于面试官来说,考算法准备起来比较方便。也能相对公平地考察候选人的各项能力,也能间接看出这个人在日后工作中解决问题的能力、学习能力和成长潜力。
通过算法面试,至少可以看出候选人3方面的能力:
1.沟通能力。面试官给出一道题,你能不能准确理解题意,能否问出有价值的问题;是和面试官讨论完再做题,或是边沟通边做题,还是埋头写完再解释?这些都可以纳入到面试考察里。
2.逻辑思维能力。一种情况是你很快做完题,这时面试官一般会继续follow up问题,看你能否快速反应和解决。另外一种情况是你不会,但是在面试官的提示下能够move fast,给出自己的想法和方案,并进一步优化。
3.代码质量。资深面试官从你写出的代码一般就能看出个大概。包括代码有没有写完,代码风格好不好(比如可读性,变量名、函数名命名,空格与空行的正确使用等),异常检测以及bug free。越高级别的面试官可能越在意你的代码质量。
因此如果是准备求职、面试的话,一定要着重掌握以下算法与数据结构知识点包括:
算法
- 二分搜索 Binary Search
- 分治 Divide Conquer
- 宽度优先搜索 Breadth First Search
- 深度优先搜索 Depth First Search
- 回溯法 Backtracking
- 双指针 Two Pointers
- 动态规划 Dynamic Programming
- 扫描线 Scan-line algorithm
- 快排 Quick Sort
数据结构
- 栈 Stack
- 队列 Queue
- 链表 Linked List
- 数组 Array
- 哈希表 Hash Table
- 二叉树 Binary Tree
- 堆 Heap
- 并查集 Union Find
- 字典树 Trie
最后,在软件开发行业,从来都是算法先行,次基础,技术为末。这也是程序员从业者金字塔的层级关系分布。越往上走,你会发现需要了解和掌握的是越接近底层的知识,而这些往往都离不开基础的算法与数据结构。
所以工作个三五年,不管算法扎不扎实,大概都可以达到中级水平,但想再往上走,算法基础不好的话会比较吃力,导致遇到瓶颈。所以算法和数据结构现在用的可能不多,但不代表它不重要。相反,它可能是支撑你程序员生涯的重要一环。