我有一组包含在矩形内的点。我想根据点密度将矩形分成子矩形(给出一些子矩形或所需的密度,以最简单的方式)。
分区不必精确(几乎任何比常规网格更好的近似),但算法必须处理大量的点 - 大约。 2亿。然而,所需数量的子矩形明显更低(约1000)。
有没有人知道任何可以帮助我完成这项特殊任务的算法?
答案 0 :(得分:2)
答案 1 :(得分:2)
只是为了解问题。 以下是粗略的,表现不佳,但我想知道结果是否是您想要的>
假设>矩形的数量是偶数 假设>点分布明显为2D(一行中没有大的积累)
步骤>
在任一轴上平移n / 2次,从每个先前确定的矩形的一端到另一端循环,计算“通过”点并在每次迭代时存储通过点的数量。计算完毕后,按每个循环中计算的点选择矩形。
这是你想要达到的目标吗?
答案 2 :(得分:2)
我认为你是在标准的Kd树或二进制空间分区树之后。 (您可以在维基百科上查找。)
由于您有很多分数,您可能希望仅对前几个分区进行大致分区。在这种情况下,您应该随机抽取200M点 - 可能是200k点 - 然后将完整数据集分割到子样本的中点(沿着较长的轴)。如果您实际上随机选择了点,那么您将错过需要细分的大量点的概率将近似为零。
现在你有两个问题,每个问题大约100M点。沿长轴划分每个。重复操作,直到停止获取子样本并沿整个数据集分割。经过十次广度优先迭代后,您将完成。
如果您有其他问题 - 必须沿X和Y轴提供刻度线并尽可能地填充网格,而不是对Kd树进行不规则分解 - 采取子样本的点数,并找到沿每个轴的0 / 32,1 / 32,...,32/32百分位数。在那里绘制网格线,然后用你的点填充生成的1024元素网格。
答案 3 :(得分:1)
我想我会从以下内容开始,这与@belisarius已经提出的内容很接近。如果您有任何其他要求,例如更喜欢“近似正方形”矩形到“长而薄”的矩形,您需要修改这种天真的方法。为简单起见,我假设这些点大致是随机分布的。
我希望能够很好地概述提案。它有局限性:它会产生一些等于2的幂的矩形,所以如果它不够好就调整它。我用递归的方式表达了它,但它是并行化的理想选择。每个拆分创建两个任务,每个任务分割一个矩形并创建另外两个任务。
如果您不喜欢这种方法,也许您可以从一个常规网格开始,其中包含您想要的多个矩形(可能是10-100)。计算每个这些小矩形中的点数。然后开始将小矩形粘在一起,直到不太小的矩形包含(大约)正确数量的点。或者,如果它足够满足您的要求,您可以将其用作离散化方法并将其与我的第一种方法结合使用,但只将切割线放在微小矩形的边界上。这可能要快得多,因为你只需要计算每个小矩形中的点数。
我还没有真正想过其中任何一个的运行时间;我偏爱前一种方法'因为我做了大量的并行编程,并且有大量的处理器。
答案 4 :(得分:0)
答案 5 :(得分:0)
K-means clustering或Voronoi diagram是否适合您要解决的问题?
答案 6 :(得分:0)
这看起来像Cluster analysis。
答案 7 :(得分:0)
QuadTree会有效吗?
四叉树是一种树数据结构,其中每个内部节点恰好有四个子节点。四叉树最常用于通过递归地将其细分为四个象限或区域来划分二维空间。区域可以是正方形或矩形,或者可以具有任意形状。这种数据结构在1974年由Raphael Finkel和J.L.Bentley命名为四叉树。类似的分区也称为Q树。所有形式的四叉树都有一些共同特征: