diff --git a/工作日志/2021年4月1日-今日计划.md b/工作日志/2021年4月1日-今日计划.md index 89309266..a77280a8 100644 --- a/工作日志/2021年4月1日-今日计划.md +++ b/工作日志/2021年4月1日-今日计划.md @@ -2,6 +2,6 @@ > 每日计划包括三方面的内容:数据结构与算法、基础知识与项目经历、联邦学习与恶意软件 -- [ ] 数据结构预算法——回溯剪枝和分支限界整理完成 +- [x] 数据结构预算法——回溯剪枝和分支限界整理完成 - [ ] 基础知识与项目经历——计算机网络整理完成 - [ ] 联邦学习与恶意软件——TensorFlow federated学习开始part1 diff --git a/算法/A类:基本算法/5.1 矩阵连乘问题.md b/算法/A类:基本算法/5.1 矩阵连乘问题.md index e69de29b..574580d2 100644 --- a/算法/A类:基本算法/5.1 矩阵连乘问题.md +++ b/算法/A类:基本算法/5.1 矩阵连乘问题.md @@ -0,0 +1,32 @@ +## 矩阵连乘问题 + + +### 问题描述 +给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。例如,给定三个连乘矩阵{A1,A2,A3}的维数分别是`10*100,100*5`和`5*50`,采用(A1A2)A3,乘法次数为`10*100*5+10*5*50=7500`次,而采用A1(A2A3),乘法次数为`100*5*50+10*100*50=75000`次乘法,显然,最好的次序是(A1A2)A3,乘法次数为7500次。 + +### 问题分析 +矩阵链乘法问题描述:给定由n个矩阵构成的序列{A1,A2,...,An},对乘积A1A2...An,找到最小化乘法次数的加括号方法。 + + +### 策略选择 + +* 算法思想:动态规划 + +### 算法设计 + +* 问题分解划分阶段:相邻连乘的个数。相邻连乘的个数为1,的时候0次乘法。两个相邻连乘的次数固定。三个相邻连乘的时候分两次讨论。规模增长的方向主要由两个一个是k表示矩阵连乘的个数,第二个是i表示矩阵的个数。 +* 确定状态变量:dp[k][i]。表示连乘为k的时候,第i个矩阵开始的最优的乘积方式。 +* 确定状态转移方程,每一个分,k-1总情况讨论。 +$$ +dp[k][i]=min\{dp[1][i]+dp[k-1][i+1]+time[i+1],dp[2][i]+dp[k-2][i+2]+time[i+2],...\} +$$ +* 确定边界实现过程:从1开始。矩阵连成为1的时候。乘法次数都为0. + +![](image/2021-04-01-22-33-51.png) +### 算法分析 +* 时间复杂度O(n^3) + +### 算法实现 + +``` +``` \ No newline at end of file diff --git a/算法/A类:基本算法/5.12 n个骰子的点数.md b/算法/A类:基本算法/5.12 n个骰子的点数.md index c1c1f129..6cd2ffd8 100644 --- a/算法/A类:基本算法/5.12 n个骰子的点数.md +++ b/算法/A类:基本算法/5.12 n个骰子的点数.md @@ -1,6 +1,6 @@ # n个骰子的点数 - +> 生成幂集的循环方法。完全一致,也是动态规划问题。 ## 1 n个骰子的点数 diff --git a/算法/A类:基本算法/5.5 图像压缩问题.md b/算法/A类:基本算法/5.5 图像压缩问题.md deleted file mode 100644 index e69de29b..00000000 diff --git a/算法/A类:基本算法/5.7 作业调度问题.md b/算法/A类:基本算法/5.7 作业调度问题.md index e69de29b..7a9f426c 100644 --- a/算法/A类:基本算法/5.7 作业调度问题.md +++ b/算法/A类:基本算法/5.7 作业调度问题.md @@ -0,0 +1,27 @@ +## 作业调度问题 + +> 参考文献 +> * [https://zhuanlan.zhihu.com/p/30705914](https://zhuanlan.zhihu.com/p/30705914) + +### 问题描述 + +有n个作业需要在2台机器M1 和M2组成的流水线上完成加工。每个作业都必须先在 M1 上加工,然后在 M2 上加工。M1和M2加工作业i所需的时间分别记作 a_i和b_i,每台机器同一时间最多只能执行一个作业。 + +请确定这n个作业的最优加工顺序,使得从第一个作业在机器上开始加工,到最后一个作业在机器上加工完成所需的时间最少。 + +### 问题分析 + +### 算法设计 + + +* johnson不等式。满足min{bi,aj}>= min{bj,ai}则表示i和j满足johnson不等式。则意味着i在j前执行,不会使的结果变坏。 +* 查参考文献。 + + +### 算法分析 + +* 时间复杂度O(nlogn)按json不等式排序的时间复杂度。 + + +### 算法实现 + diff --git a/算法/A类:基本算法/7 回溯法.md b/算法/A类:基本算法/7 回溯法.md index 98957d87..0b5699ad 100644 --- a/算法/A类:基本算法/7 回溯法.md +++ b/算法/A类:基本算法/7 回溯法.md @@ -19,43 +19,45 @@ * **解空间**: 对于一个实例,解向量满足显示约束条件的所有多元组,构成了该实例的一个解空间。 -### 基本方法 - -* 明确定义问题的解空间,将问题的解空间组织成树的结构,通过采用系统的方法隐含搜索解空间树,从而得到问题解。回溯法的基本做法是搜索,是一种组织的井井有条的,能避免不必要搜索的穷举式搜索。搜索策略主要有:深度优先、广度优先、函数优先、广度深度结合。 - -**节点分支判定条件:** -* 满足约束条件:分支扩展解向量。 -* 不满足约束条件:回溯到当前节点的父结点。 - - -**结点状态:** -* 白结点:尚未访问的节点 -* 灰节点:正在访问以该节点为跟的子树。 -* 黑节点:以该节点为根的子树遍历完成。 - -**存储当前索索路径** - -**搜索策略(避免无效搜索)** -* **约束函数**:在扩展节点处减去不满足约束条件的子树。 -* **界限函数**:在扩展节点处减去得不到最优解的子树。 - ### 回溯法的适用条件 * 适用于搜索问题和优化问题 -必要条件 + * **多米诺性质**:叶子节点的解一定满足其父节点。叶子结点为真则父节点一定为真。同理父节点为假则叶子结点一定为假(逆否命题)。用父节点为假的情况进行剪枝操作。 * 设P(x1,x2,…,xi)是关于向量的某个性质,那么P(x1,x2,…,xi+1)真蕴含P(x1,x2,…,xi) 为真,即P(x1,x2,…,xi+1) → P(x1,x2,…,xi) (0 判断问题是否满足多米诺性质 +1. **定义解空间** * 问题解向量 * 解向量分量取值集合 * 构造解空间树 -2. 判断问题是否满足多米诺性质 -3. 搜索解空间树,确定**剪枝函数** -4. 确定存储搜索路径的数据结构 +2. **确定剪枝函数** +3. **搜索解空间树** +4. **存储搜索路径**,确定存储的数据结构 ### 两种典型的解空间树 * **子集树**:当所给的问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解空间树称为子集树。 @@ -112,6 +114,10 @@ void iterativeBacktrack () * 求解目标不同:回溯法的求解目标是找出解空间树中满足约束条件的所有解。而分支限界的求解目标是找出满足约束条件的一个解。这个解可能是最优解。 * 搜索方式不同:回溯法以深度优先的方式搜索解空间。而分支限界法则以广度优先或以最小消耗优先的方式搜索解空间。 -## 2 常见问题 +## 3 常见问题 -### 着色问题 \ No newline at end of file +### m着色问题 + +### 装载问题 + +### 批作业调度问题 \ No newline at end of file diff --git a/算法/A类:基本算法/8 分支限界.md b/算法/A类:基本算法/8 分支限界.md index d58c56ac..f8563588 100644 --- a/算法/A类:基本算法/8 分支限界.md +++ b/算法/A类:基本算法/8 分支限界.md @@ -30,4 +30,14 @@ ### 分支限界法的程序结构 -* 队列+循环的方法 \ No newline at end of file +* 队列+循环的方法 + +## 2 分治限界实现 + + +## 3 常见问题 + +1. 01背包问题 +2. 旅行商问题 +3. 装载问题 + diff --git a/算法/A类:基本算法/image/2021-04-01-22-33-51.png b/算法/A类:基本算法/image/2021-04-01-22-33-51.png new file mode 100644 index 00000000..691cb966 Binary files /dev/null and b/算法/A类:基本算法/image/2021-04-01-22-33-51.png differ