【问题标题】:Is there an efficient way to count dots in cells?有没有一种有效的方法来计算单元格中的点?
【发布时间】:2019-02-17 09:14:11
【问题描述】:

我有一组点的图表,例如:-

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

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

【问题讨论】:

  • 您使用什么语言?或者您是否要求一种高级方法来解决此问题?
  • @Water High 级别就可以了,谢谢。我可以处理 C++、Java 和 Python,所以应该涵盖它。

标签: graph counting


【解决方案1】:

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

在仅获得数据的情况下,您会遇到蛮力,否则您无法知道其他情况,因为您必须至少访问每个点一次才能确定它在哪个单元格中。因此我们被卡住了与 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 的幂,则可以进行一些位移。如果它是 10 的倍数,this might possibly speed things up if you aren't using C or C++,但我没有对此进行分析,所以也许 Java 中的热点之类的东西无论如何都会为你做到这一点(并且不知道 Python)。再一次,100 万点应该很快。

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

  • 如果您不关心额外空间的使用并且您的数字只是正数,您可以通过假设所有内容都已经相对于原点而不是减法来避免“转换到原点”减法步骤.您可以通过修改代码的步骤 (1) 以使 min0 而不是 inf 开始(或者如果您选择第一个点)来解决这个问题。但是,如果您的点在轴上真的很远并且您最终会创建大量空槽,这可能会很糟糕。你会知道你的数据以及这是否可能。

可能还有更多可以做的事情,但这会让您走上正确的轨道,提高效率。您也可以返回到它所在的单元格。

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

【讨论】:

    猜你喜欢
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多