特定のアルファベットを指定して、長さ k のシーケンスの可能なすべての組み合わせを生成しようとしています (これは、バイオインフォマティクス プロジェクトのクエリ シーケンスを生成するためです)。
シーケンスは次の形式です。
ACGU (これらを Y と呼ぶ) のいずれかである最初の文字と最後の文字、およびその間の k - 2 文字は、ACGU または ? のいずれかである可能性があります。(これらを X と呼びます)。
たとえば、k = 3 の場合、パターンは YXY の形式になり、k = 5 の場合、YXXXY の形式になります。
k が既知の場合、可能なすべてのシーケンスを生成するのは簡単です。k をネストされた for ループで使用できるからです。ただし、k が事前にわからない場合、この実装は適切ではありません。
可能なシーケンスの総数は、4^2 * 5^(k-2) で表すことができます。k = 3 の場合、これは 80 の組み合わせしか得られませんが、k = 9 までスケールアップすると、1,250,000 になります!
ヒント、アイデア、提案をいただければ幸いです。
生成されたすべてのシーケンスを使用する必要があるため、配列に格納するか、作成/生成時に別の関数に渡す必要がありますが、すべてを格納する必要はありませんが、どちらでもかまいません。
どうもありがとう。
注意: 私は Objective-C で書いていますが、C スタイルのコード、疑似コード、またはアルゴリズムの単純な英語の説明が役に立ちます。
アップデート:
これは、Analog File による素晴らしい回答に基づいて作成した objc コードです。現在、1 行につき 1 つのシーケンスを stdout に出力するだけですが、文字列の配列を生成するように変更します。
貢献してくれたすべての人に感謝します。
NSArray *yAlphabet = [NSArray arrayWithObjects:@"A", @"C", @"G", @"U", nil];
NSArray *xAlphabet = [NSArray arrayWithObjects:@"A", @"C", @"G", @"U", @"?", nil];
int i, v;
int count = 0;
int numberOfCases = 16 * pow(5 , (k - 2));
for (int n = 0; n < (numberOfCases); n++) {
i = n;
v = i % 4;
i = i / 4;
count++;
printf("\n%s", [[yAlphabet objectAtIndex:v] cStringUsingEncoding:NSUTF8StringEncoding]);
for (int m = 1; m < (k - 1); m++) {
v = i % 5;
i = i / 5;
printf("%s", [[xAlphabet objectAtIndex:v] cStringUsingEncoding:NSUTF8StringEncoding]);
}
printf("%s", [[yAlphabet objectAtIndex:i] cStringUsingEncoding:NSUTF8StringEncoding]);
}
printf("\n");
NSLog(@"No. Sequences: %i", count);
更新 2:
生成されたシーケンスを文字列の配列に出力するコードは次のとおりです。k は目的のシーケンスの長さであり、他の場所でパラメーターとして指定されることに注意してください。これを k=9 (1,250,000 シーケンス) までテストしました。また、私のコードは ARC を使用しているため、メモリの割り当て解除は示されていません。
NSArray *yAlphabet = [NSArray arrayWithObjects:@"A", @"C", @"G", @"U", nil];
NSArray *xAlphabet = [NSArray arrayWithObjects:@"A", @"C", @"G", @"U", @"?", nil];
NSMutableArray *sequences = [[NSMutableArray alloc] init];
int i, v;
int count = 0;
int numberOfCases = 16 * pow(5 , (k - 2));
for (int n = 0; n < (numberOfCases); n++) {
i = n;
v = i % 4;
i = i / 4;
count++;
NSMutableString *seq = [[NSMutableString alloc] initWithString:[yAlphabet objectAtIndex:v]];
for (int m = 1; m < (k - 1); m++) {
v = i % 5;
i = i / 5;
[seq appendString:[xAlphabet objectAtIndex:v]];
}
[seq appendString:[yAlphabet objectAtIndex:i]];
[sequences addObject:seq];
}
NSLog(@"No. Sequences looped: %i", count);
//print the array to confirm
int count1 = 0;
for (NSMutableString *str in sequences) {
fprintf(stderr, "%s\n", [str cStringUsingEncoding:NSUTF8StringEncoding]);
count1++;
}
NSLog(@"No. Sequences printed: %i", count1);
NSLog(@"Counts match? : %@", (count == count1 ? @"YES" : @"NO"));