北上广容不下肉身,
三四线放不下灵魂,
程序员里没有穷人,
有一种土豪叫 算法工程师。
程序 = 数据结构 + 算法
程序是为了解决实际问题而存在的。然而为了解决问题,必定会使用到某些数据结构以及设计一个解决这种数据结构的算法。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。编程实战算法,不是念PPT,我们讲的就是实战与代码实现与企业应用。
程序 = 数据结构 + 算法
——图灵奖得主,计算机科学家N.Wirth(沃斯)
作为程序员,我们做机器学习也好,做python开发也好,java开发也好。
有一种对所有程序员无一例外的刚需 —— 算法与数据结构
日常增删改查 + 粘贴复制 + 搜索引擎可以实现很多东西。
同样,这样也是没有任何竞争力的。
我们只可以粘贴复制相似度极高的功能,稍复杂的逻辑没有任何办法。
语言有很多,开发框架更是日新月异3个月不学就落后
我们可以学习很多语言,很多框架,但招聘不会考你用5种语言10种框架实现同一个功能。真正让程序员有区分度,企业招聘万年不变的重点 —— 算法与数据结构。算法代表程序员水平的珠穆朗玛。
尹成学员 李宝仪的录用通知书
两数之和
两数相加
无重复字符的最长子串
寻找两个正序数组的中位数
最长回文子串
Z 字形变换
整数反转
字符串转换整数 (atoi)
回文数
正则表达式匹配
盛最多水的容器
整数转罗马数字
罗马数字转整数
最长公共前缀
三数之和
最接近的三数之和
电话号码的字母组合
四数之和
删除链表的倒数第N个节点
有效的括号
合并两个有序链表
括号生成
合并K个排序链表
两两交换链表中的节点
K 个一组翻转链表
删除排序数组中的重复项
移除元素
实现 strStr()
两数相除
串联所有单词的子串
下一个排列
最长有效括号
搜索旋转排序数组
排序数组中查找元素的第一个和最后一个位置
搜索插入位置
有效的数独
解数独
外观数列
组合总和
组合总和 II
缺失的第一个正数
接雨水
字符串相乘
通配符匹配
跳跃游戏 II
全排列
全排列 II
旋转图像
字母异位词分组
Pow(x, n)
N皇后
N皇后 II
最大子序和
螺旋矩阵
跳跃游戏
合并区间
插入区间
最后一个单词的长度
螺旋矩阵 II
第k个排列
旋转链表
不同路径
不同路径 II
最小路径和
有效数字
加一
二进制求和
文本左右对齐
x 的平方根
爬楼梯
简化路径
编辑距离
矩阵置零
搜索二维矩阵
颜色分类
最小覆盖子串
组合
子集
单词搜索
删除排序数组中的重复项 II
搜索旋转排序数组 II
删除排序链表中的重复元素 II
删除排序链表中的重复元素
柱状图中最大的矩形
最大矩形
分隔链表
扰乱字符串
合并两个有序数组
格雷编码
子集 II
解码方法
反转链表 II
复原IP地址
二叉树的中序遍历
不同的二叉搜索树 II
不同的二叉搜索树
交错字符串
验证二叉搜索树
恢复二叉搜索树
相同的树
开篇词:算法是进入IT名企的钥匙
第一部分:数据结构
一 数据结构基础
1.1什么是数据结构
1.2基本概念和术语
1.3抽象数据类型的表示与实现
1.4算法和算法分析
1.4.1算法
1.4.2算法设计的要求
1.4.3算法的时间复杂度度量与空间复杂度度量
1.4.4算法的存储空间需求
二 线性表
2.1线性表的类型定义
2.2线性表的业务结构
2.3 ArrayList类的完整实现
2.4线性表的链式表示和实现
2.5LinkedList单链表类的实现
2.7循环单链表实现
2.8双向链表实现
2.9双向环链表实现
2.10 大数乘法的数组与链表实战
2.11数组排序
2.11.1选择排序与性能分析优化
2.11.2冒泡排序与性能分析优化
2.11.3希尔排序与性能分析优化
2.11.4插入排序与性能分析优化
2.11.5二分查找插入排序与性能分析优化
2.11.6归并排序与性能分析优化
2.11.7快速排序与性能分析优化
2.11.8奇偶排序与性能分析优化
2.11.9基数排序与性能分析优化
2.11.10木桶排序与性能分析优化
2.11.11归并排序与性能分析优化
2.11.12鸡尾酒排序与性能分析优化
2.11.13地精排序与性能分析优化
2.11.14堆排序与性能分析优化
2.11.15锦标赛排序与性能分析优化
2.11.16梳子排序与性能分析优化
2.12查找
2.12.1无序查找
2.12.2有序查找
2.12.3.1 二分查找
2.12.3.2 中值查找
2.12.3.3 斐波那契查找
2.12.3.4 三分查找
2.12.3.5 二分查找近似查找
2.13链表排序
2.13.1链表插入排序
2.13.2链表选择排序
2.13.3链表冒泡排序
2.13.4链表快速排序
2.13.5链表归并排序
2.14数组与链表时空效率比较
三 哈希表与集合
3.1哈希函数
3.2哈希碰撞
3.3哈希表数组实现
3.4哈希表链表实现
3.5集合概念
3.6交集,并集,差集
3.7数组集合
3.8链表集合
3.9哈希集合
3.10哈希表用于数据查找
3.11集合用于数据处理
四 栈和队列
4.1栈
4.1.1抽象数据类型栈的定义
4.1.2栈的表示和实现
4.1.2.1 数组栈
4.1.2.2 正向链式栈
4.1.2.3 反向链式栈
4.2栈的应用举例
4.2.1数制转换
4.2.2括号匹配的检验
4.2.3行编辑程序
4.2.4迷宫求解
4.2.5表达式求值
4.2.6汉诺塔
4.3栈与递归的实现
4.4队列
4.4.1抽象数据类型队列的定义
4.4.2链队列——队列的数组表示和实现
4.4.3链队列——队列的链式表示和实现
4.4.4循环队列——队列的数组表示和实现
4.4.5双端队列——队列的数组表示和实现
4.4.6双端队列——队列的链表表示和实现
4.4.7优先队列初步——队列的数组表示和实现
4.4.8优先队列初步——队列的链表表示和实现
4.5离散事件模拟
4.6用栈模拟递归
4.7用队列模拟递归
4.8树状文件夹遍历
4.9栈的用途
4.10队列的用途
五 字符串
5.1 串及串匹配
5.2 蛮力算法
5.3 KMP算法
5.4 BM算法
5.5 Karp-Rabin算法
5.6字符串实现高精度加法
5.7字符串实现高精度减法
5.8字符串实现高精度乘法
5.9字符串实现高精度除法
5.10AC自动机
5.11分词与SIM哈希
六 数组和矩阵
6.1 数组
6.1.1 抽象数据类型
6.1.2 不规则二维数组
6.1.3 数组嵌套
6.2 矩阵
6.2.1 定义和操作
6.2.2 类matrix
6.3 特殊矩阵
6.3.1 定义和应用
6.3.2 对角矩阵
6.3.3 三对角矩阵
6.3.4 三角矩阵
6.3.5 对称矩阵
6.4 特殊矩阵与稀疏矩阵
6.4.1 基本概念
6.4.2 用单个线性表描述
6.4.3 用多个线性表描述
6.4.4 性能测量
6.4.5矩阵的压缩存储
6.5广义表的定义
6.6广义表的存储结构
6.7m元多项式的表示
6.8广义表的递归算法
6.8.1求广义表的深度
6.8.2复制广义表
6.8.3建立广义表的存储结构
七 树和二叉树
7.1树的定义和基本术语
7.2二叉树
7.2.1二叉树的定义
7.2.2二叉树的性质
7.2.3二叉树的存储结构
7.2.4二叉树的实现
7.3遍历二叉树和线索二叉树
7.3.1遍历二叉树
7.3.2线索二叉树
7.4树和森林
7.4.1树的存储结构
7.4.2森林与二叉树的转换
7.4.3树和森林的遍历
7.5树与等价问题
7.6编码树,Huffman树及其应用
7.7.1最优二叉树(Huffman树)
7.7.2Huffman编码实现压缩解压缩
7.7回溯法与树的遍历
7.8树的计数
八 平衡搜索树
8.1 AVL树
8.1.1 定义
8.1.2 AVL树的高度
8.1.3 AVL树的描述
8.1.4 AVL搜索树的搜索
8.1.5 AVL搜索树的插入
8.1.6 AVL搜索树的删除
8.2 红-黑树
8.2.1 基本概念
8.2.2 红-黑树的描述
8.2.3 红-黑树的搜索
8.2.4 红-黑树的插入
8.2.5 红-黑树的删除
8.2.6 实现细节的考虑及复杂性分析
8.3 分裂树
8.3.1 介绍
8.3.2 分裂树的操作
8.3.3 折算复杂性
8.4 B-树
8.4.1 索引顺序访问方法
8.4.2 m叉搜索树
8.4.3 m阶B-树
8.4.4 B-树的高度
8.4.5 B-树的搜索
8.4.6 B-树的插入
8.4.7 B-树的删除
8.4.8 节点结构
九 图
9.1 基本概念
9.2 应用和更多的概念
9.3 特性
9.4 抽象数据类型graph
9.5 无权图的描述
9.5.1 邻接矩阵
9.5.2 邻接链表
9.5.3 邻接数组
9.6 加权图的描述
9.7 类实现
9.7.1 不同的类
9.7.2 邻接矩阵类
9.7.3 扩充chain类
9.7.4 链表类
9.8 图的遍历
9.8.1 广度优先搜索
9.8.2 广度优先搜索的实现
9.8.3 方法graph:bfs的复杂性分析
9.8.4 深度优先搜索
9.8.5 深度优先搜索的实现
9.8.6 方法graph:dfs的复杂性分析
9.9 应用
9.9.1 寻找一条路径Dijskra算法
9.9.2 连通图及其构成
9.9.3 最小生成树,普里姆算法,克鲁斯卡尔算法 BottleNeck算法,MstReducePrim算法,SecondaryMst算法
9.9.4 最短路径 A*算法 floyd算法 Dijskra算法 Bellman算法,SPFA算法,JohnSon算法
9.9.5拓扑排序
9.10 网络流
9.10.1 流网络
9.10.2 Ford\Fulkerson方法
9.10.3 最大二分匹配
9.10.4 推送重贴标签算法
9.10.5 前置重贴标签算法
9.11拓扑排序
9.12欧拉回路
9.13DAG有向无环图
第10天 跳表和字典
10.1 字典
10.2 抽象数据类型
10.3 线性表描述
10.4 跳表表示(可选)
10.4.1 理想情况
10.4.2 插入和删除
10.4.3 级的分配
10.4.4 结构skipNode
10.4.5 类skipList
10.4.6 skipList方法的复杂度
十一 bitmap与布隆过滤器
11.1位运算快速回顾与bitset实现
11.2 bitmap实战
11.3 布隆过滤器实现
十二 外部排序
12.1外存信息的存取
12.2外部排序的方法
12.3多路平衡归并的实现
12.4置换选择排序
12.5最佳归并树
十三 文件
13.1有关文件的基本概念
13.2顺序文件
13.3索引文件
13.4isam文件和vsam文件
13.4.1isam文件
13.4.2vsam文件
13.5直接存取文件(散列文件)
13.6多关键字文件
13.6.1多重表文件
13.6.2倒排文件
十四 优先级队列
14.1 定义和应用
14.2 抽象数据类型
14.3 线性表
14.4 堆
14.4.1 定义
14.4.2 大根堆的插入
14.4.3 大根堆的删除
14.4.4 大根堆的初始化
14.4.5 类maxHeap
14.4.6 堆和STL
14.5 左高树
14.5.1 高度优先与宽度优先的最大及最小左高树
14.5.2 最大HBLT的插入
14.5.3 最大HBLT的删除
14.5.4 两棵最大HBLT的合并
14.5.5 初始化
14.5.6 类maxHblt
14.6 堆延申
14.6.1 斐波那契堆
14.6.2 Treap
14.6.3 pair堆
14.6.4 rank-pair堆
14.6.5 二项堆
14.7 应用
14.7.1 堆排序
14.7.2 机器调度
十五 Java JVM内存回收管理演变
15.1概述
15.2可利用空间表及分配方法
15.3边界标识法
15.3.1可利用空间表的结构
15.3.2分配算法
15.3.3回收算法
15.4伙伴系统
15.4.1可利用空间表的结构
15.4.2分配算法
15.4.3回收算法
15.5无用单元收集
15.6存储紧缩
十六 竞赛树
16.1 赢者树和应用
16.2 抽象数据类型WinnerTree
16.3 赢者树的实现
16.3.1 表示
16.3.2 赢者树的初始化
16.3.3 重新组织比赛
16.3.4 类completeWinnerTree
16.4 输者树
16.5 应用
16.5.1 用最先适配法求解箱子装载问题
16.5.2 用相邻适配法求解箱子装载问题
第17章 高级树
17.1 伸展树
17.2 B+树
17.3 2-3树
17.4 kd-树
17.5 树堆
17.6 散列树
17.7 topTree
17.8 笛卡尔树
17.9 T树
17.10 Dancing Tree
17.11 前缀树后缀树基数树
17.12 R树 线段树
17.13 区间树
17.14PQ树
17.15 VEB树
17.16 Link-cut tree与Cover tree
17.17 并查集
第二部分:算法
一 数学基础
1.1 函数增长与复杂性分类
1.1.1 渐进符号
1.1.2 阶的计算
1.1.3 复杂性分类
1.2 概率论
1.2.1 事件与概率
1.2.2 期望与方差
1.3 代数学
1.3.1 矩阵
1.3.2 行列式
1.3.3 解线性方程组
1.3.4 多项式
1.1.5 复数
1.1.6 群
1.4 组合学
1.4.1 排列与组合
1.4.2 鸽巢原理
1.4.3 容斥原理
1.4.4 特殊计数序列
1.4.5 Pólya计数定理
1.5 博弈论
1.5.1 博弈树
1.5.2 SG函数
1.5.3 Nim游戏与Nim
1.6 数论
1.6.1 整除
1.6.2 不定方程
1.6.3 同余方程与欧拉定理
1.6.4 原根、离散对数和二项同余方程
1.6.5 连分数
二 初等数论与组合数学
2.1 整除
2.2 质数与合数
2.3 质数筛法
2.4 质因数分解
2.5 最大公约数和最小公倍数
2.6 模运算
2.7 同余
2.8 欧几里得算法
2.9 扩展欧几里得算法
2.10 模意义下的乘法逆元
2.11 与质数有关的定理
2.12 线性同余方程
2.13 中国剩余定理
2.14基本计数原理
2.15 排列
2.16 组合
2.17 杨辉三角
2.18 特殊排列组合
2.19 stirling数
2.20 Catalan数
2.21 容斥原理
2.22 鸽巢原理
三 暴力求解法
3.1 简单枚举
3.2 枚举排列
3.2.1 生成1~n的排列
3.2.2 生成可重集的排列
3.2.3 解答树
3.2.4 下一个排列
3.3 子集生成
3.3.1 增量构造法
3.3.2 位向量法
3.3.3 二进制法
3.4 回溯法
3.4.1 八皇后问题
3.4.2 其他应用举例
3.5 路径寻找问题
3.6 迭代加深搜索
四 数论算法
4.1 基础数论概念
4.2 最大公约数
4.3 模运算
4.4 求解模线性方程
4.5 中国余数定理
4.6 元素的幂
4.7 RSA公钥加密系统
4.8 素数的测试
4.9 整数的因子分解
五 概率分析和随机算法
5.1 雇用问题
5.2 指示器随机变量
5.3 随机算法
5.4 概率分析和指示器随机变量的进一步使用
5.4.1 生日悖论
5.4.2 球与箱子
5.4.3 特征序列
5.4.4 在线雇用问题
六 贪婪算法
6.1 最优化问题
6.2 贪婪算法思想
6.3 应用
6.3.1 货箱装载
6.3.2 0/1背包问题
6.3.3 拓扑排序
6.3.4 二分覆盖
6.3.5 单源最短路径
6.3.6 最小成本生成树
6.3.7赫夫曼编码
6.3.8 拟阵和贪心算法
6.3.9 用拟阵求解任务调度问题
七 分而治之
7.1 算法思想
7.2 应用
7.2.1 残缺棋盘
7.2.2 归并排序
7.2.3 快速排序
7.2.4 选择
7.2.5 相距最近的点对
7.3 解递归方程
7.4 复杂度的下限
7.4.1 最小最大问题的下限
7.4.2 排序算法的下限
7.4.3 最大子数组问题
7.4.4 矩阵乘法的Strassen算法
7.4.5 用代入法求解递归式
7.4.5 用递归树方法求解递归式
7.4.6 用主方法求解递归式
7.4.7 证明主定理
7.4.8 对b的幂证明主定理
7.4.9 向下取整和向上取整
八 动态规划
8.1 算法思想
8.2 应用
8.2.1 0/1背包问题
8.2.2 矩阵乘法链
8.2.3 所有顶点对之间的最短路径
8.2.4 带有负值的单源最短路径
8.2.5 网组的无交叉子集
8.2.6 钢条切割
8.2.7 最长公共子序列
8.2.8 最优二叉搜索树
8.2.9 最大连续子序列和
8.2.10 最长不下降子序列(LIS)
8.2.11 最长回文子串
8.2.12 DAG最长路
8.2.13 背包问题
九 回溯法
9.1 算法思想
9.2 应用
9.2.1 货箱装载
9.2.2 0/1背包问题
9.2.3 最大完备子图
9.2.4 旅行商问题
9.2.5 电路板排列
十 分支定界
10.1 算法思想
10.2 应用
10.2.1 货箱装载
10.2.2 0/1背包问题
10.2.3 最大完备子图
10.2.4 旅行商问题
10.2.5 电路板排列
十一 摊还分析
11.1 聚合分析
11.2 核算法
11.3 势能法
11.4 动态表
11.4.1 表扩张
11.4.2 表扩张和收缩
十二 线性规划
12.1 标准型和松弛型
12.2 将问题表达为线性规划
12.3 单纯形算法
12.4 对偶性
12.5 初始基本可行解
十三 多项式与快速傅里叶变换
13.1 多项式的表示
13.2 DFT与FFT
13.3 高效FFT实现
十四 计算几何学
14.1 多边形
14.1.1 计算几何误差修正
14.1.2 计算几何点类
14.1.3 计算几何线段类
14.1.4 多边形类
14.1.5 多边形的重心
14.1.6 多边形内格点数
14.1.7 凸多边形类
14.1.8 凸多边形的直径
14.1.9 半平面切割多边形
14.1.10 半平面交
14.1.11 凸多边形交
14.1.12 多边形的核
14.1.13 凸多边形与直线集交
14.2 圆
14.2.1 圆与线求交
14.2.2 圆与多边形交的面积
14.2.3 最小圆覆盖
14.2.4 圆与圆求交
14.2.5 圆的离散化
14.2.6 圆的面积并
14.3 三维计算几何
14.3.1 三维点类
14.3.2 三维直线类
14.3.3 三维平面类
14.3.4 三维向量旋转
14.3.5 长方体表面两点最短距离
14.3.6 四面体体积
14.3.7 最小球覆盖
14.3.8 三维凸包
14.4 其他
14.4.1 三角形的四心
14.4.2 最近点对
14.4.3 平面最小曼哈顿距离生成树
14.4.4 最大空凸包
14.4.5 平面划分
十五 NP完全性
15.1 多项式时间
15.2 多项式时间的验证
15.3 NP完全性与可归约性
15.4 NP完全性的证明
15.5 NP完全问题
15.5.1 团问题
15.5.2 顶点覆盖问题
15.5.3 哈密顿回路问题
15.5.4 旅行商问题
15.5.5 子集和问题
十六 近似算法
16.1 顶点覆盖问题
16.2 旅行商问题
16.2.1 满足三角不等式的旅行商问题
16.2.2 一般旅行商问题
16.3 集合覆盖问题
16.4 随机化和线性规划
16.5 子集和问题
十七 高级算法专题
17.1 爬山法
17.2 模拟退火法
17.3 遗传算法
17.4 粒子群算法
17.5 LRU缓存算法
17.6 蚂蚁群算法
17.7 神经网络算法
第三部分:高并发算法
一 多线程算法
1.1 动态多线程基础
1.2 多线程矩阵乘法
1.3 多线程归并排序
1.4 多线程快速排序
1.5 多线程计算递归
1.6 多线程粒子群算法
1.7 多线程CAS算法
二 线程安全数据结构
2.1 线程安全
2.2 线程安全队列
2.3 线程安全数据结构通用范式
三 排名,锁,高并发高性能的秒杀实战
3.1 并发优先队列排名
3.2 锁与秒杀
3.3 高并发实现限流计数器法
3.4 高并发实现限流漏桶法
3.5 高并发实现限流令牌桶
四 调度算法
4.1优先调度算法
4.1.1.先来先服务调度算法(FCFS)
4.1.2.短作业(进程)优先调度算法
4.2高优先权优先调度算法
4.2.1.非抢占式优先权算法
4.2.2.抢占式优先权调度算法
4.2.3.高响应比优先调度算法
4.3 基于时间片的轮转调度算法
4.3.1.时间片轮转法
4.3.2.多级反馈队列调度算法
4.4 circuit-breaker 熔断算法
第四部分:分布式数据结构算法
一 分布式哈希表
二 分布式负载均衡算法
轮询法
随机法
源地址哈希法
加权轮询法
加权随机法
键值范围法
最小连接数法
最快响应速度法
观察模式法
三 分布式选举老大算法
四 一致性哈希算法
五 分布式安全队列
六 分布式安全树
七 分布式遗传算法
八 分布式投票算法
九 KNN分类算法的分布式
十Ensemble Selection分布式算法
十一 raft共识算法
十二 paxos共识算法
第五部分:推荐算法
1推荐算法概述
1.1基于流行度的算法
1.2协同过滤算法
1.2.1用关联算法做协同过滤
1.2.2用聚类算法做协同过滤
1.2.3用分类算法做协同过滤
1.2.4用回归算法做协同过滤
1.2.5用矩阵分解做协同过滤
1.2.6用神经网络做协同过滤
1.2.7用图模型做协同过滤
1.2.8用隐语义模型做协同过滤
1.3基于内容的算法
1.4基于模型的算法
1.5基于约束的推荐系统
1.6基于邻域的推荐方法
1.6.1基于用户的评分预测
1.6.2基于用户的分类预测方法
1.6.3基于物品的推荐
1.7情境感知推荐系统
1.5混合算法
第六部分密码学算法
1.哈希算法
2.对称加密算法
3.非对称加密算法
4.国密算法
第七部分:leetcode实战
腾讯精选算法50题
1二叉树的最大深度
2反转字符串
3Nim游戏
4反转字符串中的单词 III
5删除链表中的节点
6只出现一次的数字
7反转链表
8求众数
9回文数
10二叉搜索树的最近公共祖先
11合并两个有序链表
12买卖股票的最佳时机 II
13最小栈
14买卖股票的最佳时机
15 2的幂
16 存在重复元素
17 爬楼梯
18 删除排序数组中的重复项
19 合并两个有序数组
20 最大子序和
21 有效的括号
22 环形链表
23 相交链表
24 最长公共前缀
25反转整数
26 子集
27螺旋矩阵 II
28 全排列
29 二叉搜索树中第K小的元素
30 除自身以外数组的乘积
31格雷编码
32排序链表
33数组中的第K个最大元素
34不同路径
35盛最多水的容器
36二叉树的最近公共祖先
37 最接近的三数之和
38旋转链表
39字符串相乘
40搜索旋转排序数组
41螺旋矩阵
42两数相加
43环形链表 II
44最长回文子串
45三数之和
46字符串转整数 (atoi)
47合并K个排序链表
48LRU缓存机制
49二叉树中的最大路径和
50约瑟夫环链表