假设给定一个包含 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 从 i 开始并继续移动直到你击中 k。在每次迭代时检查子节点是否是左节点。如果是,则比较右子树的最小值并相应地更新当前最小值。同样,对于 j,检查它是否是正确的节点.... 在节点 k 比较每个子树返回的值并返回 min