结合

时间:2018-02-24 21:25:52

标签: time time-complexity big-o

这是一个伪代码过程,用于检查列表是否有任何重复:

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),因为插入和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 个答案:

答案 0 :(得分:0)

对于遍历duplicates函数循环的每次迭代,执行插入操作,即O(log n)。

你经历了n次。

所以你做了一次O(log n)操作n次将你的最终复杂度带到O(n log n)。因此,根据您提供的最佳案例,平均案例和最差案例的信息是相同的。

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