存储2d间隔的数据结构

时间:2013-02-12 18:28:15

标签: algorithm data-structures tree multidimensional-array

我正在尝试解决涉及巨型2-D屏幕(40000 * 40000点)的问题。有一些无效点,我被给了一个矩形窗口。适合矩形窗口的无效点左上角的所有点也都无效。

我需要构建一个支持以下操作的数据结构: 1)找出我必须处理的有效点数。 2)查询某个点是否有效。

根据我的研究,我已经考虑了段/间隔树,但我无法完全理解它们,还不确定它们是否能够处理2-D点。

有人能给我一些很好的文章/实现,并详细描述一个能够实现上述操作的数据结构吗?

谢谢, 罗希特夏尔

2 个答案:

答案 0 :(得分:2)

这是今年facebook hackercup的“死像素”问题。请参阅official solution并附上代码和说明。

答案 1 :(得分:1)

  

矩形窗口内无效点左上角的所有点也都无效。

因此,如果x1,y1无效,并且x2&lt; = x1和y2&lt; = y1,那么x2,y2也是无效的。在这种情况下,我会存储一个有序的定义点列表,即每个无效矩形的右下角。您的列表可以按x[i+1] > x[i]y[i+1] < y[i]进行排序。如果省略所有已被其他点暗示无效的点,则此方法有效。在此有序列表中,您可以执行操作。

  

1)找出我必须处理的有效点数。

您可以遍历列表,并且对于每个点使用矩形条带,使得没有两个这样的条带重叠。

  

2)查询某个点是否有效。

给定一个点xp,yp,您可以使用二分搜索来定位使该值无效的定义点。如果定义点的x坐标太小,则必须查看较高的位置,而如果y坐标太小,则搜索较低的位置。如果你发现两者都太小,你知道像素是有效的。否则你会找到两个坐标都足够大的地方,这意味着你的给定像素也是无效的。