使用O(n log n)存储和O(log n)查询时间的数据结构应该用于范围最小查询?

时间:2013-01-05 15:01:31

标签: java

假设我们给出了n个值x1,x2 ... xn的序列,并寻求快速回答形式的重复查询:给定i和j,找到xi中的最小值... xj 设计一个使用O(n log n)空间的数据结构,并在O(log n)时间内回答查询。

我知道具有O(n)空间和O(log n)时间的数据结构的解决方案,但我需要一个答案 使用O(n log n)空间不小于。

有什么建议吗?

O(n)空间的解决方案:

O(n)空间:对于a1,a2,a3,... an的输入,构造一个包含最小(a1,..,ak)和最小(ak + 1,..,an)的节点)其中k = n / 2。递归构造树的其余部分。现在,如果你想找到ai和aj之间的最小值:确定i,j的最低共同祖先。让它从我开始并继续前进,直到你击中k。在每次迭代时检查子节点是否为左节点。如果是,则比较右子树的min并相应地更新当前min。类似地,对于j,检查它是否是正确的节点....在节点k比较每个子树返回的值并返回最小值

1 个答案:

答案 0 :(得分:3)

首先,O(n)也是O(n logn),因此技术上任何O(n)的解决方案也会自动O(n logn)

您似乎要问的是使用Θ(n logn)内存的解决方案(请注意theta)。我不得不说,我认为这是一个有点奇怪的要求,因为你声称已经有一个优越的Θ(n)解决方案。

在任何情况下,您都可以通过制作Θ(n)个数据结构副本,将Θ(n logn)解决方案简单地转换为log(n)个解决方案。