有没有一种有效的方法来计算单元中的点?

时间:2019-02-16 23:40:29

标签: graph counting

我有一些点集的图形,例如:-

dots

每张图上最多有100万个点。您会看到这些点散布在一个单元格的网格上,每个单元格大小为200 x 100单位。因此显示了35个单元格。

是否有一种有效的方法来计算每个单元格中有多少个点?蛮力方法似乎是将数据分析35次,合并的总负载小于或大于语句。

1 个答案:

答案 0 :(得分:2)

在可以构建数据集时可以执行其中一些步骤的意义上,可以优化以下某些步骤。但是,我假设您只获得了一系列要点,并且您必须找到它们适合的单元格。如果您可以将自己的代码注入到构建图形的步骤中,则可以执行我在构建图形时在下面编写的内容,而不是在事实之后进行。

在仅获得数据的情况下,您会被强行卡住,无法知道否则,因为您必须至少访问每个点一次才能弄清楚它所在的单元格。因此,我们陷入了困境与O(n)。如果您还有其他知识可以利用,那将由您决定使用-但由于OP中并未提及,因此我认为我们仍然被蛮力所困。

高级策略如下:

// 1) Set rectangle bounds to have minX/Y at +inf, and maxX/Y to be -inf
// or initialize it with the first point

// 2) For each point:
//       Set the set the min with min(point.x, bounds.min.x)
//       Same for the max as well

// 3) Now you have your bounds, you divide it by how many cells fit onto each
// axis while taking into account that you might need to round up with division
// truncating the results, unless you cast to float and ceil()
int cols = ceil(float(bounds.max.x - bounds.min.x) / CELL_WIDTH);
int rows = ceil(float(bounds.max.y - bounds.min.y) / CELL_HEIGHT);

// 4) You have the # of cells for the width and height, so make a 2D array of
// some sort that is w * h cells (each cell contains 32-bit int at least) and
// initialize to zero if this is C or C++

// 5) Figure out the cell number by subtracting the bottom left corner of our
// bounds (which should be the min point on the x/y axis that we found from (1))
for (Point p in points):
    int col = (p.x - minX) / cellWidth;
    int row = (p.y - minY) / cellHeight;
    data[row][col]++;

优化

我们可以通过某些方法来加快速度:

  • 如果单元格的宽度/高度为2的幂,则可以进行一些移位。如果它是this might possibly speed things up if you aren't using C or C++的10的倍数,但我没有对此进行概要分析,因此Java的热点之类的东西无论如何都可以为您完成(并且不了解Python)。再说一百万点应该很快。

  • 我们不需要一开始就遍及整个范围,只要发现更大的值,我们就可以继续调整表的大小并添加新的行和列。这样,我们将只对所有点进行一次迭代,而不是两点。

  • 如果您不关心多余的空间使用情况,而您的数字只是正数,则可以通过假设一切都已经相对于原点而不是根本不减去来避免“转换为原点”减法步骤。您可以通过修改代码的步骤(1)以使min0而不是inf(或者如果选择的话,是第一点)开始解决。但是,如果您的点确实在轴上太远,而您最终创建了大量的空槽,则可能会很糟糕。您会知道自己的数据以及这是否可行。

也许还有更多的事情可以做,但这将使您正确地提高效率。您还可以将其恢复到哪个单元格。

EDIT :假设与网格尺寸相比,您不会有一些非常小的单元格宽度(例如您的宽度为100个单位,但是图形可以跨越200万个单位)。如果是这样,那么您需要研究可能稀疏的矩阵。