![]() |
1
2
实际上,我认为我有更好的方法,因为网格点的数量远远大于采样点的数量。设grid=n,samples=m,则最近邻搜索算法类似于o(n lg m),因为您需要查找所有n个网格点,而每次查找都是(最佳情况)o(lg m)。 相反,循环采样点。为每个网格点存储迄今为止找到的最近采样点。对于每个采样点,只需检查距离d内的所有网格点,以查看当前采样是否比以前处理的任何采样更近。 运行时间为O(n+(d/d)^3 m),当d/d很小时,最好是O(n+(d/d)^3 m)。 即使在D/D更大的时候,如果你能制定出一个截止策略的话,你还是可以的。例如,如果我们检查的是距样本5的网格点,并且该网格点已标记为距前一个样本1的距离,则不需要检查“超出”该网格点的所有网格点,因为前一个样本保证比我们正在处理的当前样本更近。你所要做的就是(我认为这并不容易,但应该是可行的)定义“超越”的含义,并找出如何在网格中迭代,以避免为“超越”网格点的区域做任何工作。 |
![]() |
3
2
你可以建造一个 nearest neighbor search structure (维基百科)在你的采样点,然后要求它为你的每个网格点。维基百科页面上提到了很多算法。也许八叉树、kd树或r树是合适的。 |
![]() |
4
1
一种可能适合或不适合您的应用程序的方法是,重新定义您的思想,并将每个网格“点”定义为将空间划分为单元的立方体的中心。然后,您有一个这样的单元的三维数组,并将这些点存储在单元中——选择最合适的数据结构。用你自己的话, 把分数放进桶里 首先。 我想您可能正在运行某种大规模的模拟,我建议的方法在此类应用程序中并不常见。在每一个时间步骤(如果我猜对了的话)中,您必须重新计算从单元格到最近点的距离,并将点从单元格移动到单元格。这很容易平行。 编辑:搜索 粒子 和 粒子粒子粒子网格 可能会为你提出一些想法。 |
![]() |
5
1
关于基思·兰德尔方法的注释,
围绕起点展开壳或立方体:
“从S开始停止膨胀”在1d中很好(bonk-left,bonk-right);
但是二维/三维壳是不规则的。
这里的“近似值”可能是一个完整的dxdxd立方体, 或者你可以像(这里是2d)一样去掉角落。
另外, 根据埃里克的数据,平均有500^3/1米~2^7~5^3个空瓶。 每个采样点。 所以我一开始以为5x5x5个立方体在1米的采样点附近 将覆盖整个网格的大部分。 不是这样,~1/e的网格点是空的——泊松分布。 |
![]() |
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 8 月前 |
![]() |
Alisa Petrova · 在有向图中更改一对顶点以创建循环 8 月前 |
![]() |
b39b332d · 使用C++标准库实现高效间隔存储 1 年前 |
![]() |
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 1 年前 |
![]() |
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 1 年前 |