我正在尝试解决涉及巨型2-D屏幕(40000 * 40000点)的问题。有一些无效点,我被给了一个矩形窗口。适合矩形窗口的无效点左上角的所有点也都无效。
我需要构建一个支持以下操作的数据结构: 1)找出我必须处理的有效点数。 2)查询某个点是否有效。
根据我的研究,我已经考虑了段/间隔树,但我无法完全理解它们,还不确定它们是否能够处理2-D点。
有人能给我一些很好的文章/实现,并详细描述一个能够实现上述操作的数据结构吗?
谢谢, 罗希特夏尔
答案 0 :(得分:2)
这是今年facebook hackercup的“死像素”问题。请参阅official solution并附上代码和说明。
答案 1 :(得分:1)
矩形窗口内无效点左上角的所有点也都无效。
因此,如果x1,y1无效,并且x2< = x1和y2< = y1,那么x2,y2也是无效的。在这种情况下,我会存储一个有序的定义点列表,即每个无效矩形的右下角。您的列表可以按x[i+1] > x[i]
和y[i+1] < y[i]
进行排序。如果省略所有已被其他点暗示无效的点,则此方法有效。在此有序列表中,您可以执行操作。
1)找出我必须处理的有效点数。
您可以遍历列表,并且对于每个点使用矩形条带,使得没有两个这样的条带重叠。
2)查询某个点是否有效。
给定一个点xp,yp
,您可以使用二分搜索来定位使该值无效的定义点。如果定义点的x
坐标太小,则必须查看较高的位置,而如果y
坐标太小,则搜索较低的位置。如果你发现两者都太小,你知道像素是有效的。否则你会找到两个坐标都足够大的地方,这意味着你的给定像素也是无效的。