如何计算这个函数的运行时间?
Posted
技术标签:
【中文标题】如何计算这个函数的运行时间?【英文标题】:How to calculate the runtime of this function? 【发布时间】:2021-10-20 13:38:21 【问题描述】:我正在尝试计算我在 Javq 中编写的函数的运行时间,我编写了一个函数来计算 BT 中所有正确子项的总和。
我在函数中使用了递归,但我并不真正了解如何在递归中计算运行时间,但在 BT 中更是如此(刚开始学习该主题)。
这是我写的代码:
public int sumOfRightChildren()
return sumOfRightChildren(this.root);
private int sumOfRightChildren(Node root)
if(root == null) //O(1)
return 0;//O(1)
int sum = 0;//O(1)
if(root.right != null)//O(1)
sum+=root.right.data;//O(1)
sum += sumOfRightChildren(root.right); //worst case O(n) ?
if(root.left != null)
sum += sumOfRightChildren(root.left);//worst case O(n)?
return sum;
我尝试写下我认为需要的运行时,但我认为我做得不对。 如果有人可以帮助指导我,我将非常感激。
我正在尝试计算 T(n)。
【问题讨论】:
这能回答你的问题吗? How do I time a method's execution in Java? 我并不是真的想用数学方法计算 T(n)。 为什么对你没有帮助?您将以纳秒为单位获得执行时间,然后转换为常规秒数或任何您需要的时间 我试图找出最坏情况的运行时间。嗯,就像在女巫函数族(n,n^2,nlogn,logn ...)中一样T(n-1)+5 并找出最坏情况的运行时间。不是字面意思得到它运行所花费的时间。 换句话说,我试图在函数中找到递归调用的数学表达式。 【参考方案1】:由于您只访问每个节点一次,因此很容易看出运行时成本是 T(n) = n * K 其中 n 是二进制中的节点数树和 K 是预期的函数成本。
如果您想明确考虑某些操作的成本,您可能无法准确计算(没有输入示例)。例如,无法计算 sum+=...
的执行次数,因为它取决于特定的树。
在这种情况下,最坏的情况是一棵完整二叉树,如果它是n=1,2,...它们的深度:
-
复杂度为 O(2^n)(无论操作如何,因为所有操作都采用您发布的 O(1))。
sum+=root.right.data;
的成本为 T(n) = 2^n - 1(所有内部节点)。
sum+=...
的成本为 T(n) = 3 * (2^n - 1)(每个内部节点两次,每个节点一次)。
...
(注意:确切的最终表达式可能会有所不同,因为您的 if(root.left != null)
没有用,并且更可取让该条件使用 if(root == null)
)
【讨论】:
哦,好的,我现在明白了。感谢您的帮助,我非常感谢【参考方案2】:好吧,我想我明白了, 最坏的情况是必须检查树中的所有节点,所以答案是:O(n)
【讨论】:
请注意,T(n)(您的问题)与 O(n)(您的答案)不同。 如果解决了你的问题记得采纳他的回答 不是说T(n)在O(n)中吗? T(n)以上是关于如何计算这个函数的运行时间?的主要内容,如果未能解决你的问题,请参考以下文章