我觉得它相当简单,但似乎我在困扰自己..
以下的复杂性是什么?
// 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是节点的总数。
答案 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
编辑:评论中问题的清晰度帮助我更好地理解了这个问题,修正了废话