需要有关算法的建议
Need advice on Algorithm
我有一个代码,我在其中使用两个不同的函数来2D
和3D
。在坐标列表的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
的替代方法 - 调度函数中的else
或switch
,是使用虚拟调度(然后每个虚拟实现调用正确的模板实例化来完成实际工作)。
在大多数情况下,关键是通过所有项目的列表停止访问您的项目。 列表不维护顺序,这限制了您进行大量检查位置以查看项目是否需要处理。
例如,您可以使用项目树,然后在 X 轴上将所需范围内的第一项归零,在该 X 轴上将所需范围内的最后一项归零,并处理"介于两者之间"的所有项目。 使用这样的解决方案,您可以维护两个有序树,一个用于 X 轴,一个用于 Y 轴。
或者,您可以基于地理哈希技术构建数据结构。
无论哪种情况,您都可以按坐标快速筛选出项目,然后将它们传递给不执行任何基于坐标的筛选的其他例程(相信从外部筛选是正确的)。
除了其他建议(假设您将这些建议用于某种 2D 与 3D 数学),您还可以将所有内容视为 3D 向量(2D 向量只有 0 表示 Z 坐标)。 然后,您只是实现了单个函数,而不管结构中有多少坐标。
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 为什么我的排序算法会更改数组值
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- 到连接组件算法的问题(递归)
- STL算法函数在多个一维容器上的使用
- 读取最后一行代码算法 - c++ 时出现问题
- 括号更改 O(n) 算法
- std::unordered_map 搜索算法是如何实现的?
- 如何实现高效的算法来计算大型数据集的多个不同值?
- 如何在 Mac 上使用 c++17 并行标准库算法?