这是一个伪代码过程,用于检查列表是否有任何重复:
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
}
答案 0 :(得分:0)
对于遍历duplicates函数循环的每次迭代,执行插入操作,即O(log n)。
你经历了n次。
所以你做了一次O(log n)操作n次将你的最终复杂度带到O(n log n)。因此,根据您提供的最佳案例,平均案例和最差案例的信息是相同的。
查看duplicates3函数,循环中现在有这个退出条件。这个条件的作用并不完全清楚,但如果有一种情况可以在一次迭代后退出循环,那么最好的情况就是循环中的一次迭代。