【问题标题】:Computationally Efficient Interval/Density Searching in CC中计算效率高的区间/密度搜索
【发布时间】:2017-10-12 06:57:36
【问题描述】:

假设您有一个像这样的二维图(作为点列表):

现在假设您将绘图分成相等的正方形区域,如下所示:

问题 1:如果您想找到每个块的密度(每个区域的点数),可以使用 C 中哪些计算效率高的技术(RAM 使用和处理方面的效率)时间)?

(而不是逐个比较每个点,看是否在每个方格的区间内)

问题2:如果增加了一个新的点,有什么有效的方法可以找到该点所在的块,并计算块的新密度。

(**注意:我不是要求最有效的方法,因为那是基于意见的)

【问题讨论】:

  • 假设您明确了“最有效的方法”的含义,为什么要基于意见?
  • 你说的是分析图像还是分析底层点列表?
  • 将其分析为点列表
  • 您将需要查看每个点以查看其所在位置,因此不可能比查看每个点以查看其所在位置更好。最好的想法可能只是创建一个二维区域数组并计算每个区域的点数。这也允许在添加(和删除)点时轻松更新密度。
  • 然后我想我会设置一个二维数组,其元素对应于网格正方形,遍历点列表,并通过将每个点除以 xy 坐标将每个点分配给一个正方形通过网格间距。

标签: c algorithm performance search plot


【解决方案1】:

在 Java 中,假设坐标为非负数,并且每个轴上的 bin 数量最多为 2^31:

Map<Pair<Integer, Integer>, List<Point>> binMap = new HashMap<>();
for (Point point : points) {
  Pair binXy = new Pair((int) (point.x / BIN_SIZE), (int) (point.y / BIN_SIZE));
  if (binMap.containsKey(binXy)) {
    binMap.get(binXy).add(point);
  } else {
    List<Point> pointList = new ArrayList<>();
    pointList.add(point);
    binMap.put(binXy, pointList);
  }
}

现在您可以枚举每个 bin 中的点:

for (Entry<Pair<Integer, Integer>, List<Point>> entry : binMap.entrySet()) {
  System.out.println("Bin: " + entry.getKey() + " Points: " + entry.getValue());
}

【讨论】:

    猜你喜欢
    • 2013-11-26
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多