struct Rect
{
double left, right, top, bottom;
};
std::vector<Rect> vec;
现在我们有N(N > 1000)个矩形,有一个高效的算法来确定它们中是否有任意两个重叠吗?
更新: 所有这些矩形都平行于坐标系。
struct Rect
{
double left, right, top, bottom;
};
std::vector<Rect> vec;
现在我们有N(N > 1000)个矩形,有一个高效的算法来确定它们中是否有任意两个重叠吗?
更新: 所有这些矩形都平行于坐标系。
std::vector<Rect*> grid[D][D];
vector
中平均5-50个矩形(取决于它们在大小上的差异),然后可以对它们进行暴力搜索以查找重叠。nullptr
,从而绕过每个矩形的比较vector
不是empty()
,则存在重叠值得注意的是,如果您有一组矩形,并且要重复添加新矩形以测试每个矩形与任何先前矩形的重叠情况,则值得投入的排序、合并/简化重叠矩形、索引等工作量大不相同。想要确切知道哪些矩形重叠是另一个复杂性(暴力步骤可以满足这个问题)。我理解这个问题的意思是,有一组未排序的矩形需要进行一次真/假的是否存在重叠的答案。
一个想法是维护一个水平使用范围的集合和一个垂直使用范围的集合。添加一个新矩形,将其与水平方向上重叠的矩形称为H,垂直方向上重叠的矩形称为V。如果集合H和V的交集非空,则这些矩形是它在二维中重叠的矩形。
在第一个二维重叠之前,我认为这将以O(n log n)的速度执行,前提是范围得到适当的表示,某种排序结构。
我感到有必要提到RH Güting和W Schilling的论文《矩形交问题的实用分治算法》,发表于1987年的《信息科学》杂志。Pham Trung在他的回答中采用的策略(平面扫描)更可能对于集合问题具有更快的实现,而分治则与适用于“在线查询”的数据结构密切相关,例如,“对于给定的轴对齐矩形集,与此相交的子集是什么?”