需要有关算法的建议

Need advice on Algorithm

本文关键字:算法      更新时间:2023-10-16

我有一个代码,我在其中使用两个不同的函数来2D3D。在坐标列表的for循环中,我想通过检查dimensions来分别调用函数。但是,使用 if 检查每个坐标的维度效率非常低,因为只需要一次维度检查(在代码开头)。

供您参考,2D / 3D functions位于单独的文件中,然后坐标列表位于单独的文件中。

任何人都可以建议一种有效的方法来调用适当的函数,只需在代码开头使用一次检查即可dimensions

伪代码:文件1.cpp

readcoordinates();  //store the coordinates info;
for(number of coordinates)
   checkfunction(coordinates[i]); //function in file2.cpp

文件2.cpp

checkfunction(coordinates[i]){
   //requires dimension info here for complicated checking,
   // which cannot be explained here.
   // Since entire list of coordinates is same dimension, multiple if checks can be avoided here
}

将维度数设置为模板参数。 这使您可以避免代码重复,但编译器将摆脱所有维度检查,为2-D创建一个代码版本,为3-D创建一个单独的代码版本,两者都得到完全优化。

您无法在运行时提供模板参数,因此您需要一个调度函数,该函数动态检查维度一次,并调用二维或三维模板实例。

if的替代方法 - 调度函数中的elseswitch,是使用虚拟调度(然后每个虚拟实现调用正确的模板实例化来完成实际工作)。

在大多数情况下,关键是通过所有项目的列表停止访问您的项目。 列表不维护顺序,这限制了您进行大量检查位置以查看项目是否需要处理。

例如,您可以使用项目树,然后在 X 轴上将所需范围内的第一项归零,在该 X 轴上将所需范围内的最后一项归零,并处理"介于两者之间"的所有项目。 使用这样的解决方案,您可以维护两个有序树,一个用于 X 轴,一个用于 Y 轴。

或者,您可以基于地理哈希技术构建数据结构。

无论哪种情况,您都可以按坐标快速筛选出项目,然后将它们传递给不执行任何基于坐标的筛选的其他例程(相信从外部筛选是正确的)。

除了其他建议(假设您将这些建议用于某种 2D 与 3D 数学),您还可以将所有内容视为 3D 向量(2D 向量只有 0 表示 Z 坐标)。 然后,您只是实现了单个函数,而不管结构中有多少坐标。