c – 有没有一种有效的方法来确定距离?
作者:互联网
这个问题更多的是关于算法和函数的正确使用,而不是实际的代码.
在我的代码中,我使用map来模拟盒子. map元素由vector< int>组成.作为键并设置< shared_ptr< foo> >作为价值观.
我正在做一个嵌套循环来遍历所有框:
mit1 = boxes.begin(); //mit1 is an appropriate iterator
int edge = 10;//represnd periodic boundary conditions
while (mit1 != boxes.end()){
vector<t> = mit1->first;
mit2 = mit1++;
while (mit2 != boxes.end()){
vector<int> u = (mit2++)->first;
bool good = true;
for (int i = 0; i < 3 && good; i++){
u[i] = (int)fabs(u[i] - t[i]);
good = u[i] == 0 || u[i] == 1 || u[i] == edge;
}
if (!good) continue;
}
}
我关心的是整个嵌套循环以及for循环.
您是否认为使用函数计算所有相邻框更有效?你知道有什么更好的方法来进行for循环测试吗?
解决方法:
与每次碰撞检测相同的建议:使用一些算法或数据结构,允许您按照空间距离预先过滤候选,并允许在O(n)中进行预过滤.想到一个四叉树,或粗粒度的空间地图.
编辑:为了使整个想法更清晰一些,请考虑以下算法:在3D空间中有N个粒子,并且想要找出哪个粒子彼此距离D比距离D更近.您构建一个3D数组,每个bin表示目标空间的立方体积,每个体积必须至少为D的大小.要查找可能比D更接近给定粒子X的所有粒子,您需要确定阵列单元格当前X所在的Ax,并选择Ax和所有周围单元格中的所有粒子.您只需检查此小子集是否存在冲突.
当使用M个阵列单元时,整个距离检查的平均情况计算复杂度现在是O(N * N / M)而不是O(N ^ 2),但是以O(M ^ 2)空间为代价.
如果目标空间不受限制,请使用四叉树(2D)或八叉树(3D).
标签:c,algorithm,scientific-computing 来源: https://codeday.me/bug/20190903/1794467.html