教你快速掌握动态规划问题实现-详解

前言

在研究搜索算法等问题,对数据结构里的关于图、集合等数据结构需要一定的掌握,而当涉及到图这个数据结构时候往往伴随适用的问题就是对图的路径进行求解。而动态规划往往经常用来解决关于图的最短路径的问题。

图是什么?

逻辑结构

在制作UML图时候,往往会发现主体之间的关系是有多种的,比如一个部门经理管理多个员工(为1:m,一对多关系),但一个部门经理管一个部门(为1:1,一对一),多个副经理管理多个员工(为m:m,多对多),这些关系里最明显的是主体不一样,所以主体之间的关系不一样。
一般一对一的关系,用线性表实现;一对多,用树实现。多对多,用图来实现。

  1. 一对一,线性表
  2. 一对多,树
  3. 多对多,图

存储结构

  1. 无向图
  2. 有向图

图一般是由顶点+边组合而成的。
顶点之间都是一般由边进行组合的。

图的常识

  1. 弧头和弧尾:有向图中,无箭头一端的顶点通常被称为"初始点"或"弧尾",箭头直线的顶点被称为"终端点"或"弧头"。
  2. 入度和出度:箭头指向 V 的弧的数量为 V 的入度;箭头远离 V 的弧的数量为 V 的出度;
  3. (V1,V2) 和 <V1,V2> 的区别:无向图——(V1 和 V2);有向图"单向"关系—— <V1,V2> ;
  4. 集合 VR 的含义:图中习惯用 VR 表示图中所有顶点之间关系的集合;
  5. 路径和回路:从一个顶点到另一顶点途径的所有顶点组成的序列,(包含这两个顶点),称为一条路径。如果路径中第一个顶点和最后一个顶点相同,则此路径称为"回路"(或"环")。
    若路径中各顶点都不重复,此路径又被称为"简单路径";同样,若回路中的顶点互不重复,此回路被称为"简单回路"(或简单环)。
  6. 权和网:图中的每条边(或弧)会赋予一个实数来表示一定的含义,这种与边(或弧)相匹配的实数被称为"权",而带权的图通常称为网。
  7. 子图:指的是由图中一部分顶点和边构成的图,称为原图的子图。

图的存储结构分类

  1. 完全图:若图中各个顶点都与除自身外的其他顶点有关系,这样的无向图称为完全图。
  2. 稀疏图和稠密图:这两种图是相对存在的,即如果图中具有很少的边(或弧),此图就称为"稀疏图";反之,则称此图为"稠密图"。

最短路径问题

问题描述

首先在输入上:

  1. 起点集合
  2. 重点集合
  3. 中间结点集合
  4. 边集合,对于任意边都有长度(也可以理解为权重)

输出结果:一条从起点到终点的最短路径。

算法设计

  1. 蛮力算法:计算每一条从某个起点到终点路径。
  2. 动态规划:多阶段决策过程,就是将问题的规模划分成多个小规模的问题,依次划分,每步求解问题是后面阶段求解问题的子问题,每步决策将依赖前面步骤的决策结果。

在这张图里,d代表着down就是选下面一个方向,u代表着up,表示选择上面一个方向。然后从右边第一阶段逐渐往左走到阶段四。
而d,u后面的数字代表着到达这个阶段点所需要最短路径长度。每个阶段的点都有上下两条路选择,而那个路径最短就选哪个作为该点的路径长度。

在这里插入图片描述

在这里插入图片描述

因为在动态规划里每步决策将依赖前面步骤的决策结果。所以这里的依赖关系就是基于这个特点。


在这里插入图片描述

因为动态规划需要去分解问题规模,所以需要满足优化原则,即任何子序列要相对于子序列的初始和结束状态的最优决策序列。而这个子序列按照它的要求,则没有满足优化原则。

动态规划设计要素

问题建模:

  1. 优化的目标函数是什么?约束条件是什么?
  2. 如何划分子问题(边界)?
  3. 问题的优化函数值于子问题的优化函数值存在着什么依赖关系?(递推方程)
  4. 是否满足优化原则?
  5. 最小子问题怎么界定?规模是多小?即优化函数值,即初值等于什么?
  6. 多阶段决策过程,每步处理一个子问题,界定子问题的边界
  7. 列出优化函数递推方程及初值

动态规划重要概念

问题建模:

  1. 最优子结构
  2. 边界
  3. 状态转移公式 ,决定了每一个阶段和下一阶段的关系

求解问题:
举例:递归计算动态规划时候,像是一颗二叉树,所以递归方式所需要的的次数为这个二叉树的节点个数2^(n-1)(假设这个二叉树高度为n-1),所以时间复杂度就可以看成2的n次方。
可以发现在递归过程中,有很多节点是重复的,所以可以考虑创建一个哈希表,把不同参数的计算结果存入哈希表,遇到的时候取出来,避免重复计算,这种暂存计算结果的方法为备忘录算法。

动态规划实现

动态规划最主要是利用迭代计算,在计算中让每个子问题只计算一次。
迭代过程:

  1. 从最小子问题算起
  2. 考虑计算顺序,保证后面用到的值前面已经计算好了
  3. 存储结构保存计算结果-备忘录

解的追踪

  1. 设计标记函数标记每步的决策
  2. 考虑根据标记函数追踪解的算法

划分子问题:

  1. 确定子问题边界,将问题求解转变成多步判断的过程
  2. 定义优化函数,以该函数极大(极小)值作为依据,确定是否满足优化原则
  3. 自顶向上计算,设计备忘录(表格)
  4. 考虑是否需要设立标记函数
  5. 用递推方程或备忘录估计时间复杂度

动态规划的优缺点

动态规划算法利用了子问题优化函数间的依赖关系,降低时间复杂度。动态规划算法的递归实现效率不高,原因在于同一子问题多次重复出现,每次出现都需要重新计算一遍。
采用了空间换时间策略,记录每个子问题首先计算结果,后面再用时候直接取值,每个子问题只算一次。

动态规划问题扩展

多重背包算法、迪杰特斯拉算法

动态规划的图像压缩设计

图像大多都是一组关于灰度数值的序列集合,有时候灰度值并没有那么大。

以下是关于图像的基础知识:

  1. 像素点:像素点是最小的图像单元,一张图片由好多的像素点组成。
  2. RGB:以像素点矩阵对应三个颜色向量矩阵,分别是R矩阵,G矩阵,B矩阵。如果每个矩阵的第一行第一列的值分别为:R:240,G:223,B:204,所以这个像素点的颜色就是(240,223,204)
  3. 灰度:灰度是表明图像明暗的数值,即黑白图像中点的颜色深度,范围一般从0到255,白色为255 ,黑色为0,故黑白图片也称灰度图像。灰度值指的是单个像素点的亮度。灰度值越大表示越亮。
  4. 图像的灰度化: 灰度就是没有色彩,RGB色彩分量全部相等。图像的灰度化就是让像素点矩阵中的每一个像素点都满足关系:R=G=B,此时的这个值叫做灰度值。如RGB(100,100,100)就代表灰度值为100,RGB(50,50,50)代表灰度值为50。

参考文献

数据结构:图
数据结构:图
旅行商问题
灰度、灰度级、分辨率、像素值
动态规划

猜你喜欢

转载自blog.csdn.net/qq_43614246/article/details/122685352
今日推荐