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

时间:2014-08-29 13:35:12

标签: java algorithm tree

情况

我必须处理相当大的(> 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)

“好”是什么意思?

  1. 运行时间并不重要,代码复杂性和内存是主要限制因素。
  2. 具体来说,由于结构的大小,我希望避免尽可能多的写入。
  3. 解决方案不必是线程安全的,外部同步可确保在合并运行时不会访问任何树。
  4. 我碰巧使用的是Java,但任何命令式的伪代码都可以。

1 个答案:

答案 0 :(得分:1)

我认为David Eisenstat已经提供了一个可行的选择。

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

如果你已经有办法计算两棵树的交集,另一种可能的方法就是计算这个,如果它是空的则继续合并,否则抛出异常。您似乎期望交叉点为空或非常小,因此这不应占用太多空间。您还可以调整代码,以便在找到交叉元素时立即停止。

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