我想搜索2D网格中的坐标,其中每个元素存储水平和垂直坐标限制并返回相应的坐标。
例如:让要搜索的坐标为(15,25),网格为(其中A,B,C,D,E和F为返回值):
(0,0) - (0,10) - (0,20) - (0,30)
| [A] | [B] | [C] |
(10,0) - (10,10) - (10,20) - (10,30)
| [D] | [E] | [F] |
(20,0) - (20,10) - (20,20) - (20,30)
| [G] | [H] | [I] |
(30,0) - (30,10) - (30,20) - (30,30)
因此,当我们的坐标(15,25)在10-20垂直和20-30水平之间时,搜索功能应该返回[F]。
那么在这种情况下,哪种数据结构和搜索算法在复杂性方面最好?
注意:水平和垂直轴的坐标限制已按递增顺序排序。
答案 0 :(得分:2)
什么数据结构?
阵列。
一个数组,例如,元素为2D点。这将是O(n), where
n`是轴的大小。
搜索算法? [..]数据已经按递增顺序排序。
两次,每个轴一个,将渐近符号保持在O(logn)
。
当然,当你遇到20时(如果查询是15),你必须停止搜索,因为它可能是数组中不存在查询。所以你想停止搜索当前元素是否大于或等于查询。
PS:如果网格不是正方形,则使用kd树并搜索最近邻。
答案 1 :(得分:2)
暂时忽略您在网格上实际使用的坐标,并沿每个轴标记它们0,1,2,3,...
。现在你有一个很好的普通阵列。
接下来,找出将实际坐标转换为上一步中定义的伪坐标的功能。在你的例子中,这个函数只是整数(或截断)除以10.你需要小心一点,当坐标不是那么好间隔时,要确保函数找到伪坐标(如你画了它)细胞的左上角。
现在你必须进行两次函数调用和一次查找数组。这种复杂性取决于您必须编写以从坐标转换为伪坐标的函数的复杂性,但我很难看到对于O(k)
的小整数值,它将如何远远超过k
{1}}。查找数组中的元素是O(1)
。