Мне нужно сгенерировать всю перестановку строки с выбором некоторых элементов. Например, если моя строка - это «abc», то вывод будет {a, b, c, ab, ba, ac, ca, bc, cb, abc, acb, bac, bca, cab, cba}.Алгоритм для генерации всех перестановок путем выбора некоторых или всех charaters
Я думал о базовом алгоритме, в котором я генерирую всю возможную комбинацию «abc», которые являются {a, b, c, ab, ac, bc, abc}, а затем переставляют их все.
Итак, есть эффективный алгоритм перестановки, с помощью которого я могу сгенерировать все возможные перестановки с разным размером.
Код я написал для этого:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <map>
using namespace std;
int permuteCount = 1;
int compare (const void * a, const void * b)
{
return (*(char*)a - *(char*)b);
}
void permute(char *str, int start, int end)
{
// cout<<"before sort : "<<str;
// cout<<"after sort : "<<str;
do
{
cout<<permuteCount<<")"<<str<<endl;
permuteCount++;
}while(next_permutation(str+start,str+end));
}
void generateAllCombinations(char* str)
{
int n, k, i, j, c;
n = strlen(str);
map<string,int> combinationMap;
for(k =1; k<=n; k++)
{
char tempStr[20];
int index =0;
for (i=0; i<(1<<n); i++) {
index =0;
for (j=0,c=0; j<32; j++) if (i & (1<<j)) c++;
if (c == k) {
for (j=0;j<32; j++)
if (i & (1<<j))
tempStr[ index++] = str[j];
tempStr[index] = '\0';
qsort (tempStr, index, sizeof(char), compare);
if(combinationMap.find(tempStr) == combinationMap.end())
{
// cout<<"comb : "<<tempStr<<endl;
//cout<<"unique comb : \n";
combinationMap[tempStr] = 1;
permute(tempStr,0,k);
} /*
else
{
cout<<"duplicated comb : "<<tempStr<<endl;
}*/
}
}
}
}
int main() {
char str[20];
cin>>str;
generateAllCombinations(str);
cin>>str;
}
мне нужно использовать хэш для избежания такой же комбинации, поэтому, пожалуйста, дайте мне знать, как я могу сделать этот алгоритм лучше.
Спасибо, GG
Я не читал ваш код, но ваше словесное описание звучит правильно: используйте [http://en.wikipedia.org/wiki/Power_set] вместе с перестановкой. Чтобы перечислить набор мощности *, подумайте об увеличении двоичного числа, где каждая «цифра» соответствует количеству раз, когда элемент ввода был выбран для вывода на выходе. Для повторных элементов во входном наборе некоторые «цифры» «двоичного» числа станут тройными или счетчиком повторения этого элемента. – rwong
Обратите внимание, что для строки длины 'N' у вас будут' 2^N-1' отдельные непустые подмножества в худшем случае (если все символы разные), и для каждого подмножества, состоящего из символов 'L', вы У меня есть 'L!' перестановки. –