在 O(n^4) 空间和 O(n^5) 时间内创建一个提供 O(1) 查找的数据结构很简单。如果 M 超过 O(n^2) 可能值得这样做。在 O(n^2) 空间和 O(n^3) 时间内创建一个在 O(n) 时间内提供查找的数据结构也很简单。如果 M 是 O(n^2),那可能是一个更好的权衡;即,O(n^3) 预计算时间和 O(n^3) 时间用于 O(n^2) 查找,每个 O(n)。
对于预计算,创建一个 n × n 列表数组。令 L_pq 表示 n × n 网格的单元 p,q 的列表。每个列表最多包含 n 个矩形,所有列表都按相同的关系排序(即,如果Ri < Rj
在一个列表中,Ri < Rj
则在该对所在的每个列表中)。列表集需要花费时间 O(n^3) 来计算,可以作为“对于 n^2 单元格中的每个 C,对于 n 个矩形中的每个 R,如果 R 中的 C 将 R 添加到 L_C”或“对于每个 R在 n 个矩形中,对于 R 中的每个单元格 C,将 R 添加到 L_C"。
给定一个查询 (a,b,c,d),在 O(n) 时间内计算列表 L_ab 和 L_cd 的交集的大小。对于 O(1) 的查找,首先进行上面提到的预计算,然后对于每个 a,b,对于每个c>a
and d<b
,做上面提到的 O(n) 查询并将结果保存在 P[a,b,c,d]其中 P 是一个适当大的整数数组。
很可能存在 O(n^3) 或 O(n^2 · log n) 预计算方法,使用可以在 O(log n) 时间内进行查询的分段树、范围树或区间树。