2012-05-05 33 views
-1

は、私は、例えば、長さ2の配列にそれらの全て2-組合せを配置する必要があり:2-組み合わせC++

仮定する櫛は、2次元アレイです。私は櫛ために、すべての2 - の組み合わせを配置する必要があり

n = 1,2,3 

ような[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} 

私はコードを書く方法がわかりません! おかげ

私の答え:

O(!N)答え:N =総数M =トータル可能答えプットi番目のインデックス付け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

簡単な方法の1つは、数字の可能なすべての順列を生成するために、next_permutation関数をSTLライブラリで使用し、それぞれの最初の2つの要素を選択することです。シーケンスが最初にソートされる必要があることに注意してください。前の並べ替えがスキップされないかのように

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

この機能を使用するには、#include <algorithm>を使用する必要があります。これをさらに最適化することが

// 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

ありがとう。私は多くの数字を持っています.3。だけでなく、すべての並べ替えコストを計算するのは、たくさんのメモリです。注文は私にとって重要ではなく、2つの組み合わせをすべて保存したいだけです。他に最適化された方法はありますか? – Bipario

+0

余分なメモリを使用していないので、数字の数は関係ありません(要素は元の配列に再配置されます) – Win32

+1

本当ですか?ですから、私はnext_permutationを呼び出し、各順列の最初の2つの要素だけを選択する必要があります。どのようなアルゴリズムの順序については? – Bipario

0

セルcomb[length(n) - i][j]のi番目のインデックス付きj番目を除く、nのすべての要素。

+0

インデックスが間違っています。彼の宿題について完全な解決策を提示しないでください。 –

+0

@Karoly私は疲れているはずです私は問題が表示されません? – log0

+0

あなたのアルゴと彼の例を比べてください –

1

は、次のN^2のアプローチを考えることができます。

+0

一意の数字を持つ出力が 'n^2 'でスケーリングされるので、' O(n^2)'よりもワーストケース時間の短いアルゴリズムはおそらく不可能であると考えてください。 10個のユニークな要素に対して、3つの組み合わせと3つの組み合わせがあります。 – smocking

+0

ありがとうございます。これは良い答えです。私はO(n!)の答えを持っています、今投稿します – Bipario