如何计算这个函数的运行时间?

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)

以上是关于如何计算这个函数的运行时间?的主要内容,如果未能解决你的问题,请参考以下文章

求java中计算程序运行时间的函数!

MATLAB中计算函数运行时间的方法

如何分析特定函数在 R 中运行的时间长度

如何异步运行函数以使用 Django 应用在 Heroku 上并行计算?

计算给定递归函数的精确运行时间(时间复杂度)

Windows 计算程序运行时间(高精度计时)