Algorithm 什么';这个算法(伪代码)的时间复杂度是多少?

Algorithm 什么';这个算法(伪代码)的时间复杂度是多少?,algorithm,time,complexity-theory,pseudocode,Algorithm,Time,Complexity Theory,Pseudocode,假设树T是一棵二叉树 算法计算深度(节点、深度) 输入:节点及其深度。对于所有深度,使用计算深度(T.root,0)调用 输出:T的所有节点的深度 如果节点!=空的 深度← 节点深度 计算深度(node.left,深度+1) 计算深度(node.right,深度+1) 返回深度 如果结束 我用一个包含7个元素的完整的二叉树在纸上运行它,但我仍然不能确定它的时间复杂度。如果让我猜的话,我会说是O(n*logn)。是O(n) 为了了解时间复杂度,我们需要找出算法所做的工作量,与输入的大小进行比较。在

假设树T是一棵二叉树

算法计算深度(节点、深度)

输入:节点及其深度。对于所有深度,使用计算深度(T.root,0)调用

输出:T的所有节点的深度

如果节点!=空的

深度← 节点深度

计算深度(node.left,深度+1)

计算深度(node.right,深度+1)

返回深度

如果结束

我用一个包含7个元素的完整的二叉树在纸上运行它,但我仍然不能确定它的时间复杂度。如果让我猜的话,我会说是O(n*logn)。

是O(n) 为了了解时间复杂度,我们需要找出算法所做的工作量,与输入的大小进行比较。在该算法中,每个函数调用所做的功是常量(仅将给定值分配给变量)。让我们计算一下函数被调用的次数

第一次调用函数时,将在根上调用它

然后,对于任何后续调用,函数检查节点是否为
null
,如果不是null,则相应地设置深度并设置其子节点的深度。然后,这是递归完成的

现在请注意,该函数在树中的每个节点上调用一次,加上两倍的叶数。在二叉树中,叶数为
n/2
(向上舍入),因此函数调用的总数为:

n+2*(n/2)=2n

这就是算法所做的工作量。所以时间复杂度是O(n)

它是O(n) 为了了解时间复杂度,我们需要找出算法所做的工作量,与输入的大小进行比较。在该算法中,每个函数调用所做的功是常量(仅将给定值分配给变量)。让我们计算一下函数被调用的次数

第一次调用函数时,将在根上调用它

然后,对于任何后续调用,函数检查节点是否为
null
,如果不是null,则相应地设置深度并设置其子节点的深度。然后,这是递归完成的

现在请注意,该函数在树中的每个节点上调用一次,加上两倍的叶数。在二叉树中,叶数为
n/2
(向上舍入),因此函数调用的总数为:

n+2*(n/2)=2n


这就是算法所做的工作量。因此,时间复杂度是
O(n)

每个节点都会被访问,因此无论树的结构如何,对于
n
节点,算法(如所述)的工作与
n
成比例。所以我称之为O(n)。但是这个算法没有意义;传递到算法中的
depth
值被忽略。@TedHopp我取出了深度← 我的伪代码中的node.depth。这似乎是多余的。现在应该可以了,对吧?每个节点都会被访问,所以不管树的结构如何,对于
n
节点,算法(如所写)的工作与
n
成比例。所以我称之为O(n)。但是这个算法没有意义;传递到算法中的
depth
值被忽略。@TedHopp我取出了深度← 我的伪代码中的node.depth。这似乎是多余的。现在应该可以了,对吗?如果我错了,请纠正我,但是这个问题不能被重写为基本级别的顺序遍历,但使用一个变量吗?因此产生了相同的运行时。您是否阅读
深度← node.depth
作为
node.depth=depth
?箭头不代表数据流吗?因为我将其读取为
depth=node.depth
,并且由于递归调用的返回值被忽略,所以初始
computeDepths(T.root,0)
调用的结果是
T.root.depth
,这对我来说毫无意义,因为所有的递归调用都只是浪费时间。关于赋值你是对的。我假设算法的目的是设置每棵树的深度。但在任何情况下,时间复杂性都保持不变@安德列文:耶!你说得对。还有很多其他的方法可以做到这一点。如果我错了,请纠正我,但是这个问题不能被重写为基本的层次顺序遍历,而使用一个变量吗?因此产生了相同的运行时。您是否阅读
深度← node.depth
作为
node.depth=depth
?箭头不代表数据流吗?因为我将其读取为
depth=node.depth
,并且由于递归调用的返回值被忽略,所以初始
computeDepths(T.root,0)
调用的结果是
T.root.depth
,这对我来说毫无意义,因为所有的递归调用都只是浪费时间。关于赋值你是对的。我假设算法的目的是设置每棵树的深度。但在任何情况下,时间复杂性都保持不变@安德列文:耶!你说得对。还有很多其他方法可以做到这一点。