校招算法系列1:算法与数据结构学习基础
校招不同于社招,不管是科班的大数据/计算机相关类专业的,还是其他专业转行大数据的小伙伴。同样大数据校招面试也是更看重基础(尤其是中大厂),校招不仅需要掌握大数据相关技术,还需要掌握一些基础知识(如计算机基础,算法数据结构),校招面试内容杂而多,如何系统化备战?
桐哥,壮哥,21年毕业研究生,目前在职快手,米哈游。俩人是校招收割机,校招拿到了美团,字节,快手,京东,滴滴,携程,小米,vivo,米哈游,好未来,小红书,garena,贝壳找房,招行,兴业银行等多家大中厂大数据校招Offer。
现在趁着热乎劲,亲自带大家进行大数据校招学习。结合自身校招经历,亲自系列化总结大数据校招知识,剖析核心知识,系统化带大家备战校招,规划学习,考勤打卡,你需要负责学习,不需要担心需要学习什么?持续更新整个系列。

1.模块学习建议
本系列是上面脑图的数据结构与算法模块,这块是校招核心,尤其是大厂必面(不管校招社招),不管是Java岗还是大数据岗位;但是数据结构与算法这块学习难度大,题型多,题目杂,牛客,leetCode有几千道,有些题目需要一定的技术背景,基础储备,否则普通人连题目都看不懂。那就必须有所取舍。这里桐哥,壮哥精选题型题目精讲系列。
2. 算法之入门基础知识储备
2.1 .学习必需知识储备
掌握主流编程语言之一:C语言,C++,JAVA,或者Python等(建议使用java)
熟悉算法的衡量方式时间复杂度,空间复杂度
2.2 知识点总结
时间复杂度:是指执行当前算法所消耗的时间,通常用「时间复杂度」来描述。
空间复杂度:是指执行当前算法需要占用多少内存空间,通常用「空间复杂度」来描述。
2.3 基础学习
为什么有这么多的数据结构和算法出现?随着互联网行业的发展,应用程序的越来越复杂、数据种类繁多、数据量庞大,百万、亿级别。这样会使得程序执行、数据处理变得很慢,设置无法执行。数据结构和算法就是来解决这些问题的。
问题又来了,它们凭什么可以改善这些问题呢?首先,不同的数据结构凭借其不同的存储方式,可以最优的适用于各种不同的业务需要。其次,经过这么多年的发展,相信都知道时间复杂度和空间复杂度这两个重点概念,我们在实际的代码开发中,都会考虑到这两者的更佳值(同一个场景下,业务逻辑不变的情况下,调整代码逻辑,使其执行速度更快,资源消耗更少)。最后,就是要感谢机器硬件配置的改善,这种发展是与时俱进的,极大地改善了代码的运行效率和环境。
对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。
时间复杂度:是指执行当前算法所消耗的时间,通常用「时间复杂度」来描述。
空间复杂度:是指执行当前算法需要占用多少内存空间,通常用「空间复杂度」来描述。
在这里举个例子简单介绍下二者的计算方法:
1. 时间复杂度
时间复杂度并不是将算法程序运行的时间作为衡量值,这种方法容易受运行环境的影响,在性能高的机器上跑出来的结果与在性能低的机器上跑的结果相差会很大。而且对测试时使用的数据规模也有很大关系。并且,我们在写算法的时候,还没有办法完整的去运行对吧。
所以,我们假设算法的问题规模为n,那么操作单元数量便用函数f(n)来表示,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这就是算法复杂度的计算方法。
一些具有迷惑性的例子:
上面这段代码的时间复杂度是 O(nlog n) 而不是 O(n^2)
上面这段代码的时间复杂度是 O(sqrt(n)) 而不是 O(n)。
再举一个例子,有一个字符串数组,将数组中的每一个字符串按照字母序排序,之后再将整个字符串数组按照字典序排序。两步操作的整体时间复杂度是多少呢?
如果回答是 O(n*nlog n + nlog n) = O(n^2log n),这个答案是错误的。字符串的长度和数组的长度是没有关系的,所以这两个变量应该单独计算。假设最长的字符串长度为 s,数组中有 n 个字符串。对每个字符串排序的时间复杂度是 O(slog s),将数组中每个字符串都按照字母序排序的时间复杂度是 O(n * slog s)。
将整个字符串数组按照字典序排序的时间复杂度是 O(s * nlog n)。排序算法中的 O(nlog n) 是比较的次数,由于比较的是整型数字,所以每次比较是 O(1)。但是字符串按照字典序比较,时间复杂度是 O(s)。所以字符串数组按照字典序排序的时间复杂度是 O(s * nlog n)。所以整体复杂度是 O(n * slog s) + O(s * nlog n) = O(n*slog s + s*nlogn) = O(n*s*(log s + log n)) = O(n*s*log(n*s))。
常见的时间复杂度量级有:O(1)、O(logN)、O(n)、O(nlogN)、O(n²)、O(n³)、O(n^k)、(2^n)等。
一些示例及经验(代码):

总结如下:
2. 空间复杂度
时间复杂度不是用来计算程序具体耗时的,那么空间复杂度也不是用来计算程序实际占用的空间的。空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势,我们用 S(n) 来定义。
空间复杂度比较常用的有:O(1)、O(n)、O(n²),我们下面来看看:
递归调用是有空间代价的,递归算法需要保存递归栈信息,所以花费的空间复杂度会比非递归算法要高。
上面算法的时间复杂度为 O(n),空间复杂度 O(1)。
上面算法的时间复杂度为 O(n),空间复杂度 O(n)。
3.老师总结
大家在初学这些的时候不需要太关注时间复杂度和空间复杂度,需要重点学习数据结构的几个分类,其存储方式、使用场景和优缺点。当有一定积累的时候,再去关注优化方面(后续的算法题也会有讲解哈)。