算法导论复习——CHP22 基本图算法

图的表示        

        邻接矩阵和邻接表

        稀疏图一般用邻接表表示(稀疏图:边数|E|远小于|V|^2的图 )

        稠密图更倾向于用邻接矩阵表示 (稠密图:边数|E|接近|V|^2的图)

        邻接矩阵可用于需要快速判断任意两个结点之间是否有边相连的应用场景。

        如果用邻接表表示,为判断一条边(u,v)是否是图中的边,需要在邻接链表Adj[u]中搜索,效率较低。

图的检索和周游

        被检测:在图中,当某结点的所有邻接结点都被访问了时, 称该结点被检测了。

        经典的图检索算法:

  •         宽度优先搜索(BFS)

  1. 从结点v开始,首先访问结点v,给v标上已访问标记。
  2. 访问邻接于v且目前尚未被访问的所有结点,此时结点v被 检测,而v的这些邻接结点是新的未被检测的结点。将这些结点依次放置到一个称为未检测结点表的队列中。
  3. 若未检测结点表为空,则算法终止;
  4. 否则,取未检测结点表的表头结点作为下一个待检测结点,重复上述过程。直到Q为空,算法终止。

        设t(n,e)和s(n,e)是算法BFS在任一具有n个结点和 e 条边的图G上所花的时间和附加空间。         若G由邻接表表示,则 t(n,e)=Θ(n+e) 和 s(n,e)=Θ(n)。

        若G由邻接矩阵表示,则 t(n,e)=Θ(n^2) 和 s(n,e)=Θ(n) 

  •         深度优先检索(DFS)

        ① DFS可以访问由v可到达的所有结点

        ② 如果t(n,e)和s(n,e)表示DFS对一n结点e条边的图所花的时间和附加空间,则

                s(n,e)=Θ(n)  

                t(n,e)= Θ(n+e) G采用邻接表表示 

                t(n,e)= Θ(n^2) G采用邻接矩阵表示        

图周游算法的应用

        判定图G的连通性:若调用BFS的次数多于1次,则G 为非连通的。

        生成图G的连通分图:一次调用BFS中所访问到的所 有结点及连接这些结点的边构成一个连通分图。 

宽度优先生成树

        向前边:BFS中由 u 到达未访问结点w的边(u,w)。

        宽度优先生成树: 记T是BFS中处理的所有向前边集合。 若G是连通图,则BFS终止时,T构成一棵生成树,称为图G的宽度优先生成树。

         修改算法BFS:

 

深度优先周游算法DFT

        反复调用DFS,直到所有结点均被检测到。

        应用:

        ① 判定图G的连通性

        ② 连通分图

        ③ 无向图的自反传递闭包矩阵

        ④ 深度优先生成 

D_Search深度检索

         改造BFS算法,用栈来保存未被检测的结点,则得到的新的检索算法        

        注:结点被压入栈中后将以相反的次序出栈。 

