【问题标题】:What is the time complexity assigning a datastructure-copy to a new instance?将数据结构副本分配给新实例的时间复杂度是多少?
【发布时间】:2014-09-02 20:38:47
【问题描述】:

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

我需要担心时间复杂度吗?还是在 O(1) 中运行?

非常感谢您的帮助!

时髦的花生

【问题讨论】:

  • Do I have to worry about time complexity? Or does this run in O(1)?谁知道实现是否留给想象。
  • 嗯..我希望有一个通用的答案...如果我简化了这个问题,这可以回答吗?:复制数据结构的时间复杂度是多少,例如一个标准数组,包含 20 个新数组实例的条目?
  • 没有人知道,但我认为除了 O(n) 之外没有其他方法可以让它运行 - 你需要将每个节点复制一次。没有看到标准,但我非常怀疑它是否允许“构建”树而不是复制。

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


【解决方案1】:

这完全依赖于实现,并且在没有看到代码的情况下,我认为没有人可以给出明确的答案。但是,有各种合理的实现,可能是 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) 中进行复制,而不会对插入和删除操作进行后续惩罚。

希望这会有所帮助!

【讨论】:

  • 这比我想知道的还要多!非常感谢:)
猜你喜欢
  • 2011-11-09
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多