ここに C# の興味深い問題があります。私はそれを解決するためのより良い方法を探しています:
一致の行列 M (必ずしも正方ではない) が与えられた場合、最適な一致要素を見つけます。要素 i は、値 M(i,j) によって elem j に一致します。M(i,j) != M(j,i)。
#rows != #columns なので、最適な最小 (#rows,#columns) の一致するペア (i,j) を見つけます。
基本的に問題は、行/列が2回選択されないように、各行/列から最大値を選択することです。
例:
1 2 3
+---------
a | 10 3 1
b | 12 99 2
c | 20 5 3
d | 5 7 4
この行列の最大値は 99 であるため、最適な一致は (b,2) です。次の選択では、行 b と列 2 は使用できません。それらを切り取るようなものです。
1 2 3 or, if you prefer, 1 3
+--------- a smaller matrix: +------
a | 10 || 1 a | 10 1
b | ===++=== c | 20 3
c | 20 || 3 d | 5 4
d | 5 || 4
最大値は 20 になり、一致は (c, 1) になります。残りの行列には 1 列しかありません。別のピックの後、マッチ = 4 のマッチ (d, 3) を取得します。
結局、"a" は一致しません。
私の現在の実装では、2 つの配列を使用して、既に一致した行/列を格納し、一致ごとにマトリックス全体を調べて、一致しない行/列に属する最初の最大値を選択します。
PS: 同じ値を持つ値が複数一致する場合は、そのうちの 1 つを選択してください。 PS2: 配列は次のように格納されます。int [,]
より最適で美しい方法でこの問題にどのように取り組みますか?