找到创建数组的最严格上限(在几个选项中)

时间:2015-02-16 12:22:46

标签: arrays algorithm data-structures time-complexity computer-science

A,一组数字。我们需要创建一个B数组B[i] = min(A[i],...,A[i+sqrt(n)]

为什么创建B最严重上限是O(nlogn)

我实际上得到了一个选项列表:

  • O(sqrt(n)*logn)
  • O(n/logn)
  • O(n*logn)
  • O(nlog(n)^2)
  • O(n*sqrt(n))
  • O(n^2)

1 个答案:

答案 0 :(得分:2)

答案是O(nlogn),因为它是最低但不是次线性的选项。

可以在O(nlogn)中通过维护大小为sqrt(n)的排序DS(例如自我平衡BST)来完成,并迭代删除并向其添加元素(在阵列上运行滑动窗口时) )。
每次迭代都在O(log(sqrt(n)) = O(1/2*log(n)) = O(logn)完成,并且有O(n)次迭代,因此总共O(nlogn)

这取消了所有“更高”的替代品,所有“更低”的替代品都是次线性的,你不能在次线性时间内创建数组。