特定のオブジェクトのセットからオブジェクトの組み合わせを生成する方法を探しています。順序は関係ありません(順列ではなく組み合わせ)。いう。A、B、C、D のリストがあり、これらのうち 3 つを選択する必要があります。次に、次のリストを取得する必要があります。
ABC ACD BCD
Objective Cでそうするための効率的なロジックはありますか?
特定のオブジェクトのセットからオブジェクトの組み合わせを生成する方法を探しています。順序は関係ありません(順列ではなく組み合わせ)。いう。A、B、C、D のリストがあり、これらのうち 3 つを選択する必要があります。次に、次のリストを取得する必要があります。
ABC ACD BCD
Objective Cでそうするための効率的なロジックはありますか?
ここで重要なのはテクニックにあります。コメントでリンクした質問には根拠があります。アルゴリズムは次のとおりです。
1) 最初の n 要素から開始する
2) 最終要素が最終位置になるまで、最終要素をインクリメントする
3) 前の要素を 1 つ前に移動し、最終要素を前の要素の後の位置にリセットする
4) 手順 2 と手順を繰り返す3 前の要素と最後の要素が最後の 2 つの位置に来るまで
5) 前の前の要素を 1 つ前に移動し、最後の 2 つの要素を前の前の要素の後の位置にリセットします
6) までこのプロセスを繰り返しますすべての要素が最後にある
簡略化すると次のようになります。
コンボ配列の最初の要素が元の配列とコンボ配列の差よりも小さい場合は、次の操作を行います。
コンボ配列の最後の要素が元の配列のカウントの長さよりも短い間、最後の要素をインクリメントし、元の配列から結果のインデックスを取得します
その後、前の要素を確認します。lastElement -1 より小さい場合は、それをインクリメントし、lastElement を前の要素 + 1 に設定して、上記の手順を繰り返します。そうでない場合は、前の要素を確認します。それらがすべて連続している場合は、完了です。
このアルゴリズムを支援するために、組み合わせのサイズに一致するインデックスの配列を作成することをお勧めします。5 要素配列の 3 要素の組み合わせが必要だとしましょう。最初のインデックスの 3 要素配列を作成します。
[0,1,2]
最初に上記のアルゴリズムを適用すると、最後の要素が[0,1,3] [0,1,4]までインクリメントされます。
次に、前のものをインクリメントし、最後のものをリセットします[0,2,3]
最後の 2 つが最終位置[0,2,4] [0,3,4]になるまで、上記の手順を繰り返します。
行[1,2,3] [1,2,4] [1,3,4] [2,3,4]に沿って移動すると、すべてのインデックスが最終的な位置になり、終了します。
ただし、これを Objective-C で記述するつもりはありません。なぜなら、アルゴリズムの実装はすべてのプログラマーに必要なものだからです。これはあなたが成功するための十分な情報になると思います。
はいあなたが持っています。難しくはないが長い。文字数のためにforループを取る必要があるだけです。以下のコードを参照してください。
NSMutableArray *arr_Combinations = [[NSMutableArray alloc] init];
NSString *str_First;
NSString *str_Second;
NSString *str_Third;
for (NSInteger firCount = 0; firCount < 4; firCount++)
{
NSMutableArray *arr_First = [NSMutableArray arrayWithObjects:@"A", @"B", @"C", @"D", nil];
str_First = [arr_First objectAtIndex:firCount];
[arr_First removeObjectAtIndex:firCount];
for (NSInteger secCount = 0; secCount < [arr_First count]; secCount++)
{
NSMutableArray *arr_Second = [[NSMutableArray alloc] initWithArray:arr_First];
str_Second = [str_First stringByAppendingString:[arr_Second objectAtIndex:secCount]];
[arr_Second removeObjectAtIndex:secCount];
for (NSInteger thirCount = 0; thirCount < [arr_Second count]; thirCount++)
{
NSMutableArray *arr_Third = [[NSMutableArray alloc] initWithArray:arr_Second];
str_Third = [str_Second stringByAppendingString:[arr_Third objectAtIndex:thirCount]];
[arr_Third removeObjectAtIndex:thirCount];
for (NSInteger fothCount = 0; fothCount < [arr_Third count]; fothCount++)
{
NSString *str_Final = [str_Third stringByAppendingString:[arr_Third objectAtIndex:fothCount]];
NSLog(@"%@", str_Final);
[arr_Combinations addObject:str_Final];
}
}
}
}
NSLog(@"%d", [arr_Combinations count]);