我熟悉大O符号和运行时间,大部分时间我都能识别算法的运行时间,但我不确定这个算法。 我在这里处理一棵树。
第一种方法:
static boolean containsData(TreeNode treeRoot, String data) {
if(treeRoot == null)
return false;
if(data.equals(treeRoot.data))
return (true);
else if((data.compareTo(treeRoot.data))<0)
return(containsData(treeRoot.left, data));
else
return(containsData(treeRoot.right, data));
}
第二种方法:
static boolean containsData2(TreeNode treeRoot,String data){
if (treeRoot != null) {
if (treeRoot.data.contains(data)) {
return true;
} else {
return containsData2(treeRoot.left,data) || containsData2(treeRoot.right,data);
}
}
return false;
}
我想说两种方法都是 O(n)我看不出其中一种方法是 O(log(n))。
答案 0 :(得分:4)
如果树不平衡,两种方法的最坏情况都是O(n)的运行时间。
如果树是平衡的,第一个将在O(log n)中运行。
即使对于平衡树,第二种方法仍然需要O(n),因为如果在右半部分找到记录,它会遍历两个子树。它实际上按排序顺序对所有记录进行全面扫描,直到找到记录。实际运行时间取决于记录的大小。一个小记录将被发现更快,一个大记录将需要O(n)。平均值是O(n)。
答案 1 :(得分:3)
这两种方法基本上都做同样的事情,它遍历寻找某个项目的树。两种方法都向左或向右搜索项目,并继续这样做直到到达树的末尾。正如@Sumeet已经提到的,我们无法真正给你一个确切的Big-O运行时间,因为我们不知道树是否平衡。在平衡二叉树的情况下,两个方法的搜索时间应为O(lgn)
。但是,在最大不平衡树的情况下,高度和元素的数量都为n
,因此搜索时间为O(n)
。如果您可以澄清树的类型,我们可以缩小准确的运行时间。
答案 2 :(得分:2)
如果基础树不平衡,您的第一种方法将是 O(n),并且当所有数据按升序插入时都会出现这种情况或降序。
O(logn),如果基础树平衡,如红黑树,AVL树,无论数据及其插入顺序如何。
对于非平衡树,您的第二种方法是 O(n);对于平衡树,只有当树不包含给定数据时,它才会 O(n) ,导致你的第二个方法在这种情况下最终遍历整个树。如果确实包含,则时间总是 O(logn)
答案 3 :(得分:0)
如果树有n个单元格,那么你将继续O(n)
(只是所有这些,一次),这是正确的答案。不要混淆树的Height
,如果树是平衡的,可以是O(log n)
。