【发布时间】:2020-07-24 22:46:42
【问题描述】:
我有这段代码,它与本网站上具有相同问题的其他一些代码略有不同:
public void printAllRootToLeafPaths(Node node,ArrayList path) {
if(node==null){
return;
}
path.add(node.data);
if(node.left==null && node.right==null)
{
System.out.println(path);
return;
}
else {
printAllRootToLeafPaths(node.left, new ArrayList(path));
printAllRootToLeafPaths(node.right,new ArrayList(path));
}
}
有人可以解释为什么最好的情况是 O(nlogn) 吗?
最坏的情况,树分解成一个链表,数组被复制 1+2+3+...+n-1+n 次,相当于 n^2,所以时间复杂度是 O(n^2) .
沿着路径中的每个节点复制最佳情况数组。所以复制它看起来像 1+2+3+...+logn。 N/2 次。那么,如果 1+2+3+...+n-1+n 是 n^2,为什么总和 (logn)^2 不是呢?做最好的情况 O(n(logn)^2)?
【问题讨论】:
-
这段代码略有不同,因为每次调用方法都会复制数组。我的印象是复制数组会增加时间复杂度。也就是说,复制数组的成本 O(l) l 是数组的长度。因此对于每个路径中的每个节点,复制数组看起来像 1+2+3+...+logn。但是,似乎代码,添加整个数组一次的行为是 O(logn) (或者如果它被打印,它将是 O(logn)。所以我很困惑。是否为每个调用复制数组不会添加到时间复杂度?打印会增加时间复杂度吗?