0

私はすべての可能な組み合わせで数字の組み合わせを生成するための効率的な方法を探しています。したがって、整数の一般的なリスト(1〜120)がある場合、1つの結果を実際には1から120までの番号順に120の数値すべてにする必要があります。次に、これらの数値が異なる順序である他のすべての組み合わせが必要になります。 。

4

2 に答える 2

2

価値のあるものとして、LINQ と再帰を使用して小さな範囲 (1 ~ 8 など) を処理する方法を次に示します。

範囲を段階的に増やしてみると、このアプローチがうまくいかない理由がわかります。

static void Main(string[] args)
{
    int[][] combinations = GetCombinations(8).Select(c => c.ToArray()).ToArray();
    string s = string.Join("\n", combinations.Select(c => string.Join(",", c)));
    Console.WriteLine(s);
}

static IEnumerable<IEnumerable<int>> GetCombinations(int count)
{
    return GetCombinations(Enumerable.Range(1, count));
}

static IEnumerable<IEnumerable<int>> GetCombinations(IEnumerable<int> elements)
{
    if (elements.Count() == 1)
        return EnumerableSingle(elements);

    return elements.SelectMany((element, index) =>
        GetCombinations(elements.ExceptAt(index)).Select(tail =>
            tail.Prepend(element)));
}

static IEnumerable<T> ExceptAt<T>(this IEnumerable<T> source, int index)
{
    return source.Take(index).Concat(source.Skip(index + 1));
}

static IEnumerable<T> Prepend<T>(this IEnumerable<T> source, T element)
{
    return EnumerableSingle(element).Concat(source);
}

static IEnumerable<T> EnumerableSingle<T>(T element)
{
    return Enumerable.Repeat(element, 1);
}
于 2012-05-20T15:50:59.623 に答える
1

それを素早く行う方法を見つけたら、ノーベル賞を取りに行きましょう。

同様の原則に基づいている最新の暗号化メカニズムをすべて破ったところです。つまり、2 つの (素数) 数字のすべての可能な組み合わせを計算することは、高速ではありません。

それが宿題なら、あなたは冗談を言いました。私たちがあなたに教えていない魔法の隠された秘密があると本当に思っているなら、あなたは妄想に住んでいます.

申し訳ありませんが、これは意味のない問題の 1 つです。

効率の良い方法を探している

効率的と定義する. 私が今見ることができる最も効率的な方法は、大量のコンピューターをつかんで、力ずくでそれを実行することです. NSA は、現在、許容可能な時間枠内で 128 の番号に対してそれを行うことができると思われます ;)

お金が限られている場合の代替手段は、時間を稼ぐことです。ソーラーパネル付きの小さな機械をどこかに置き、しばらく計算させます。おそらく、世界の唯一の実話によると (「銀河系のヒスハイカーズ ガイド」で語られているように) これが地球が存在する理由です。

3 番目の方法 (最も効率的な方法) は、答えとして 42 を使用することです。適合する場合は、質問を見つけたばかりです。適合しない場合は、別の失敗にすぎません。

申し訳ありませんが、私はそれを深刻なものにしなければなりませんでした。因数分解の罠に陥る「単純な」数学的問題がよく出題されます。

于 2012-05-20T15:32:04.953 に答える