当前位置: 首页 > 面试题库 >

深度复制图结构

令狐泓
2023-03-14
问题内容

我有一个带有Node的图类,其中每个Node可以连接到其他节点:

public class Node {
  List<Node> connections;
}

我想复制整个图。第一次尝试,我尝试制作一个类似以下的复制构造函数:

public Node(Node other) {
  connections = new ArrayList<Node>();
  for (Node n : other.connections) { 
    connections.add(new Node(n));
  }
}

因此,深度复制图形将是:

public Graph deepCopy () {
  Graph g = new Graph();
  g.nodes = new ArrayList<Node>();
  for (Node n : nodes) { 
    g.nodes.add(new Node(n));
  }
}

但这不起作用,因为这破坏了节点之间的连接关系。我想知道是否有人建议以一种简单的方式做到这一点?谢谢。


问题答案:

问题是您需要复制节点的身份,而不仅仅是节点的值。具体来说,当您复制某个节点时,您需要处理其所指节点的身份。这意味着复制构造函数或其他某种纯本地复制机制无法完成此工作,因为它一次只能处理一个节点。我不确定这是否有意义,但是我已经键入了它,而我的退格键不起作用。

无论如何,您可以做的是绕过其他一些对象,该对象可以判断哪个新节点对应于哪个旧节点。如果想花哨(谁不想要),可以将其称为图同构。这可以像地图一样简单。如以下完全未经测试的代码所示:

// in Graph
public Graph deepCopy () {
  Graph g = new Graph();
  g.nodes = new ArrayList<Node>();
  Map<Node, Node> isomorphism = new IdentityHashMap<Node, Node>();
  for (Node n : nodes) { 
    g.nodes.add(n.deepCopy(isomorphism));
  }
  return g;
}

// in Node
public Node deepCopy(Map<Node, Node> isomorphism) {
    Node copy = isomorphism.get(this);
    if (copy == null) {
        copy = new Node();
        isomorphism.put(this, copy);
        for (Node connection: connections) {
            copy.connections.add(connection.deepCopy(isomorphism));
        }
    }
    return copy;
}

Sergii提到使用序列化。遍历对象图时,序列化实际上执行的操作非常相似。



 类似资料:
  • 问题内容: 据我了解,地图是Go中的参考类型。因此,分配将进行浅表复制。我计划在golang中进行Maps的递归深层复制。递归,因为我正在处理一个包含JSON的未编组内容的映射。 错误:无法使用(* dest)[key]的地址。(map [string] interface {})我该如何解决?还有其他方法可以绘制深层地图吗? 我在golang的map的内部入门,也将很有用。 问题答案:

  • 问题内容: 我正在尝试复制嵌套列表,但是 不 使用该函数不知道该如何做。 我用了: 和 但事实证明,它们全都是浅表。 有什么提示吗? 问题答案: 我的模拟输入: 策略:遍历传入对象的每个元素,递归地下降到也可迭代的元素中,并创建相同类型的新对象。 无论它是全面的还是没有错误的,我都不会提出任何主张[1](不要传递引用自己的对象!),但是应该让您入门。 [1]真的!这里的重点是演示,而不是涵盖所有可

  • 问题内容: 我想知道是否需要避免在创建一个带有嵌入式对象数组的简单对象时复制对对象的引用。情况如下:我有一个接受JSON并应用一些逻辑然后将对象存储在其中的服务器D B。可以说,我的表单用于保存DB中的团队。服务器接受team作为json。团队有一个TeamMember对象数组,我的表单有一个简单的字段来输入团队成员信息并将其添加到团队teamMembers数组中。现在这是一个问题,当我向数组列表

  • 问题 你想复制一个对象,包含其所有子对象。 解决方案 clone = (obj) -> if not obj? or typeof obj isnt 'object' return obj if obj instanceof Date return new Date(obj.getTime()) if obj instanceof RegExp flags

  • 本文向大家介绍C#复制和深度复制的实现方法,包括了C#复制和深度复制的实现方法的使用技巧和注意事项,需要的朋友参考一下 深度复制与浅表复制的区别在于,浅表复制只复制值类型的值,而对于实例所包含的对象依然指向原有实例。 运行结果: 一、List<T>对象中的T是值类型的情况(int 类型等) 对于值类型的List直接用以下方法就可以复制: 二、List<T>对象中的T是引用类型的情况(例如自定义的实

  • 问题内容: 我想使用自己的Node类在Java中实现树结构。但是我很困惑如何进行深层复制来复制树。 我的Node类将是这样的: 我是递归的新手,所以有什么我可以学习的代码吗?谢谢! 问题答案: 尝试