两个嵌套循环的简单算法复杂性

时间:2017-03-26 17:35:14

标签: algorithm tree time-complexity

我觉得它相当简单,但似乎我在困扰自己..

以下的复杂性是什么?

// let's say that Q has M initial items
while Q not empty
  v <- Q.getFirst

  for each z in v // here, every v cannot have more than 3 z's
    ...
    O(1) operations here
    ...
    Q.insert(z)
  end
end

这种情况发生的次数取决于在某些时候v是否没有更多的z(让我们称这个数字为N)

复杂性O(MxN ^ 2)或我错了吗?它就像拥有一个具有M个父节点的树,每个节点最多可以有三个子节点。 N是节点的总数。

1 个答案:

答案 0 :(得分:1)

您的算法复杂度应该具有O((M * v) - 作为子节点的父节点)的上限,这更好地表示为O(n)其中n是树中的节点数,因为您只迭代树一次。

根据您的操作,您可能需要考虑Q.insert(z)Q.getFirst()操作的运行时间,因为根据您的数据结构可能值得考虑。

假设Q.insert()Q.getFirst()运行时间是O(1),你可以说O(M * v)是一个近似边界,但由于v元素可以重复,你最好说明运行时只是O(n)因为O(m * v)实际上高估了所有情况下的上限。 O(n)对于树的每个实例都是精确的(n是节点数)。

我会说把它称为O(n)更安全,因为我不知道你的插入的确切实现 - 尽管有一个链表,插入和get先得到O(1)操作。 (如果正确实现,大多数二叉树插入将为O(log n) - 未提供足够的信息)

安全地考虑你的运行时分析O(n)不应该伤害你,但是根据你投球的人,这个额外的变量似乎是不必要的。

HTH

编辑:评论中问题的清晰度帮助我更好地理解了这个问题,修正了废话