2012-05-05 3 views
-1

У меня есть массив из п элементов, мне нужно положить все 2- их сочетание в массивы длины 2. Например:2- комбинация C++

предположим, что гребень 2 одномерный массив.

n = 1,2,3 

мне нужно поставить все 2- комбинации прочесывать [I] [J] вроде:

comb[0][0] = {1} 
comb[0][1] = {2} 

comb[1][0] = {1} 
comb[1][1] = {3} 

comb[2][0] = {2} 
comb[2][1] = {3} 

Я не знаю, как писать код! Благодаря

Ответ:

Выходов (п!) Ответ: n = общее число т = Общий возможный ответ

int m = 0; 
for (int i = 0; i < n - 1; i++){ 
    int first = a[i]; 
    for(int j = i+1 ; j < n ; j++){ 
     int second = a[j]; 
     comb[m][0] = first; 
     comb[m][1] = second; 
     ++m; 
} 

}

+2

Это домашнее задание? Что вы пробовали? В любом случае, вы должны удалить эти скобки. – chris

+0

Я боюсь, если StackOverflow будет полезен для вашей домашней работы ;-) – g13n

+0

@ g13n, SO может определенно оказать большую помощь в выполнении домашних заданий, но если это домашнее задание, вы должны * сделать это сами. В большинстве случаев все, что требуется, - это идея, на которой можно опираться. Если вы пришли, чтобы заставить других людей выполнять домашнее задание, почему вы зачислили курс в первую очередь? – chris

ответ

0

Один простой способ - использовать функцию next_permutation, доступную в библиотеке STL, чтобы сгенерировать все возможные перестановки ваших номеров, а затем выбрать первые два элемента каждого из них. Обратите внимание, что последовательность должна быть сначала отсортирована, как если бы предыдущие перестановки не были пропущены.

int nums[] = {1, 2, 3, 4}; 
while (next_permutation(nums, nums + 4)) { 
    cout << nums[0] << ", " << nums[1] << endl; 
} 

Для того, чтобы использовать эту функцию, необходимо, чтобы у вас была #include <algorithm>.

+0

спасибо.У меня много чисел, а не только 3. поэтому вычисление всех перестановок требует больших затрат памяти. Заказ для меня не важен, и я просто хочу сохранить все 2 комбинации. Есть ли другой оптимизированный способ? – Bipario

+0

Не имеет значения, сколько у вас чисел, поскольку в этом нет дополнительной памяти (элементы перегруппированы в исходном массиве) – Win32

+1

Вы уверены? поэтому я должен только вызвать next_permutation и выбрать только первые два элемента каждой перестановки? как насчет порядка алгоритма? – Bipario

0

Для каждого элемента в n индексированные Ith ставить все элементы в n, за исключением i-й индексированной j-й в ячейке comb[length(n) - i][j].

+0

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

+0

@ Кароли Я, должно быть, устал, я не вижу проблемы? – log0

+0

сравните свой альго с его примером –

1

Можно думать о следующем N^2 подхода:

// Resulting combinations 
vector<pair<int,int> > comb; 
// Copy n into a double-ended queue - best would be for n to already be a deque 
deque<int> Q(a.size()); 
copy(a.begin(), a.end(), Q.begin()); 
sort(Q.begin(), Q.end()); 

while(!Q.empty()) 
{ 
    // Get first element, remove it and equivalent elements 
    int a = Q.front(); 
    while(Q.front() == a) 
     Q.pop_front(); 

    // Find all unique combinations with first element 
    int last=a; 
    for(deque<int>::iterator it = Q.begin(); it != Q.end(); ++it) 
    { 
     if(*it != last) 
      comb.push_back(pair<int,int>(a,*it)); 
     last = *it; 
    } 
} 

Возможно легко оптимизировать это дальше.

+0

Думайте, что альгортим с наихудшим временем меньше, чем 'O (n^2)', вероятно, не будет возможен, так как вывод с уникальными числами масштабируется в 'n^2', например. существует 3 комбинации для 3 и 45 комбинаций для 10 уникальных элементов. – smocking

+0

Спасибо. Это хороший ответ. Я отвечаю O (n!), Я отправляю его сейчас – Bipario

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