那么这是一个有趣的问题。假设我在一个充满x,y坐标(正象限)的sql db上有一个表,每个表都有一个颜色值,即模式看起来像是<x , y, color>
。任务是检测相同颜色的最大可能的正方形。我一直试图解决这个问题几个小时,似乎不能让它陷入凹痕。使用像素检测正方形
我不是在寻找解决方案,而是提示。
请注意,这一切都必须发生在SQL中,主要使用各种连接,分组和聚合操作。一些示例代码会很好。
那么这是一个有趣的问题。假设我在一个充满x,y坐标(正象限)的sql db上有一个表,每个表都有一个颜色值,即模式看起来像是<x , y, color>
。任务是检测相同颜色的最大可能的正方形。我一直试图解决这个问题几个小时,似乎不能让它陷入凹痕。使用像素检测正方形
我不是在寻找解决方案,而是提示。
请注意,这一切都必须发生在SQL中,主要使用各种连接,分组和聚合操作。一些示例代码会很好。
如果只要求角落相同的颜色,你可以做
top left corner
join top right corner on equal x and color and greater y
join bottom left corner on equal y and color and greater x
join bottom right on equal x, y and color
order by (x1-x2)*(y1-x2) descending
limit 1
当然,限制1不会对性能有很大影响,因为它将不得不生成所有的正方形。
您可以通过添加(color,x,y)和(color,y,x)索引(大大提高)速度。 执行计划将最有可能结束:
(1) full scan for all top left corners
(2) dependent index scan for all top right corners
(3) dependent index scan for all bottom left corners
(4) dependent index scan for the bottom right corner expecting at most one match
(5) (partial) table sort of the entire set of squares (cannot use indexes)
非常感谢,非常感谢!你为我节省了很多时间。 – 1337holiday
假设你的问题的空间很小,比方说10×10(X 1和10之间为界),然后是天真和残酷的方法:
Numbers
表)给你所有可能的平方(100分)的左下角left <= x <= right
。这会生成一个庞大的集合HAVING COUNT(DISTINCT color) = 1
。COUNT
发现是不是a.color = b.color AND ...在速度方面比COUNT DISTINCT更好? –
是的,您可以将该优化转换为第4步,仅收集类似的颜色。我确实说过这是一种天真的做法。我毫不怀疑它会工作并显示逻辑,但我也确信它不是最快的方法。如果你真的想要的话,你甚至可以在第二步就引入色彩匹配。 – RichardTheKiwi
正方形周长或正方形? – RichardTheKiwi
填充正方形:) – 1337holiday