回溯法

        用于求解问题的一组特定性质的解或满足某些约束条件的最优解。

        什么样的问题适合用回溯法求解呢?

        1)问题的解可用一个n元组(x1 ,…,xn )的向量来表示; 其中的xi取自于某个有穷集Si。

        2)问题的求解目标是求取一个使某一规范函数P(x1 ,…,xn ) 取极值或满足该规范函数条件的向量(也可能是满足P的所有向量)。

        约束条件:问题的解需要满足的条件,可以分为显式约束条件和隐式约束条件:

                显式约束条件:一般用来规定每个xi的取值范围。 如 : xi≥0 即Si={所有非负实数} xi=0或xi=1 即 Si={0,1}

                隐式约束条件:用来规定解空间中那些满足规范函数的元组, u 隐式约束条件描述了xi之间的关系和应满足的条件。

        解空间:实例I的满足显式约束条件的所有元组,构成的解空间,即所有xi合法取值的元组的集合——可行解。

        

        举例——8-皇后问题

                在一个8×8棋盘上放置8个皇后,使得任意两个皇后之间 都不互相“攻击” ,即每两个皇后都不在同一行、同一列或同 一条斜角线上。

        行、列号:1…8 皇后编号:1…8, 不失一般性,约定皇后i放到第i行的某一列上。

        解的表示:用8-元组(x1 ,…,x8 )表示 ,其中xi是皇后i所在的列号。

        显式约束条件:Si={1,2,3,4,5,6,7,8}, 1≤i≤8

        解空间:所有可能的8元组,共有8^8个。

        隐式约束条件:用来描述xi之间的关系,即没有两个xi可以相同,且没有两个皇后可以在同一条斜角线上。 由隐式约束条件可知:可能的解只能是( 1,2,3,4,5,6,7,8 )的 置换(排列),最多有8!个。

        举例——子集和数问题

        已知n个正数的集合W={w1 , w2 , …, wn}和正数M,找出W 中的和数等于M的所有子集。

        子集和数问题解的表示

        形式一

                问题的解为k-元组(x1 , x2 , …, xk), 1≤k≤n。不同的解可以是大小不同的元组,如(1,2,4)和(3,4)。

                显式约束条件:xi∈{ j | j为整数且1≤j≤n }。

                隐式约束条件:1)没有两个xi是相同的; 2)Wxi的和为M; 3)xi<xi+1 , 1≤ i<n(避免重复元组)

        形式二 

                解由n-元组(x1 , x2 , …, xn )表示,其中xi∈{0,1}。如果选择了 wi,则xi=1,否则xi=0。 

                特点:所有元组具有统一固定的大小。

                显式约束条件:xi∈{0,1} ,1≤i≤n;

                隐式约束条件:Σ(xi × wi) = M

解空间的组织

        回溯法将通过系统地检索给定问题的解空间来求解,从而需要有效地组织问题的解空间。

        可以用树结构组织解空间,形成状态空间树。

        如:4皇后问题的解空间树结构如图

        状态空间树:解空间的树结构称为状态空间树。

        问题状态:树中的每一个结点代表问题的一个状态,称为问题状态。

        状态空间:由根结点到其他结点的所有路径确定了这个问题的状态空间。

         解状态:是这样一些问题状态S,对于这些问题状态,由根到S的那条路径确定了这个问题解空间中的一个元组。

        答案状态:是这样的一些解状态S,对于这些解状态而言,由根到 S的这条路径确定了问题的一个解(满足隐式约束条件 的解)。

        状态空间树的构造

        以问题的初始状态作为根结点,然后系统地生成其它问题状态的结点。

        在状态空间树生成的过程中,结点根据被检测情况分为三 类:

  •         活结点:自己已经生成,但其儿子结点还没有全部生成并且 有待生成的结点。(静态)
  •         E-结点(expansion node):当前正在生成其儿子结点的 活结点。(动态)
  •         死结点:不需要再进一步扩展或者其儿子结点已全部生成的结点。

        构造状态空间树的两种策略

        1. 深度优先策略:当E-结点R一旦生成一个新的儿子C时, C就变成一个新的E-结点,当完全检测了子树C之后,R结点再次成为E-结点。

        2. 宽度优先策略:一个E-结点一直保持到变成死结点为止。

        限界函数

        在结点生成的过程中,定义一个限界函数,用来杀死还没有生成全部儿子结点的一些活结点 ——这些活结点已无法满足限界函数的条件, 因此不可能导致问题的答案。

        回溯法:使用限界函数的深度优先状态结点生成方法称为回溯法(backtracking)

        分支-限界方法:使用限界函数的 E 结点一直保持到死为止的状态结点生成方法称为分支-限界方法 (branch-and-bound)。

        4皇后问题的回溯法求解

  •         限界函数:如果(x1 ,x2 ,…,xi-1)是到当前E结点的路径, 那么xi-1的儿子结点xi是一些这样的结点, 它们使得(x1 ,x2 ,…,xi-1 ,xi)表示没有两个皇 后处在相互攻击状态的一种棋盘格局。
  •         开始状态:根结点1,此时表示棋盘为空,还没有放置 任何皇后。
  •         结点的生成:依次考察皇后1——皇后n的位置。

                

