0

次のクラス「X」、「Y」、「Z」があるとしましょう。必要な結果は次のようになります

(X),(X,Y),(X,Z),(X,Y,Z),(Y),(Y,Z),(Z)

そして、「X」、「Y」、「Z」、「J」がある場合、必要な結果は次のようになります

(X), (X,Y),(X,Z),(X,J), (Y), (Y,Z),(Y,J), (Z),(Z,J)
(X,Y,Z), (X,Y,Z,J), (Y,Z,J), (Z,J,X)

これを達成するために必要なアルゴリズムは何ですか?

4

2 に答える 2

7

あなたが探しているものは、パワーセットと呼ばれます。それを計算するには、再帰的な方法と反復的な方法の両方があります。グーグルで検索するのは難しくありません。

アルゴリズムの実装を試してみて、特定の問題がある場合は質問を更新してください。

于 2012-05-01T09:49:12.063 に答える
2

それがパワー セットである場合は、空のセットを見逃しています (もちろん、常にパワー セットのメンバーです)。

とにかく、次のようなものがうまくいくかもしれません:

using System;
using System.Collections.Generic;
using System.Linq;

namespace Demo
{
    class Program
    {
        static void Main()
        {
            string[] classes = {"X", "Y", "Z"};

            foreach (var combination in PowerSet(classes))
            {
                foreach (var item in combination)
                {
                    Console.Write(item + ", ");
                }

                Console.WriteLine("");
            }
        }

        public static IEnumerable<IEnumerable<T>> PowerSet<T>(T[] sequence)
        {
            return from m in Enumerable.Range(0, 1 << sequence.Length)
                   select
                       from i in Enumerable.Range(0, sequence.Length)
                       where (m & (1 << i)) != 0
                       select sequence[i];
        }
    }
}

このアルゴリズムは、組み合わせが 2 進数であると「ふりをする」ことによって機能します。詳細については、 http://en.wikipedia.org/wiki/Power_setを参照してください (特に、「サブセットを関数として表現する」というタイトルのセクション)。

于 2012-05-01T10:40:45.150 に答える