将数据结构副本分配给新实例的时间复杂度是多少?

时间:2014-09-02 20:38:47

标签: c++11 data-structures big-o time-complexity avl-tree

我只有一个小问题: 我有一个AVL树,并希望将它1:1复制到一个新实例。我所做的是创建一个AVLTreeClass的新实例,并为其分配我想用等号复制的树(在C ++ 11中)。

我是否要担心时间复杂性?或者这是否在O(1)中运行?

非常感谢你的帮助!

FunkyPeanut

1 个答案:

答案 0 :(得分:6)

这完全取决于实现,如果没有看到代码,我认为任何人都无法给出明确的答案。但是,有各种合理的实现,即O(1),O(n)和O(n log n)。

复制构造函数的简单实现可能通过迭代旧树中的所有节点并调用公共插入方法将每个节点添加到新树来工作。这需要旧树的每个元素的O(log n)时间,因此复杂度将为O(n log n)。但是,这不是特别有效。另一种方法是盲目地制作树的深层副本。这将需要每个树节点O(1)工作,并且由于树中有n个节点,运行时将是O(n)。没有任何其他迹象,我怀疑你的运行时是 O(n),并且大多数程序员(我相信)也会假设这一点,除非你另有指示。

如果您怀疑副本会很常见但更新很少,您可以考虑使用copy-on-write并让副本共享树的内部表示,只有原始版本或复制树的变化。这将导致副本的时间为O(1),但如果您随后进行了更改,则会花费O(n)或O(n log n)。

或者,您可能拥有persistent AVL树。在这种情况下,树上的任何变异操作都会在时间O(log n)中运行,并生成一个表示操作效果的新树,而不会实际破坏旧版本的树。在这种情况下,副本可以在O(1)中通过共享表示而不会在以后的插入和删除操作中处罚。

希望这有帮助!