Algorithm 该算法的复杂度如何达到O(n^2)?

Algorithm 该算法的复杂度如何达到O(n^2)?,algorithm,data-structures,Algorithm,Data Structures,设v为树T的节点。节点v的深度可定义如下: 如果v是根,则v的深度为1 否则,v的深度为1加上v父对象的深度 基于上述定义,递归算法depth(如下面的算法所示)通过递归调用v的父节点来计算树的节点v的深度,并将返回的值加1 算法深度(T,y): 步骤1:如果T.isRoot(v),则返回1 步骤2:否则,返回1+深度(T,T.父级(v)) 树T的高度等于T的外部节点的最大深度。虽然此定义是正确的,但它不会产生有效的算法。事实上,如果我们将上述深度查找算法应用于树T中的每个节点,我们将导

设v为树T的节点。节点v的深度可定义如下:

  • 如果v是根,则v的深度为1
  • 否则,v的深度为1加上v父对象的深度
基于上述定义,递归算法depth(如下面的算法所示)通过递归调用v的父节点来计算树的节点v的深度,并将返回的值加1

算法
深度(T,y)
  • 步骤1:如果
    T.isRoot(v)
    ,则返回
    1
  • 步骤2:否则,返回
    1+深度(T,T.父级(v))
树T的高度等于T的外部节点的最大深度。虽然此定义是正确的,但它不会产生有效的算法。事实上,如果我们将上述深度查找算法应用于树T中的每个节点,我们将导出一个O(n2)时间算法来计算T的高度

根据上面的陈述,它怎么可能是O(n2)?如果我们在每个外部节点上尝试此算法,则需要O(n),并且要找到最大值,则需要O(n)。所以总的复杂度应该是O(n)+O(n)=O(2n)=O(n),对吗

如果我们在每个外部节点上尝试此算法,则需要O(n)

这是不对的。您将应用算法
n
次,其中每个调用占用
O(n)
时间,这将导致总共
O(n^2)
时间


当然,这是假设没有结果的缓存/记忆(因此我们正在做大量重复的工作)。如果有,那么它确实总共是
O(n)

算法的最坏情况是一棵不平衡的树。例如,如下图所示的树:

上面的树有5个外部节点和5个内部节点,因此正好有一半的节点是外部节点。从A开始,有一个父级。从B开始,有2个,等等。因此访问的家长总数(
P
)为
1+2+3+…+(n/2)

使用
p=(n/2)(n/2+1)/2=(n^2+2n)/8
。忽略常数因子(8)和不太占优势的项(2n),我们可以看到
P
是O(n^2)。

在渐近表示法中,n^2可能意味着,对于访问的每个节点,最大n或n-1的节点数都是可变的。 让我们考虑一下:


当您为节点1调用递归函数时,它会立即返回,但当您为节点5调用递归函数时,您需要重新计算所有节点的深度,直到节点1,这意味着您访问了所有其他节点,因为您没有使用记忆。因此,对于每个节点,你都要访问[1到n-1个节点]。

如果你应用记忆化,那么你必须考虑边缘的数量,你不能直接说它是O(n)。相反,它应该是O(n+E),因为我们不知道n和E中的哪一个占主导地位,因为它们都是幂1。这是一棵树,所以根据定义它有n-1条边@MateenAh!对但对于该算法的推广仍然是如此。