大厂算法面试
1) 图论
2) 大数据
3)动态规划
优秀的算法往往取决于你采取那种数据结构
高级数据结构
1)优先队列
2)图
3)前缀树
4)线段树
5)树状数组
在分析问题的时候,回归本质,迎刃而解
优先队列
与普通队列的区别:
1)保证每次取出的元素是队列中优先级别最高的
2)优先级别可以定义
最常用的场景
从杂乱无章的数据中按一定的顺序筛选数据
本质
二叉堆结构,Binary Heap ,利用一个数组结构来实现完全二叉树
优先队列的基本操作就俩个
1)向上筛选
插入元素的时候,新元素放在树的尾部,不断向上筛选
2)向下筛选
堆顶的元素被取出时候,将堆底部的元素放入堆顶部,不断向下筛选
优先队列初始化:(最重要的时间复杂度)O(n)
解决办法:(前K个)
1)如何定义优先级
2)以前数据结构
图
最基本的知识点:
1)阶,度
2)树,森林,环
3)有向图,无向图,完全有向图,完全无向图
4)连通图,连通分量
图的存储和表达方式:
邻接矩阵 ,邻接链表
围绕图的算法:
图的遍历: 深度优先,广度优先
环的检测:有向图,无向图
拓扑排序
最短路算法:Dijkstra ,Bellman-Ford ,Floyd Warshall
连通性相关的算法:Kosaraju ,Tarjan ,求解孤岛的数量,判断是否为树
图的着色,旅行商问题
必须掌握
二分图:
前缀树(Trie 树)
也称为字典树
广泛运用在字典查找中
方法一:暴力搜索 O(M* N)
方法二:前缀树 O(M)
重要性质:
1)每个节点至少包含俩个基本属性
- children :数组或集合,罗列出每个分支当中包含的所有字符
- isEnd :布尔值,表示该节点是否为某字符串的结尾
根节点是空的
除了跟节点,其他所有节点都有可能是单词的结尾,叶子节点一定是单词的结尾
最基本的操作:
1) 创建
遍历一遍输入的字符串,对每个字符串的字符进行遍历
从前缀树的根节点开始,将每个字符加入到节点的children字符集当中
如果字符集已经包含了这个字符,跳过
如果当前字符是字符串的最后一个,把当前节点的isEnd标记为真
2)搜索
从前缀树的根节点出发,逐个匹配输入的前缀字符
如果遇到了,继续往下一层搜索
如果没遇到,立即返回
线段树
假设我们有一个数组array[0…n-1],里面有n个元素,现在我们要经常对这个数组做两件事:
1.更新数组元素的数值
2.求数组任意一段区间里元素的总和(或者平均值)
方法一:遍历一遍数组
时间复杂度:On)
方法二:线段树
O(logn)
什么是线段树
一种按照二叉树的形式存储数据的结构,每个节点保存的都是数组里某一段的总和
例如
数组是[1,3,5,7,9,11}
树状数组 Binary Index Tree
先从一个例题出发
假设我们有一个数组array[0…n-1],里面有n个元素,现在我们要经常对这个数组做两件事:
1.更新数组元素的数值
2.求数组前k个元素的总和(或者平均值)
方法一:线段树
时间复杂度:O(logn)
重要的基本特征
利用数组来表示多叉树的结构,和优先队列有些类似
优先队列是用数组来表示完全二叉树,而树状数组是多叉树
树状数组的第一个元素是空节点
如果节点treely]是tree[x的父节点,那么需要满足y=X-(仪&()
总结
1)优先队列:常见面试考点,实现过程比较繁琐。在解决面试中的问题时,实行“拿来主义”即可
2)图:被广泛运用的数据结构,如大数据问题都得运用图论,在社交网络里,每个人可以用图的顶点表示,人与人直接的关系可以用图的边表示,在3)最短路径算法
地图上,要求解从起始点到目的地,如何行驶会更快捷,需要运用图论里的
3) 前缀树:出现在面试的难题中,要求能熟练地书写它的实现以及运用
4)线段树和树状数组:应用场合比较明确
如果要求在一幅图片当中修改像素的颜色,求解任意矩形区间的灰度平均值,则需要采用二维的线段树