从普通回溯到三色标记法法
文章目录
- 题目
- 题目解析
- 题目解析
- 普通dfs回溯(超时)
- 三色标记法优化dfs
题目
题目解析
题目解析
读完题目我们需要知道的是,这题就是需要我们判断以某个点为起点的所有路径不能含有环,我们只需要判断出这一条件即可完成对这一个结点是否为安全状态的判断。
那么怎么判断是否含有环呢?由于是有向边,所以在可到达的路径下一旦产生回头路则产生环。
普通dfs回溯(超时)
- 用check数组进行结点是否已经被选取的回溯,但这也会超时,为什么呢?因为实际上dfs搜索过程中每次进行了大量的重复判断,比如当我们把与0结点相连的路径都遍历完了然后得出0结点是否为安全结点,然而在这个过程中,状态会转移到与0结点相连的那些结点,在这个过程中如果计算了0结点那么就已经计算了所有与0结点相连的结点。而普通的回溯并没有很好的利用这些已经计算好的答案,而是每次都需要从头再算一遍。
class Solution {public:vector<int> eventualSafeNodes(vector<vector<int>> &graph) {int n = graph.size();bool check[n];memset(check,0,sizeof check);//dfs回溯方式,check仅仅只用于记录同一条路径下是否已经被访问过。function<bool(int)> safe = [&](int x){ if(check[x]){return false;}check[x] = 1;for (int y : graph[x]) {if (!safe(y)) {return false;}}check[x] = 0;return true;};vector<int> ans;for (int i = 0; i < n; ++i) {if (safe(i)) {ans.push_back(i);}}return ans;}
};
三色标记法优化dfs
- 前面提到,我们每次进行dfs搜索的时候,是会判断所有与该结点相连的结点的,所以我们通过一个数组元素的多个数字对每次搜索好的结果进行标记。
- 如果出现了环,那么它就无法再进入到最下面的一行代码,color就无法更新为2,出现环的位置到根节点位置一路往回弹,他们的color保持为1弹出false(表示该结点为起点的路径肯定是含有环的),而其他地方要么局部更新color为2表示那一结点是安全的,要么color未更新(还未被遍历过)保持0。
- 如果没有出现环,则说明与这个结点所有相连的路径都是安全结点,我们都会对color更新为2。
这样一来进充分利用了每次dfs的结果,比如dfs一次结点0,如果结点0为安全结点,则与他相连的所有结点都被标记为安全结点,下次再进行dfs省去不少事。(有记忆化搜索那味了),所以碰到可重复利用的dfs结果,我们可从两个角度思考:1. 记忆化 2. 三色标记法
class Solution {public:vector<int> eventualSafeNodes(vector<vector<int>> &graph) {int n = graph.size();int color[n];memset(color,0,sizeof color);function<bool(int)> safe = [&](int x){ if(color[x]){//一旦曾经该结点color被更新过,就进行判断是否为安全结点return color[x]==2;}color[x] = 1;for (int y : graph[x]) {if (!safe(y)) {return false;}}color[x] = 2;return true;};vector<int> ans;for (int i = 0; i < n; ++i) {if (safe(i)) {ans.push_back(i);}}return ans;}
};
从普通回溯到三色标记法法相关推荐
- 浅谈垃圾对象回收之《三色标记法》
文章目录 前言 什么是垃圾回收 JAVA的垃圾回收回顾 GO的垃圾回收学习 **三色标记法(tricolor mark-and-sweep algorithm)** Dijkstra方法(插入屏障,强 ...
- 【JVM】三色标记法与读写屏障
1.概述 首先:CMS和G1都使用了三色标记法 关于垃圾回收算法,基本就是那么几种:标记-清除.标记-复制.标记-整理.在此基础上可以增加分代(新生代/老年代),每代采取不同的回收算法,以提高整体的分 ...
- JVM垃圾回收——三色标记法
目录 一.什么是三色标记 二.三色标记的过程 三.三色标记的缺点 四.垃圾回收机如何弥补三色标记的缺点 在CMS.G1这种并发的垃圾收集器收集对象时,假如一个对象A被GC线程标记为不可达对象,但是用户 ...
- 【JVM】三色标记法
原因 在CMS等并发收集器,并发标记的过程中需要对对象进行标记,用于区别对象.防止多标,漏标等情况. 三色标记 三色标记法就是指将GC roots可达性算法分析遍历对象过程中将各个对象,按照" ...
- 详细图解JVM三色标记法
文章目录 为什么要使用三色标记法? 三色标记法中的三色 三色标记的漏标问题 如何解决漏标问题? CMS 增量更新(Incremental Update) G1 原始快照(Snapshot At The ...
- G1和CMS的三色标记法及漏标问题
首先标记有三个阶段: 初始标记 -> 并发标记 -> 最终标记 -> (拷贝存活区域对象) 初始标记: 只会标记GCRoot直接关联的对象 并发标记: 基于初始标记时标记的对象作 ...
- golang 垃圾回收、三色标记法、写屏障
垃圾回收简称 GC,就是对程序中不再使用的内存资源进行自动回收释放的操作. 常见的垃圾回收算法 引用计数:每个对象维护一个 引用计数,当对象被创建或被其他对象引用时,计数 +1:如果引用该对象的对象被 ...
- 双/三色标记法的垃圾回收(GC)原理解析和缺陷解决方案(Go,Lua以及jvm的CMS和G1垃圾回收器中使用的回收算法)
标记-清除算法 go和lua虚拟机以及jvm的CMS和G1垃圾回收器的回收算法的思想均来自于标记-清除算法(Mark-Sweep),它们的gc有重要的两部分: 1.从根节点遍历所有对象,如果可达到,则 ...
- 你对JVM三色标记的理解嘛?
点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 三色标记法是一种 ...
最新文章
- fiery服务器系统安装,Fiery_SC5500_服务器安装步骤.pdf
- 吴恩达深度学习课程deeplearning.ai课程作业:Class 1 Week 2 assignment2_2
- java性能分析与问题定位 实战
- sql中contains,like,patindex ,charindex和freetext语句的区别?
- 提交spark的bug的地方
- android DatePicker
- 大家可以放心了!Redmi K20将配备双频GPS
- 一个让我瞠目结舌的电脑高手!(转自叁哥博客)
- [原创]CI持续集成系统环境---部署Jenkins完整记录
- 看拉扎维《模拟CMOS集成电路设计》的一些总结和思考(六)——放大器的频率特性
- stm32中typedef的用法
- github Desktop工具桌面版汉化教程
- OUTLOOK 下邮件如何以人,文件夹来分类inbox
- OpenSSL爆出严重bug漏洞 Heartbleed bug CVE-2014-0160
- 相对位置编码 relative position encoding
- 微信二级不死域名是什么意思?被封后还能访问吗?
- AirServer2023免费无线Mac和PC电脑屏幕镜像投屏工具
- 如何修改默认的FTP帐号或密码
- php特性之intval学习小记
- Unity3d C# 使用Universal Media Player(ump)插件播放视频的众坑之无法播放视频和VLC播放器依赖的问题