私は次のように抽象化した C# 4.0 でプログラムを作成しています (どのライブラリを使用する必要があるかを理解できるように、言語について言及します。サードパーティのライブラリは使用しません)。
しましょうS = { s1, s2, s3, ..., sn }
。
すべてのsi
、sj
in S
、i != j
functionf(si, sj)
は の要素です{ true, false }
。ただし、この関数の呼び出しf
は非常にコストがかかるため、できるだけ少ない回数で実行する必要があります。
setT = { t1, t2, t3, ..., tm }
の空でないサブセットを指定すると、 for all 、およびallおよびinなどのすべての要素を含むS
シーケンスを計算します。そのようなシーケンスが存在すると仮定できます。U = u1, u2, u3, ..., uo
T
f(ui, uj) == false
i < j
f(ui, s') == false
i
s'
S - U
これは学校とはまったく関係ありませんが (これは仕事のためです)、私がより多くを学べるように、あなたが考えることができる最も最適な解決策にたどり着くために、最小限の支援を希望します :)
ヒント(私が考えたいくつかのこと:)
各ノードに少なくとも 1 回アクセスする必要があります。とのすべての
T = { t }
と の場合を考えてみましょう。この場合も1回で十分です。f(t, s') == false
s'
S - T
|S| >= 2
最低限
U
計算する必要があります。この計算は、次のように表すことができます|S|x|S|
。?
: 知らない1
:場合によります。0
:依存しない。-
: 私は気にしない。
これを考慮してください (アルゴリズムの開発に役立つ最適な潜在的なチェック シーケンスのパターンがあるかどうかを確認するために、例を見ていきます)。 S = { a, b, c, d, e }
T = { a, b, c }
(星印で示されます):
a b c d e
----------------
*a | - - - ? ?
*b | - - - ? ?
*c | - - - ? ?
d | - - - - ?
e | - - - ? -
U = { a, b, c }
最初に。オペランドが等しい場合、 は定義されない-
ため、対角線は定義されません。とはすでにセットに含まれているf
ためa
、誰かがそれらに依存していてもかまいません。したがって.b
c
-
f(a, d)
、f(a, e)
、f(b, d)
、f(b, e)
、はf(c, d)
、f(c, e)
対称性によりすべて等しい候補です。を選択するf(a, d)
と、false が返されます。テーブルは次のようになります。
a b c d e
----------------
*a | - - - 0 ?
*b | - - - ? ?
*c | - - - ? ?
d | - - - - ?
e | - - - ? -
ケース 1:U = { a, b, c }
これを見つけるために、運が良ければ、 をチェックし、それらをすべて にすることで、3 つのチェックでそれを行うことがf(b, d)
でき ます。f(c, d)
f(e, d)
false
ケース 2:U = { a, b, c, d, e }
これを見つけるために、運が良ければ、チェックして両方を返すことで、2 つのチェックでそれを行うことがf(b, d)
できf(a, e)
ますtrue
。
(まだ完全には考えていないので、食べに行く必要があります。読んでくれた皆さん、ありがとう!)
ケース 3:U = { a, b, c, d }
ケース 4:U = { a, b, c, e }