在Erlang中进行四叉树操作 - 编辑四叉树记录会使父母无效吗?

时间:2014-05-08 10:26:03

标签: recursion erlang quadtree

所以这个问题是理论上的,我想知道这个场景将如何为我们的理论四叉树提供支持。

树本身是一个包含对象,边界和子节点的记录。截至目前,孩子们还有其他四叉树记录。因此,根据已完成的分割数量,它将成为一个大型结构。

如果我想说我要删除级别为3的子树中的对象。是否可以正确保存父级及其父级?如果我写这样的话:

Quad#quad{objects = ListWithoutSaidObject}.

实际上没有以函数调用将上述行的结果保存在适当的子变量中的方式进行递归?像这样:

delete_object(Quad, ObjectToDelete) ->
    <nice code to find proper child if not present in current>
    Quad#quad{child = delete_object(Quad#quad.child, ObjectToDelete)}.

其中delete_object返回相同的四叉树而没有所述对象(如果它在该树中),否则它会继续挖掘,直到找到包含它应该删除的对象的树。找到后删除它,并返回新的子树。

这不是尾部跟踪,据我所知,这是我需要做的,不要弄乱树。我错了吗?我想如果我将每棵树作为一个单独的过程实现并将它们的pid存储在每棵树中并保存了父母,我可以更有效地做到这一点。

由于我没有任何代码,但我无法提供示例。我在实施之前就已经问过这个问题了。我会这样做。

2 个答案:

答案 0 :(得分:2)

Erlang数据结构是不可变的,因此如果不获取原始树的新副本,则无法改变子树。副本将尽可能地与原始树共享 - 这只能因为所说的不变性 - 所以这可能听起来更糟糕,因为它在实践中。

除了不必担心混乱的数据结构之外,它还使您可以同时使用旧树和新树。

在你的例子中,你确实需要递归,如果这很麻烦,你可以构建一个更高阶的函数来进行递归,并将它作为参数的乐趣传递给孩子们。

答案 1 :(得分:1)

除了Peer Stritzinger的回答:

四叉树通常不太适合删除。