Java 确保树状结构中的失效原子性 形势
我必须处理相当大的(>10000个条目)树结构。不是二叉树,而是具有自然层次结构的数据(例如,根的子元素是大陆,大陆的子元素是国家,国家的子元素是城市) 合并是通过递归地将具有相同名称的条目配对并计算其子项的并集来完成的Java 确保树状结构中的失效原子性 形势,java,algorithm,tree,Java,Algorithm,Tree,我必须处理相当大的(>10000个条目)树结构。不是二叉树,而是具有自然层次结构的数据(例如,根的子元素是大陆,大陆的子元素是国家,国家的子元素是城市) 合并是通过递归地将具有相同名称的条目配对并计算其子项的并集来完成的 Europe Germany Düsseldorf Hamburg (merged with) Europe Belgium Mechelen Germany Stuttgart (should give) Europe
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)
我说的“好”是什么意思?
我认为大卫·艾森斯塔已经给出了一个可行的选择 正如Durandal提到的,您可以在开始合并操作之前检查重复节点 如果您已经有了计算两棵树的交集的方法,那么另一种可能的方法很简单,即计算该交集,如果该交集为空,则继续合并,否则抛出异常。似乎您希望交叉口是空的或非常小,因此这不应该占用太多空间。您还可以调整代码,使其在找到相交元素时立即停止
(最自然的选择,我认为您已经排除了,因为空间要求:创建一个新树,它是原始树的副本。在新树上进行合并操作,并在成功后继续使用新树。这种方法类似于像Java的字符串这样的不可变对象如何进行操作。)“合并“这里是什么意思?从你的描述来看,仅仅检查任何级别上是否存在冲突条目还不够吗?好问题,更新了我的答案以使问题更清楚。嗯,我可能会通过两次,是的。如果有一个启用/禁用破坏性操作的标志
boolean doMerge
,您可能不需要复制太多代码。