我正在寻找一种方法来证明n-ary树的pre-tree遍历算法的运行时间。
每个节点可以有任意数量的子节点。
我似乎只能找到二叉树的证明。
我直观地理解,运行时间将是O(n),但我对如何提出严格的证据感到困惑。
答案 0 :(得分:1)
在前序遍历中的节点v处完成的工作是O(1 + c_v),其中c_v是节点v的子节点数。这是因为我们做了一些不变的工作量,然后访问每个孩子一次
在所有节点上对此进行求和得到O(n)加上所有节点上的O(c_v)之和v。该数量为O(n),因为对每个树节点的子节点数求和相等于求和除了root之外的所有节点(你知道为什么吗?)
总的来说,运行时是O(n)。
希望这有帮助!
答案 1 :(得分:0)
我只是想尝试自己证明一下,然后找到这篇文章,所以我将分享我所能证明的东西。
证明是针对二叉树的递归DFS(按顺序或前顺序或后顺序),前提是它是完美平衡的。
我的表达方式可能并不完美,但应能给出要点。
首先使用递归关系表示访问所有节点的时间等于访问根的恒定时间c
+访问左子树的所有节点T((n-1)/2)
的时间+访问正确的子树T((n-1)/2)
的所有节点的时间。而且我们知道访问一个节点的树仅需花费恒定的时间T(1)=c
。
T(n) = 2T((n-1)/2) + c
T(1) = 1
通过对递归进行几次迭代,我们注意到一个模式,并使用k
来显示这种关系。因为我们知道基本情况T(1)=c
,所以我们解决了k
(绿色)。这从本质上告诉我们需要遍历另一个级别(深度)的次数。
将k
代入方程式,一切都会很好地抵消,我们得到T(n)=O(n)
。