让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)
答案 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)
。
这取消了所有“更高”的替代品,所有“更低”的替代品都是次线性的,你不能在次线性时间内创建数组。