算法
数据结构(线性-数组 链表 堆栈 队列 哈希 | 树-二叉树 图 其他-跳表 哈希链表 位图 )
时间复杂度:线性-n 对数-logn 常量-2 多项式-0.5n^2+0.5n 1<logn<n<n^2
空间复杂度:常量-1 线性-n 二维空间-n^2 递归空间
数组,顺序存储,读和更新O(1),插入和删除O(n)
链表,读O(n),写 更新 删除为 O(1)
一个逻辑结构,可由多个物理结构实现
逻辑:线性(顺序表 堆栈 队列=>双端队列+优先队列) 非线性(树 图)
物理:顺序(数组) 链式(链表) ==> 时间复杂度为 O(1)
散列表:读写为 O(1) ,哈希冲突(开地址法-冲突后寻找下一个空位,链表法-拉出链条-红黑树) 扩容(扩充长度 + 重新Hash)
堆排序
二叉树:链式存储结构(left-data-right)+数组(父节点 parent + 左孩子 2*parent+1 + 右孩子 2*parent+2)
数组用完全二叉树,稀疏二叉树浪费空间
二叉树的遍历(深度优先(前-根左右 中-左根右 后-左右根 序遍历) 广度优先(层级遍历))
二叉树的四种遍历方式分别是:先序、中序、后序和层次。O(n) 宽度+深度
二叉堆,本质是完全二叉树。大顶堆,小顶堆,上浮和下沉,实现上可考虑数组。场景是用于优先队列,出入队列
比较排序
冒泡排序:打标记,如果已经有序则终止外部循环;设定有序数列边界,减少外部循环次数。衍生:鸡尾酒排序,左往右比较,右往左比较
快速排序:基准元素随机选择,单边和双边循环法
线性排序
计数排序:元素个数
桶排序:区间原理
算法运用:
tag:bitmap存储用户标签,容易获取交集和并集 | 通过与全量用户进行异或操作可取反
lru:区分常用区和非常用区,自动淘汰机制
red: 二倍均值,线段切割 ,都是为了保持数据均衡
面试算法:
有环:追击问题,一点比另一点多走一步
最小元素的栈:两个栈,两个同时入栈,表大小,大则只进第一个栈,小则同时进入两个栈,
最大公约数:暴力枚举 辗转相除 更相减损术 更相减损术与移位相结合
2的整数次幂:十进制转换成2进制,减去一,进行按位与运算
最大相临差:桶排序,每个桶差值大小
栈模拟队列:两个栈,倒一遍,后进先出变为先进先出
全排列下一个:保持最高位不变,数字顺序小变大,又称字典排序
删除k个数字之后最小值:某个数字大于右边的,就删除它
大整数相加:两个大整数倒序,进位后,反向就是结果值
金矿问题:动态规划 ,又称背包问题,挖与不挖的问题,0为边界
缺少整数:整数求和,依次相减