根据一些谷歌搜索,这是二维点包围搜索问题的一个例子,或者称为“刺穿问题”。请参见:
http://www.cs.nthu.edu.tw/~wkhon/ds/ds10/tutorial/tutorial6.pdf
从这里开始(从第21/52页):
http://www.cs.brown.edu/courses/cs252/misc/slides/orthsearch.pdf
涉及的关键数据结构是线段树:
http://en.wikipedia.org/wiki/Segment_tree
对于二维情况,看起来可以构建一个包含线段树的线段树,并获得O(log^2(n))的查询复杂度。(我认为你当前的解决方案是O(n),因为平均而言,你只会用二分查找排除一半的区域。)
然而,你说“电子表格”,这意味着你可能有一个相对较小的区域要处理。更重要的是,你有整数坐标。而且你说“最快”,这意味着你可能愿意为更快的查询交换空间和设置时间。
你没有说哪个电子表格,但下面的代码是一个极其低效但非常简单的Excel/VBA实现的二维查找表,一旦设置完成,具有O(1)的查询复杂度:
Public Sub brutishButShort()
Dim posns(1 To 65536, 1 To 256) As Collection
Dim regions As Collection
Set regions = New Collection
Call regions.Add([q42:z99])
Call regions.Add([a1:s100])
Call regions.Add([r45])
Dim rng As Range
Dim cell As Range
Dim r As Long
Dim c As Long
For Each rng In regions
For Each cell In rng
r = cell.Row
c = cell.Column
If posns(r, c) Is Nothing Then
Set posns(r, c) = New Collection
End If
Call posns(r, c).Add(rng)
Next cell
Next rng
Dim query As Range
Set query = [r45]
If Not posns(query.Row, query.Column) Is Nothing Then
Dim result As Range
For Each result In posns(query.Row, query.Column)
Debug.Print result.address
Next result
End If
End Sub
如果您需要处理更大的网格或者区域相对于网格来说很大,那么使用两个一维查找表可以节省大量空间和设置时间。但是,这样您就需要进行两次查找,并取两个结果集的交集。