我的编程空间,编程开发者的网络收藏夹
学习永远不晚

深拷贝一个图的方法教程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

深拷贝一个图的方法教程

深拷贝一个图的方法教程,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

前言

在此之前,你需要对一些概念搞清楚:什么是深拷贝、浅拷贝?

浅拷贝:如果拷贝的是引用类型(非基本类型),就只会拷贝一层(嵌套的对象不会被拷贝),如果原对象发生改变,那么拷贝对象也会发生改变。

深拷贝:深拷贝的话会拷贝多层,嵌套的对象也会被拷贝出来,相当于开辟一个新的内存地址用于存放拷贝的对象。

用通俗一点(可能不完全确切)的话解释,浅拷贝就像你的双胞胎兄弟一样,你们父母亲人都是一样的;而深拷贝就像另一个平行的时空,那里有另一个你的一切。

既然搞懂了深浅拷贝以及其区别,我们再看看图,图一般用来表示节点和节点之间的关系,常分为有向图和无向图,在这里我们以无向图(一旦连接即双向)为主题。

我们对图的表示一般有邻接矩阵和邻接表,邻接矩阵的话比较直观的表示一个图的连通性,操作维护更简单,在Java中一般使用二维数组表示邻接矩阵,数组中的值可以表示两个节点的权值。

深拷贝一个图的方法教程

邻接矩阵表示一个图

使用邻接矩阵虽然简单但是有个比较差的就是浪费较多内存空间,所以很多情况还是使用邻接表来表示一个图,邻接表一般是数组+链表的这么一个组合。但是也有一些特殊情况各个节点比较独立的不用数组联立。

深拷贝一个图的方法教程

邻接表表示一个图

问题分析

如果这个图使用邻接表表示,给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆),这个问题是力扣131克隆图原题。

图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。

class Node {     public int val;     public List<Node> neighbors; }

深拷贝一个图的方法教程

图片来源力扣

给一个节点的引用,怎么克隆这个图呢?

如果只有这一个节点,那么克隆这个节点就好。如果这个节点只有一层邻居,那克隆这个邻居的列表(克隆List集合)即可。

但事实是这个节点可能有多层邻居,并且邻居之间可能存在着复杂联系。

深拷贝一个图的方法教程

可能的一个图

克隆整个图,所以图的每一个节点都要被克隆的,我们需要使用图论的搜索算法来枚举所有节点,并且在遍历的过程中我们需要想办法将节点之间的关系也克隆下来。遍历的方法可以使用dfs或者bfs,这里使用bfs来实现。

凡是遇到苦难的时候我们模拟一下这个克隆的过程即可,通过下面这张图可以大概了解克隆图的过程中,最大的问题是要避免创建重复节点。即有的节点一旦被创建它的引用可能在后面会被用到的。

深拷贝一个图的方法教程

模拟克隆的过程

那我们该如何解决这个问题呢?怎么样能够快速找到对应节点的引用?

这里最好的方法是使用HashMap,其中key保存的是被克隆图中的节点,而value是在克隆图中所对应的节点,这样在克隆新图的过程中,我们遍历被克隆图中节点邻居的时候,就可以用哈希判断这个节点对应的value是否存在(即这个节点在克隆图中是否存在)。

如果存在那么直接使用HashMap找到对应节点放入克隆图中新创建的List中。

不过不存在说明这个节点第一次遇到,克隆这个节点,先放到hashMap中与被克隆节点对应,然后放入克隆图中新创建的List中。

这个流程其中大概是这样的:

深拷贝一个图的方法教程

其中一个过程Map的变化和作用

