假设我有一组矩形(具有不同或相同的尺寸)。
这可以通过线性搜索/更新在O(n)时间内轻松解决,但是可以获得更好的结果吗? O(log n)是最佳的我假设。 插入和移除也必须比O(n)更快,因为在我的情况下这是有用的。
可以通过找不到最佳矩形来制作任何快捷方式,而是放宽第二个限制: "它也应该是可以包含给定矩形的最小矩形之一" -
我正在考虑使用Z-order curve(宽度/高度)并将其用作一维索引并将其与树结合。 那会有用吗?还是会有太多浪费?
另一种方法是使用一个轴使用树,然后线性地测试另一个。
任何做类似事情的人都可以分享他们的经历吗?
答案 0 :(得分:2)
这是一个尚未完全阐述的想法:
也许你可以使用一个四重分支的树,其中每个代表一个矩形的2元组值(高度和宽度)。
一个节点(w,h)有4个子节点:
(<w, <h)
- 包含宽度较小且高度较小的rects (>=w, <h)
- 包含宽度更大,高度更小的rects (<w, >=h)
- 包含宽度更小,高度更高的rects (>=w, >=h)
- 包含宽度更大,高度更高的rects 当您在(w, h)
rect节点下降以查找(w2, h2)
rect的容器时,现在有4种不同的情况:
w2<w and h2<h
- 三个选项:(>=w, <h)
,(<w, >=h)
,(>=w, >=h)
w2>=w and h2<h
- 两个选项:(>=w, <h)
,(>=w, >=h)
w2<w and h2>=h
- 两个选项:(<w, >=h)
,(>=w, >=h)
w2>=w and h2>=h
- 一个选项:(>=w, >=h)
你必须下降到所有可能的分支,这仍然比O(n)更好。
插入是O(log n)。 还不确定删除和平衡。但我几乎肯定也有解决方案。