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

what is the fastest way to get all combinations in a for loop

本文关键字:组合 是什么 方法 循环 for      更新时间:2023-10-16

我想得到两个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循环的情况下这样做吗?

这是正确的方法。

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

关于唯一值得尝试的合理变体是预先计算值,将它们放入一个静态数组中,并使用单个索引从那里访问它们。只有当值的数量相当小(如您的示例中所示),即使如此确信它会把事情说清楚。您获得了一个比较(因为您有一个单独的循环,而不是嵌套的循环),但这种比较仅在外循环中执行,并且内存访问,尤其是在现代机器,可能很昂贵。

您应该做的第一件事是评测您的代码。如果你在做循环中值的任何重要内容,所花费的时间循环代码本身甚至无法测量。不要尝试优化一些不需要它的东西。

您的方法无疑是最可读、最易于维护的方法。

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

例如,您可以简单地使用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;
}

(有点像一维数组用于多维数组的方式,但无论如何,它并没有使代码变得更容易或更快。只是为了好玩…:p)

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

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

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

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

  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:endl。CCD_ 11强制刷新CCD_ 12,因此它比CCD_ 13慢。