由于AVL树是平衡树,因此所有操作仅具有O(logn)。高度也为O(logn),那么AVL树本身的大小为何为O(n),有人可以向我解释吗?我知道您必须计算左子树+1(用于根)+右子树以获取整棵树的大小,但是要获得右子树的大小的运算是log(n)和logn + logn +1不等于O(n)
答案 0 :(得分:0)
要计算树的大小,您必须遍历树中存在的每个节点,因此如果树中有n个节点遍历每个节点一次,最终将导致o(n)的时间复杂度。 / p>
答案 1 :(得分:0)
当我们谈论时间复杂度或空间复杂度时,我们指的是时间或空间需求相对于输入大小变化的速率。例如。当我们说O(1)时,是指无论输入大小如何,时间(在时间复杂度的情况下)或空间(在空间复杂度的情况下)都是恒定的。因此,O(1)不是是指1秒还是1分钟。它仅表示相对于输入大小的常数。如果针对不同的输入大小绘制执行时间,则会得到一条水平线。 O(n)或O(log n)也是如此。
现在有了这种了解,让我们来谈谈AVL树。 AVL树是平衡的二进制搜索树。因此,搜索树中节点的平均时间复杂度为O(log n)。请注意,要搜索节点,您不会访问树的每个节点(与LinkedList不同)。如果必须访问每个节点,那么您会说时间复杂度为O(n)。对于AVL树,每次找到不匹配的树时,都将丢弃一半的树,然后继续搜索其余的一半。
在最坏的情况下,您将在树的每个级别进行一个比较,即等于树的最高高度,因此搜索时间复杂度为O(log n)。左树的大小为不 O(log n)。
谈论大小,您确实需要空间来存储每个节点。如果必须存储1个节点,则需要1个单位空间,即2个节点,2个单位,3个节点,3个单位,依此类推。这个单位可以是10字节,1 KB,5 KB的任何内容。关键点是,如果将计算机内存中输入的空间需求与树的数量作图,则得到的只是从零开始的线性图。是O(n)。
还要进一步澄清,在计算算法的时间或空间复杂度时,如果复杂度为O(1 + log n + 4n + 2 ^ n + 100),我们将其称为O(2 ^ n),即之所以取最大值,是因为我们没有在计算绝对值,而是在计算相对于输入大小的变化率,因此,最大值才是最重要的。
如果您谈论计算树大小的算法的时间复杂性,则需要访问树中的每个节点。由于节点总数为n,因此将为O(n)。