从向量生成元素的子集(NO NESTED LOOP)

时间:2016-01-14 15:18:07

标签: c++ time-complexity permutation

v = {1,2,3,4,5,6}。我想使用v生成以下几组:

  • 1 2 3 4 5 6
  • 2 1 3 4 5 6
  • 3 1 2 4 5 6
  • 4 1 2 3 5 6
  • 5 1 2 3 4 6
  • 6 1 2 3 4 5

为了实现这个目标,我使用以下代码,使用嵌套的for循环:

#include<vector>
#include<iostream>

using namespace std;

int main()
{
  vector<int> v{1,2,3,4,5,6};
  for(unsigned int i = 0; i < v.size(); i++)
  {
    cout << v[i] <<",";
    for(unsigned int j = 0; j < v.size(); j++)
    { 
      if(i != j)
         cout << v[j] <<",";
    }
    cout << endl;
   }

 return 0;
}

是否有更好的方法可用于生成先前的集合。至少不是O(n^2)

3 个答案:

答案 0 :(得分:4)

对于大小为public static class Enums { public enum A { first, second } public enum B { first, second, third } } 的输入列表,您的输出将始终包含n个数字。你不能比O(n ^ 2)做得更好。

然而,在我看来,你只是交换第一个和第一个元素,然后是第一个和第二个元素,然后是第一个和第三个元素等等。 您可以隐藏使用算法打印特定子集的内部循环,例如

n*n

答案 1 :(得分:1)

了解算法的下限;让我们看一下输入和输出之间的转换。

您从 N 元素列表开始,最后得到 [N x(N - 1)] 元素的列表。

忽略生成输出的逻辑,输出自身的行为是O(N * (N - 1)) =&gt;为O(n 2 )。

换句话说,你在N的初始输入上输出NxN项目。根据定义,这将是O(n 2 )。

答案 2 :(得分:-1)

此处内循环仅用于打印结果:

public void method1() throws MyException {
  try {
    methodIO();
  } catch (IOException e) {
    // Handle appropriately.
  }
}