有了上面的分析,想必你对这个问题的解决已经有了思路和想法,下面就提供一下代码实现。

  class Solution {     public Node cloneGraph(Node node) {         if(node==null)                 return null;         Map<Node, Node>map=new HashMap<Node, Node>();//节点映射克隆的节点          Queue<Node>oldqueue=new ArrayDeque<Node>();//bfs队列         oldqueue.add(node);         Node value=new Node(node.val);//先将返回的节点 创建、映射         map.put(node, value);         while (!oldqueue.isEmpty()) {             Node oldnode=oldqueue.poll();             Node newnode=map.get(oldnode);//找到这个节点对应克隆的映射(一定存在)             List<Node>list=oldnode.neighbors;//邻居             List<Node>listnew=new ArrayList<Node>();//克隆邻居             for(Node team:list)             {                 if(map.containsKey(team))                 {                     listnew.add(map.get(team));                     //点以前已经遇到,直接添加到邻居列表                 }                 else {//这个邻居第一次碰到,需要创建新节点赋予值                     Node no=new Node(team.val);                     map.put(team, no);//映射                     listnew.add(no);                     oldqueue.add(team);//这个点第一次遇到,要将它放到队列中进行bfs搜索                 }             }             newnode.neighbors=listnew;//将节点的邻居指向list         }         return value;     } }

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

深拷贝一个图的方法教程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java Cloneable接口的深拷贝与浅拷贝方法

本篇内容主要讲解“Java Cloneable接口的深拷贝与浅拷贝方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java Cloneable接口的深拷贝与浅拷贝方法”吧!Cloneable接
2023-06-29

C#深拷贝的方法是什么

今天小编给大家分享一下C#深拷贝的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。测试平台:Intel 9700K+
2023-06-30

java实现深拷贝的方法是什么

Java实现深拷贝的方法有以下几种:1. 实现Cloneable接口并重写clone()方法:在需要深拷贝的类中实现Cloneable接口,并重写clone()方法,然后在clone()方法中调用被拷贝对象的属性对象的clone()方法进行
2023-08-14

vue深拷贝的实现方法有哪些

这篇文章主要讲解了“vue深拷贝的实现方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue深拷贝的实现方法有哪些”吧!vue深拷贝的三种实现方式:1、通过递归方式实现深拷贝;2、J
2023-07-05

es6实现深拷贝的方法是什么

ES6实现深拷贝的方法有多种,以下是其中一种常用的方法:1. 使用`JSON.parse()`和`JSON.stringify()`方法:```javascriptfunction deepCopy(obj) {return JSON.pa
2023-10-09

Python中的复制操作及copy模块中的浅拷贝与深拷贝方法

程序中常常需要复制一个对象, 按思路应该是这样的a = [1, 2, 3] b = a# [1, 2, 3] print b 已经复制好了,但是现在得改变一下第一个元素的值把它改成5b[0] = 5 # [5, 2, 3] print b
2022-06-04

js数组直接赋值的问题(js数组的浅拷贝与深拷贝方法)

JS数组在直接赋值时属于数组的浅拷贝,新数组保存的是原数据的内存地址,修改新数组或原数组其中一个数组,另一个数组也会相应的变化,数组的直接赋值属于数组的浅拷贝,JS存储对象都是存内存地址
2022-11-13

Python实现拷贝多个文件到同一目录的方法

本文实例讲述了Python实现拷贝多个文件到同一目录的方法。分享给大家供大家参考,具体如下: 有一个文件,里面存有多个文件名,一个文件名一行。如果想把这些文件拷贝到一个目录,可以用下面的代码。下面的代码应该是跨系统的,除了分隔文件全路径那一
2022-06-04

python使用paramiko实现远程拷贝文件的方法

本文实例讲述了python使用paramiko实现远程拷贝文件的方法。分享给大家供大家参考,具体如下: 首先是安装paramiko库(其实现了SSH2安全协议),ubuntu下可直接通过源安装:sudo apt-get install py
2022-06-04

一个新的CSS图片替换的技巧方法教程

这篇文章主要讲解了“一个新的CSS图片替换的技巧方法教程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“一个新的CSS图片替换的技巧方法教程”吧!-9999 px的形象替代技术已经流行了一个十
2023-06-08

linux采用scp命令拷贝文件到本地,拷贝本地文件到远程服务器的方法

如下所示: 拷贝远程服务器的文件到本地: scp -r -P 端口号 用户名@IP地址:/usUexroKr/local/tomcat_airc/webapps/ /tUexroKmp/kyj/ 拷贝本地
2022-06-04

ansible拷贝远程文件到本地的方法是什么

在使用Ansible拷贝远程文件到本地的方法有两种:使用`fetch`模块:在playbook中使用`fetch`模块,指定源文件路径和目标文件路径,例如:- name: Fetch file from remotehosts: tasks
2023-10-24

编程热搜

目录