如何找到这两个函数的运行时间呢?
How to find the running time of these two functions?
我熟悉大 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)).
你的第一个方法是 O(n) 如果底层树 不平衡 并且这种情况会发生在 所有数据按升序或降序插入.
它将是O(logn),如果底层树像红黑树、AVL树一样平衡而不管数据及其插入顺序。
你的第二种方法对于不平衡树是 O(n) ,对于平衡树它是 O(n) 只有当该树不包含给定的数据,导致您的第二种方法在这种情况下最终遍历整个树。如果它确实包含,那么时间总是 O(logn)
如果树有 n 个单元格,那么你将继续 O(n)
(所有单元格,一次),这是正确答案。不要混淆树的Height
,如果树是平衡的,那可以是O(log n)
。
这两种方法本质上做的是同一件事,就是遍历树寻找某个项目。这两种方法都向左或向右搜索项目,并一直这样做直到到达树的末端。正如@Sumeet 已经提到的,我们不能真正给你一个确切的 Big-O 运行 时间,因为我们不知道树是否平衡。在平衡二叉树的情况下,both方法的搜索时间应该是O(lgn)
。但是,在最大不平衡树的情况下,元素的高度 和元素数量 都将是 n
,因此搜索时间将是 O(n)
。如果您能弄清楚树木的类型,我们或许可以缩小确切的 运行 时间范围。
如果树不平衡,这两种方法都有最坏的情况运行宁时间 O(n)。
如果树是平衡的,第一个将在 O(log n) 中 运行。
即使对于平衡树,第二种方法仍然需要 O(n),因为如果在右半部分找到记录,它会遍历两个子树。它实际上按排序顺序对所有记录进行全面扫描,直到找到记录。实际 运行 时间取决于记录的大小。小记录会更快找到,大记录将需要 O(n)。平均值是 O(n).
我熟悉大 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)).
你的第一个方法是 O(n) 如果底层树 不平衡 并且这种情况会发生在 所有数据按升序或降序插入.
它将是O(logn),如果底层树像红黑树、AVL树一样平衡而不管数据及其插入顺序。
你的第二种方法对于不平衡树是 O(n) ,对于平衡树它是 O(n) 只有当该树不包含给定的数据,导致您的第二种方法在这种情况下最终遍历整个树。如果它确实包含,那么时间总是 O(logn)
如果树有 n 个单元格,那么你将继续 O(n)
(所有单元格,一次),这是正确答案。不要混淆树的Height
,如果树是平衡的,那可以是O(log n)
。
这两种方法本质上做的是同一件事,就是遍历树寻找某个项目。这两种方法都向左或向右搜索项目,并一直这样做直到到达树的末端。正如@Sumeet 已经提到的,我们不能真正给你一个确切的 Big-O 运行 时间,因为我们不知道树是否平衡。在平衡二叉树的情况下,both方法的搜索时间应该是O(lgn)
。但是,在最大不平衡树的情况下,元素的高度 和元素数量 都将是 n
,因此搜索时间将是 O(n)
。如果您能弄清楚树木的类型,我们或许可以缩小确切的 运行 时间范围。
如果树不平衡,这两种方法都有最坏的情况运行宁时间 O(n)。
如果树是平衡的,第一个将在 O(log n) 中 运行。
即使对于平衡树,第二种方法仍然需要 O(n),因为如果在右半部分找到记录,它会遍历两个子树。它实际上按排序顺序对所有记录进行全面扫描,直到找到记录。实际 运行 时间取决于记录的大小。小记录会更快找到,大记录将需要 O(n)。平均值是 O(n).