【发布时间】:2018-10-08 03:48:51
【问题描述】:
我正在实现一个相当复杂的代码,并且在其中一个关键部分中,我需要基本上考虑遵循特定规则的所有可能的数字字符串。解释我所做的事情的幼稚实现将是这样一个嵌套循环实现:
std::array<int,3> max = { 3, 4, 6};
for(int i = 0; i <= max.at(0); ++i){
for(int j = 0; j <= max.at(1); ++j){
for(int k = 0; k <= max.at(2); ++k){
DoSomething(i, j, k);
}
}
}
显然我实际上需要更多的嵌套,并且“最大”规则更复杂,但我认为这个想法很清楚。 我使用递归函数方法实现了这个想法:
std::array<int,3> max = { 3, 4, 6};
std::array<int,3> index = {0, 0, 0};
int total_depth = 3;
recursive_nested_for(0, index, max, total_depth);
在哪里
void recursive_nested_for(int depth, std::array<int,3>& index,
std::array<int,3>& max, int total_depth)
{
if(depth != total_depth){
for(int i = 0; i <= max.at(depth); ++i){
index.at(depth) = i;
recursive_nested_for(depth+1, index, max, total_depth);
}
}
else
DoSomething(index);
}
为了尽可能的节省,我在实际代码中声明了所有我使用的全局变量。
由于这部分代码需要很长时间,是否可以做任何事情来加快它的速度? 如果有必要,我也愿意写 24 嵌套,至少可以避免开销! 我认为也许像表达式模板这样在编译时实际生成这些嵌套的方法可能更优雅。但有可能吗? 任何建议将不胜感激。 谢谢大家。
【问题讨论】:
-
三个嵌套循环将导致 O(N^3) 的时间复杂度。你确定你的算法已经尽可能地优化了吗?
标签: c++ templates recursion optimization expression