如何找到这两个功能的运行时间?

时间:2016-10-19 04:33:40

标签: java algorithm binary-tree

我熟悉大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))

4 个答案:

答案 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)