Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 确保树状结构中的失效原子性 形势_Java_Algorithm_Tree - Fatal编程技术网

Java 确保树状结构中的失效原子性 形势

Java 确保树状结构中的失效原子性 形势,java,algorithm,tree,Java,Algorithm,Tree,我必须处理相当大的(>10000个条目)树结构。不是二叉树,而是具有自然层次结构的数据(例如,根的子元素是大陆,大陆的子元素是国家,国家的子元素是城市) 合并是通过递归地将具有相同名称的条目配对并计算其子项的并集来完成的 Europe Germany Düsseldorf Hamburg (merged with) Europe Belgium Mechelen Germany Stuttgart (should give) Europe

我必须处理相当大的(>10000个条目)树结构。不是二叉树,而是具有自然层次结构的数据(例如,根的子元素是大陆,大陆的子元素是国家,国家的子元素是城市)

合并是通过递归地将具有相同名称的条目配对并计算其子项的并集来完成的

Europe
  Germany
     Düsseldorf
     Hamburg
(merged with)
Europe
  Belgium
     Mechelen
  Germany
     Stuttgart
(should give)
Europe
  Belgium
     Mechelen
  Germany
     Düsseldorf
     Hamburg
     Stuttgart
条目总是经过排序的,因此您永远不会出现相同条目在不同树中以不同顺序出现的情况

问题 当合并两个这样的树时,什么是确保故障原子性的好方法?具体来说,如果树在同一级别上包含相同的叶条目,则整个合并操作将失败

Europe
  Belgium
     Gent
     Mechelen
(merged with)
Europe
  Belgium
     Mechelen
(should fail, because Mechelen appears in both trees under Europe/Belgium)
我说的“好”是什么意思?
  • 运行时间并不重要,代码复杂性和内存是主要限制
  • 具体来说,由于结构的大小,我希望尽可能避免写时复制
  • 解决方案不必是线程安全的,外部同步可以确保在合并运行时不会访问任何树
  • 我碰巧正在使用Java,但任何命令式伪代码都可以

  • 我认为大卫·艾森斯塔已经给出了一个可行的选择

    正如Durandal提到的,您可以在开始合并操作之前检查重复节点

    如果您已经有了计算两棵树的交集的方法,那么另一种可能的方法很简单,即计算该交集,如果该交集为空,则继续合并,否则抛出异常。似乎您希望交叉口是空的或非常小,因此这不应该占用太多空间。您还可以调整代码,使其在找到相交元素时立即停止


    (最自然的选择,我认为您已经排除了,因为空间要求:创建一个新树,它是原始树的副本。在新树上进行合并操作,并在成功后继续使用新树。这种方法类似于像Java的字符串这样的不可变对象如何进行操作。)

    “合并“这里是什么意思?从你的描述来看,仅仅检查任何级别上是否存在冲突条目还不够吗?好问题,更新了我的答案以使问题更清楚。嗯,我可能会通过两次,是的。如果有一个启用/禁用破坏性操作的标志
    boolean doMerge
    ,您可能不需要复制太多代码。