代码之家  ›  专栏  ›  技术社区  ›  user3487554

时间复杂性组合

  •  0
  • user3487554  · 技术社区  · 7 年前

    下面是一个伪代码过程,用于检查列表是否有重复项:

    duplicates(a,n) {
        t = EmptyTree
    
        for (int i = 0; i < n; i++) {
            insert(a[i], t)
        }
    
        if (isIn(EmptyTree, t))
            return true
        else
            return false
     }
    

    a是要检查的数组,n是数组的长度。insert和isIn都具有时间复杂性O(log2n)(这是对数到基数2)。我的问题是,整个复制过程的平均情况和最坏情况时间复杂度是多少?我认为这两者都应该是O(log2n),因为insert和isIn都有这个时间复杂度,但让我感到困惑的是for循环,因为它为每个元素调用insert-这是否意味着过程将是O(n),因为这是for循环的时间复杂度?

    编辑:调整的程序

    duplicates3(a,n) {
        t = EmptyTree
    
        for (int i = 0; i < n; i++) {
            insert(a[i], t)
    
            if (isIn(EmptyTree, t))
                return true
        }
    
        return false
     }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   MattC    7 年前

    对于通过duplicates函数中的循环进行的每次迭代,都会执行插入操作,即O(log n)。

    你通过了n次循环。

    因此,您执行了n次O(log n)操作,使最终的复杂性达到O(n log n)。因此,根据您提供的信息,最佳情况、一般情况和最坏情况是相同的。


    看看duplicates3函数,现在循环中存在这个退出条件。现在还不完全清楚这个条件的作用,但如果有一种情况,它可以在一次迭代后退出循环,那么最好的情况就是通过循环进行一次迭代。