java - 深度复制图形结构

标签 java data-structures clone deep-copy

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

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));
  }
}

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

最佳答案

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

无论如何,您可以做的是传递一些其他对象,这些对象可以告诉哪个新节点对应于哪个旧节点。如果你想花哨(谁不喜欢?),你可以将其称为 graph isomorphism .这可以是像 map 一样简单的东西。在这个完全未经测试的代码中:

// 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 提到使用序列化;序列化在遍历对象图时实际上做了一些非常相似的事情。

关于java - 深度复制图形结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12886036/

相关文章:

java - Dijkstra 或 A* 在 10x10 网格上,障碍物是随机的,起点在 0,0,终点在 9,9?

c# - 使用 O(1) 内存、O(n) 运行时复杂度且无双重枚举实现 LINQ "chunk by predicate"

将 Draggable 放入可排序后,jQuery Click 事件不起作用

javascript - 为什么要深度克隆 JavaScript 对象而不是仅仅制作一个副本?

javascript - jQuery 克隆无法与可拖动一起使用

java - jooq启动: command line to generate classes

java - 同一 JVM 中的远程 EJB 调用与本地 EJB 调用性能

java - Android onCreate 没有被调用?

algorithm - 对二维数组进行二分搜索以找到局部最大值?这个算法有什么问题?

c++ - 如何实现像 C++ 中的数组一样支持不同类型元素的数据结构?