什么是获得for循环中所有组合的最快方法

时间:2013-08-26 09:20:04

标签: c++ algorithm optimization

我希望得到两个int元素的所有组合,例如j和i,两者都不应小于3,这是我尝试过的:

for (int i =  10; i>=3;i--)
{
   for (int j = 23, j >= 3,j--) 
   {
       std::cout << " the i value " << i 
       << "the j value :" << j << std::endl; // since I'm using those combinations  
                                             // for the rest of my code I wrote 
                                             // this to keep things simple    
   }
}

无论如何在没有for循环的情况下执行此操作?

6 个答案:

答案 0 :(得分:4)

这是正确的做法。

您可以使用其他循环,但逻辑始终保持不变。

答案 1 :(得分:1)

如果你有一个整数列表,你可以将它们放在一个向量中并使用`std :: next_permutation'迭代可能的排列

http://en.cppreference.com/w/cpp/algorithm/next_permutation

答案 2 :(得分:1)

无疑,您的方式是最易读且易于维护的方式。

当然还有其他技巧,但没有必要让代码运行得更快。

例如,您可以简单地使用1级循环:

//assuming I am getting i [0..5), j [0..7)

for (int x = 0; x < 5*7 ; ++x) {
   cout << "i " << x/7 << " j " << x%7 << endl;
}

(有点像使用1-demsion数组用于多维数组的方式,但它无论如何都不会使代码更容易或更快。只是为了好玩......:P)

答案 3 :(得分:1)

关于唯一值得尝试的合理变体是预先计算 将值放入静态数组中,并使用单个索引 从那里访问它们。这仅在值的数量时才是实用的 相当小(如你的例子),即便如此,它还远非如此 确定它会说明问题。你得到一个比较(因为 你有一个循环,而不是嵌套循环),但这种比较 只在外循环和内存访问中执行,特别是在a 现代机器,可能很贵。

您应该做的第一件事是分析您的代码。如果你在做 与循环中的值有关的任何重要事项,它所需的时间 循环代码本身甚至不可测量。不要试图优化 不需要它的东西。

答案 4 :(得分:0)

我认为这是正确的做法。可能还有其他一些方法可以做到,但那些可能性较差。如果你确实选择了不同的方法,那么请确保你计时,在没有可测量的加速的情况下降低代码的可读性是不值得的。

答案 5 :(得分:0)

你需要使用某种循环。你可以稍微优化一下:

  1. 使用++i --i代替i++i--。操作更简单,因为i++i--会返回新值,而不是旧值。

  2. 如果你想迭代二维数组并且迭代次序无关紧要,最好先通过j然后通过i进行迭代:

    for(int j = 0; j < MAXJ; ++j){
        for(int i = 0; i < MAXI; ++i){
            do_sth_with(arr[i][j]);
        }
    }
    
  3. 如果您只需要写新行,请不要使用std:endlstd:endl强制在stdout上强制使其慢于"\n"