给出此函数(用伪代码编写),时间复杂度是多少?尝试一下,我会说时间复杂度是θ(n ^ 3),因为我们需要先遍历树θ(n),然后乘以ANCESTOR的贡献θ(n)和ADDTOQUEUEθ(n)的贡献。这是正确的吗?
================================================ =====================
ANCESTOR进行与节点深度成比例的许多操作
ADDTOHEAD进行恒定数量的操作
ADDTOQUEUE进行与列表长度成比例的许多操作
`FUNCTION(T)/ * T是一棵充满整数的树* /
L.head = NULL /* L is a new empty linked list (of integers) */
RIC_FUNC(T.root,L)
return L
REC_FUNC(v,L)
if(v==NULL)return
if(ANCESTOR(v))
ADDTOQUEUE(L,v.info)
else
ADDHEAD(L,v.info)
REC_FUNC(v.left,L)
REC_FUNC(v.right,L)
``
答案 0 :(得分:1)
基本上,您是正确的:O(n^3)
。
但是,我有ANCESTOR
和ADDHEAD
处于相反的一面(这意味着您不能用伪代码证明)-这意味着第一次运行L
短而v
高,因此ANCESTOR
将长而ADDHEAD
短,经过一些步骤,它们将相等,并且从这一点开始,v
会更低并且L
更大,因此ANCESTOR
会很快,但ADDHEAD
会很长。
如果我的假设是正确的,并且ADDHEAD
和ANCESTOR
的“速度”在不同方向上是相同的复杂度,那么您的复杂度是{{1} }(就像在每个节点中一样,您将获得:1 + n,2+(n-1),3+(n-2)...,它们结束了n + 1中的每一步)。