回溯法框架 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/290607.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

纯前端上传word,xlsx,ppt,在前端预览并下载成图片(预览效果可以,下载图片效果不太理想)

纯前端上传word,xlsx,ppt,在前端预览并下载成图片(预览效果可以,下载图片效果不太理想) 一.安装依赖二、主要代码 预览效果链接: https://github.com/501351981/vue-office 插件文档链接: https://501351981.github.io/vue-office/examples/d…

使用(?<!pattern) 负向后行断言正则表达式提取一个双引号开头和结尾的字符串

如下是一段java代码,我想用正则表达从中提取代码中的字符串 cond_buffer.append(" ORDER BY \"name\" \"").append(join(order_by_column,"\","));java是通过前后用双引号包含定义字符串的。但简单使用正则表达式".…

Kubernetes Gateway API V1.0:您应该切换吗?

自Kubernetes Gateway API 发布 v1.0以来已经过去两个多月了,这标志着其一些关键 API 已经进入普遍可用状态。 去年,当网关 API升级为测试版时,我曾写过有关该 API的文章,但一年后,问题仍然存在。您是否应该从 Ingres…

Python----matplotlib库

目录 plt库的字体: plt的操作绘图函数: plt.figure(figsizeNone, facecolorNone): plt.subplot(nrows, ncols, plot_number): plt.axes(rect): plt.subplots_adjust(): plt的读取和显示相关函数: plt库的基础图…

Python内置类属性__module__属性的使用教程

概要 在Python中,每个对象都有一些内置的属性,这些属性提供了有关对象的一些信息。其中一个内置属性是__module__属性。__module__属性是一个字符串,它表示定义了类或函数的模块的名称。在本篇文章中,我们将详细介绍__module__属…

随机森林,Random Forests Classifiers/Regressor

目录 介绍: 一、 Random Forests Classifiers(离散型) 1.1 数据处理 1.2建模 1.3特征值权值分析 1.4 特征值的缩减 二、Random Forests Regressor(连续型) 2.1数据处理 2.2建模 2.3调参 介绍: …

数据库:基础SQL知识+SQL实验1

&#xff08;1&#xff09;基础知识&#xff1a; 1.创建数据库&#xff1a; CREATE DATABASE <database_name> 2.删除数据库&#xff1a; DROP DATABASE <database_name> 3.相关数据类型&#xff1a; [1] 字符串类型 CHAR(n)&#xff1a;固定长度的字符数据…

基于ssm的《数据库系统原理》课程平台的设计与实现论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

[蓝桥杯学习]​树上差分

差分 前缀和 sum_i sum_i-1 a_i 差分 diff_i a_i - a_i-1 差分的好处 点的差分 问题引入 解决问题 要用到差分的思想&#xff0c;每次从叶子向上的回溯&#xff0c;会让父结点子结点的cnt值&#xff0c;但是仅仅这样&#xff0c;还不行 回溯的过程中&#xff0c;LCA被…

【Midjourney】AI绘画新手教程(一)登录和创建服务器,生成第一幅画作

一、登录Discord 1、访问Discord官网 使用柯學尚网&#xff08;亲测非必须&#xff0c;可加快响应速度&#xff09;访问Discord官方网址&#xff1a;https://discord.com 选择“在您的浏览器中打开Discord” 然后&#xff0c;注册帐号、购买套餐等&#xff0c;在此不做缀述。…

[每周一更]-(第56期):不能不懂的网络知识

作为程序员&#xff0c;在网络方面具备一定的知识和技能是非常重要的。以下是一些程序员需要熟练掌握的网络知识&#xff1a; 基础网络概念&#xff1a; IP地址&#xff1a;了解IPv4和IPv6地址的格式和分配方式&#xff0c;以及常见的IP地址分类。子网掩码&#xff1a;理解子…

