写在前面
疫情过后,招聘与求职受影响到底有多大?我不知道,但我的真实感受是,即使有疫情的影响,最近还是持续有朋友来跟我说他们今年工作的新动向。有人跳槽去了大厂,有人下定决心出来创业,也有人还在观望,等待更好的机会。
这位还在“等待更好机会”的朋友,其实已经拿到了几个 Offer,在我看来都是不错的方向,待遇也很可观。但其实,他自己的目标,是头条一个招聘了很久的岗位。这也能理解,每个程序员都有一个甚至几个自己的 Dream Company。
我问他既然有目标,为什么不行动,你的实力应该也没问题。他说,“说出来你可能不信,技术面我有信心,但是头条面试比较注重算法,这是我的短板,所以还得准备准备”。接着他问我,工作中大家实际用到算法的情况不是很多,为什么大厂面试一定要考,而且算法考试还都是 Hard 模式。
我想,对于很多人来说,问出来这个问题的时候,已经有答案了。第一,作为一名合格的程序员,如果你连基础的算法都学不会,那面试官肯定会怀疑你的智力以及学习能力。第二,工作中处处会用到算法,只是你没接触到而已,不信你随便打开一个开源项目,看看里面是不是有数据结构与算法的应用场景。
现在大多普通程序员都在面向业务编程,能够使用现有的语言、框架、操作系统、编译环境满足业务需求就可以了,就算不懂算法,也同样可以完成工作。
然而,在高可用架构、人工智能、云原生应用、跨平台框架、区块链这些“高大上”话题频频出现的今天,优秀的互联网企业更愿意高薪聘请的,往往是那些能与公司一起,快速跟上时代发展的人。他们熟悉计算机的底层逻辑,他们能够迅速掌握新技术的核心要领,他们能利用数学、数据结构与算法、计算机组成原理这些基础知识,提高现有的业务效率,从而创造更可观的利润。
换句话说,“僧多粥少”的情况下,企业用“算法面试”这样的方式,能帮助自己甄别更优秀的人才。
从这个角度,你也就不难理解为什么那些大公司面试,都喜欢问算法类的题目了。
今天给大家分享一份京东T8大牛手写的《数据结构与算法》学习笔记,通过这份学习笔记能够对算法有一定的了解。
《数据结构与算法》学习笔记内容简介
由于文章篇幅要求简短,这里只介绍学习笔记大概包含哪些内容。
想要说明的是,排序算法/数据结构的代码可能不是最优解,代码的实现都是以比较容易理解的方式去写的。几乎每句代码都有对应的注释,应该是能看懂的
笔记内容结构图
一、冒泡排序
冒泡排序(Bubble Sort,台湾译为:泡沫排序或⽓泡排序)是⼀种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。
二、选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始(末尾)位置,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)
三、插入排序
插入排序的基本操作就是将一个数据插入 到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。 是稳定的排序方法。
四、快速排序
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中-部分的所有数据都比另外- -部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
五、归并排序
归并排序(MERGE-SORT)是建立在归并操作.上的一种有效的排序算法该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合井,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
六、希尔排序
希尔排序(Shell's Sort)是插入排序的-种又称“缩小增量排序”(Diminishing Increment Sort)是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1 959年提出而得名。
七、堆排序
堆排序(Heapsort)是指利用堆积树(堆) 这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。
八、基数排序(桶排序)
基数排序(radix sor)属于“分配式排序"(distribution sort,又称"桶子法"(bucket sort)或binsort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些”桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为0 (nlog()m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。
九、递归
递归在程序语言中简单的理解是:方法自2调用自己
递归其实和循环是非常像的,循环都可以改写成递归,递归未必能改写成循环,这是-一个充分不必要的条件。
十、链表
十一、栈
十二、队列
十三、二叉树