在开发面试中,算法是非常重要的一个考核环节。算法对于很多非科班出身的开发来说都比较陌生,尽管在实际开发中会多少会涉及到,但是如果没有掌握好算法,在很多功能实现上很可能不是最优或者较优,这也就是为什么开发面试中一般都会考算法。这个课程总结了互联网开发面试中常用的数据结构和算法,并且努力以最直观的方式来解释这些算法的原理。
数组、链表、栈、队列和二叉树等等,后续学习算法会用到,特定的数据结构在解决特定问题上能发挥大作用
数组是多个相同类型或者说相同大小数据的集合,它在内存中是连续存储,可以根据索引快速定位某个元素
链表也是多个元素的集合,但是这些元素在内存中并不是连续存储,而是通过额外存储的下一个节点指针来实现逻辑上的顺序连接
栈是一种线性存储结构,但是只能从栈顶添加或者入栈push和移除或出栈pop数据。栈具有先进后出FILO或后进先出LIFO的特点
队列是一种线性存储结构,但是只能从队列前端front添加或入队,从队列尾端rear移除或出队数据。队列具有先进先出FIFO的特点
二叉树是一种树形存储结构,每个节点最多有两个子节点,通常叫做左子树和右子树
二叉堆是一种基于二叉树的特殊存储结构,它可以看成是一棵完全二叉树。常见的有最大堆又叫大顶堆、大根堆和最小堆又叫小顶堆、小根堆
排序算法,主要分为比较类排序算法和非比较类排序算法,排序很多时候是解决问题的第一步
冒泡排序是一个简单的排序算法,它通过循环不断的比较和交换相邻的元素,直到所有元素有序
插入排序是一个简单的排序算法,算法主要通过在左边维持一个有序的子数组,然后不断的将右边的元素按照顺序插入到左边有序的子数组中,直到所有的元素都插入完成
选择排序是一个简单的排序算法,算法从第一个元素开始,通过不断从右边找到找到最小元素,替换当前元素,直到找到最后一个元素,数组就排序完成
归并排序采用分治的思想,通过不断的将数组一分为二,直到不可再分,然后对已排序的子数组递归合并,最后使得整个数组有序
堆排序是基于二叉堆的一种排序算法,建议先了解一下什么是堆,最大堆和最小堆,这样理解起来会更容易
面试经常遇到的一个排序算法,采用分治的思想,通过不断的选取基准元素,将数组划分为更小的数组,直到不可划分,最终达到排序的目的
计数排序是一种非比较类的排序算法,它有一定的局限性,主要适用于元素的值在一定范围的数据,但是它的效率非常高
查找算法有很多种,其中面试遇到比较多的是二分查找
贪心算法是一种在每一步选择中都采取在当前状态下最优的选择,从而希望导致结果是最好或最优的算法
动态规划算法一般用于求解一类具有重叠子问题和最优子结构性质的最优化问题
与图相关的算法,比如图的深度优先遍历和广度优先遍历、最小生成树、最短路径等
图是一种复杂的非线形数据结构,由若干个顶点和连结顶点之间的边组成,根据不同的性质,图可以分为有权图和无权图,有向图和无向图,连通图和非连通图
深度优先遍历思路是,从某个顶点开始遍历,沿着一条路径一直遍历,直到路径的尽头,然后再返回上一个顶点,找相邻未访问的顶点继续遍历,直到顶点全部遍历完
广度优先遍历的思路是,从某个顶点开始遍历,然后遍历它所有相邻的顶点,然后依次遍历相邻顶点的所有相邻顶点,直到所有的节点都遍历完。
Dijkstra算法是一个单源最短路径算法,也就是一次只能求从一个顶点到其余各顶点的最短路径,不支持存在负权的图
Floyd算法是一种求多源最短路径的算法,并且支持有负权的图,但不可以存在负权回路,它是一种动态规划算法
Prim算法是一种最小生成树算法,因为算法执行过程中每次都是选取与树中的点构成的边最小的点,所以被叫做加点法
Kruskal算法是一种最小生成树算法,他通过不断选择权值最小的边来构成一棵树,所以叫做加边法。
一些稍微复杂一点的数据机构,比如并查集、线段树、树状数组、字典树等,这些数据结构能非常高效的解决某一类问题
并查集是一种维护集合的数据结构,用于处理一些不相交集合的合并及查询问题,主要有查找和合并两种操作。
线段树是一种树形结构,主要用于维护区间信息,可以在O(logN)的时间复杂度内实现单点修改、区间修改、区间查询、区间求和等操作
树状数组和线段树一样,也是用来维护区间信息的,不过实现起来比线段树更加简洁,但是没有线段树灵活、强大。
又称前缀树,trie树,顾名思义,它是一种型似字典的树形结构,主要用于快速检索字符串是否存在,查找时间复杂度时O(n),n是查找的字符串长度。
这是字符串相关算法中比较重要的一类算法,通常用于在大量的文本或字符串中查找某些目标字符串