大数据 - Doris系列《一》- Doris简介

目录 &#x1f436;1.1 Doris 概述 &#x1f436;1.2 OLAP和OLTP&#xff08;面试&#xff09; 1. 应用场景 &#x1f959;联机事务处理OLTP(On-Line Transaction Processing) &#x1f959;联机分析处理OLAP(On-Line Analytical Processing) 2. OLAP和OLTP比较--“用户行…

大数据技术在民生资金专项审计中的应用

一、应用背景 目前&#xff0c;针对审计行业&#xff0c;关于大数据技术的相关研究与应用一般包括大数据智能采集数据技术、大数据智能分析技术、大数据可视化分析技术以及大数据多数据源综合分析技术。其中&#xff0c;大数据智能采集数据技术是通过网络爬虫或者WebService接…

Linux程序、进程以及计划任务(第一部分)

目录 一、程序和进程 1、什么是程序&#xff1f; 2、什么是进程&#xff1f; 3、线程是什么&#xff1f; 4、如何查看是多线程还是单线程 5、进程结束的两种情况&#xff1a; 6、进程的状态 二、查看进程信息的相关命令 1、ps&#xff1a;查看静态的进程统计信息 2、…

WEB:探索开源PDF.js技术应用

1、简述 PDF.js 是一个由 Mozilla 开发的开源 JavaScript 库&#xff0c;用于在浏览器中渲染 PDF 文档。它的目标是提供一个纯粹的前端解决方案&#xff0c;摆脱了依赖插件或外部程序的束缚&#xff0c;使得在任何支持 JavaScript 的浏览器中都可以轻松地显示 PDF 文档。 2、…

git的拉取、提交、合并、解决冲突详细教程

我们在开发中使用git&#xff0c;经常会遇到拉代码&#xff0c;切换分支&#xff0c;提交代码&#xff0c;新建分支&#xff0c;合并代码&#xff0c;解决冲突这些操作&#xff0c;下面我跟大家分享一个好用的git工具来进行这些操作。 首先&#xff0c;我们下载一个git工具 点…

HarmonyOS4 vp单位计算

我们在harmonyOS中设置宽度等单位时 需要在后面写明具体是什么单位 width("100%")这里 我们就写明了是 百分之百 如果不写 直接给数值 width(100)那么 它就会按vp去读 这里就被读为 100vp vp 之前是一种移动端宽度概念 后面鸿蒙重定义了它的概念 计算公式是 px 乘…

实战环境搭建-安装xshell和xftp

安装xshell和xftp的原因是想远程虚拟机&#xff0c;很多时候&#xff0c;直接去操作虚拟机明显不太方便。 所以&#xff0c;我们需要一个能够搭载虚拟机和本地电脑之间的桥梁&#xff0c;哪怕是你们去了企业&#xff0c;也和这个类似&#xff0c;唯一的区别是企业里面更多连接…

Centos 磁盘挂载和磁盘扩容(新加硬盘方式)

步骤总结如下 一、对磁盘进行分区 二、对磁盘进行格式化 三、将磁盘挂载到对应目录 四、做开机自动挂载磁盘 磁盘分区 1.使用命令&#xff1a;fdisk -l 查看磁盘&#xff08;注&#xff1a;正常在Centos7中第一块数据盘标识一般是/dev/sda,第二块数据盘标识一般是/dev/sdb&…

2024年防止内卷和被潜规则,RocketMQ消息中间件实战派上下册上线啦|架构随笔录

2023已经过去啦&#xff0c;作为技术小伙伴一定要做好2024年的规划&#xff0c;只有这样才能够避免内卷和潜规则。 2024年即将是一个重新开始的一年&#xff0c;但是你要说互联网不倦&#xff0c;那是不可能的&#xff0c;就连某大厂都开始走下坡路啦&#xff0c;里面卷的是不…