假设我们给出了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比较每个子树返回的值并返回最小值
答案 0 :(得分:3)
首先,O(n)
也是O(n logn)
,因此技术上任何O(n)
的解决方案也会自动O(n logn)
。
您似乎要问的是使用Θ(n logn)
内存的解决方案(请注意theta)。我不得不说,我认为这是一个有点奇怪的要求,因为你声称已经有一个优越的Θ(n)
解决方案。
在任何情况下,您都可以通过制作Θ(n)
个数据结构副本,将Θ(n logn)
解决方案简单地转换为log(n)
个解决方案。