2012-04-26 3 views
0

Предположим, что у меня есть вектор из n значений, я хочу получить различные комбинации его значений, например: если у меня есть vect = [a, b, c] различные комбинации, которые я [a], [b], [c]различные комбинации значений вектора

Обратите внимание, что, например, [a, b, c], [a, b], [a, c], [b, c] , b] совпадает с [b, a], поэтому мне не нужно сохранять их обоих.

+4

Вы ищете «набор мощности» вашего вектора значений; чтобы быть абсолютно точным, вы ищете питание без элемента []. Это (пустое множество) соответствует числу 0 в ответе @ Хенрика. –

ответ

6

От 0 до 2^vector.size() - 1. Если бит i вашей переменной цикла равен 1, включите vector[i] в свою комбинацию.

vector<char> v; 
v.push_back('a'); 
v.push_back('b'); 
v.push_back('c'); 
for (int counter = 0; counter < (1 << v.size()); ++counter) 
{ 
    vector<char> combination; 
    for (int i = 0; i < v.size(); ++i) 
    { 
     if (counter & (1 << i)) 
      combination.push_back(v[i]); 
    } 

    // do something with combination 
} 

Edit: если вы хотите, чтобы исключить пустое множество, начать отсчет с 1

+0

Это работает, но я не понимаю, почему и как! – shn

+0

@ user995434 - Установить a = 1, b = 2, c = 4. Это даст вам взаимно однозначное соответствие между номерами 0..7 и комбинациями a, b и c. Теперь мой код пробегает числа 0..7 и строит соответствующие комбинации, изучая биты 0..2 (значения 1, 2, 4). – Henrik

0

дать вам псевдокод, пожалуйста, преобразовать его в реальный код.

vector resultVec; 
while (!inputVec.empty) 
{ 
    char c = inputVec.pop_back(); 

    foreach(one in resultVec) 
    { 
     combined = combine c and one; 
     resultVec.push_back(combined); 
    } 

    resultVec.push_back(c); 
} 
0

Представьте, что у вас есть функция, которая уже может это сделать для вас. Назовем это combinations.

Если вы собираетесь реализовать свою собственную версию этого my_combinations, вы можете сделать это, посмотрев на первый элемент вашего вектора, вызвав combinations на остальную часть вектора, а затем объединив ваш элемент с каждым из комбинации.

После того, как вы осуществили это, вы можете делегировать свою собственную версию combinations вместо прежнего.

Смежные вопросы