web-dev-qa-db-ja.com

同様の多次元配列検出

類似の行列をすばやく特定できるように、ある種のアルゴリズムを探しています。行列は永続的に保存されないため、各行列を簡単に保存できる値にマッピングする方法が必要です。その後、同じマッピングを将来使用できます。行列を作成し、計算値とすばやく比較します。

私が同様の行列を定義する方法は、垂直線、水平線、主対角線、および副対角線によってミラーリングされたときにそれらが同一であるかどうかということです。

例えば

1 2 3
4 5 6
7 8 9

以下のすべての行列と同じものとして識別されます

3 2 1
6 5 4
9 8 7
-----
7 8 9
4 5 6
1 2 3
-----
1 4 7
2 5 8
3 6 9
-----
9 6 3
8 5 2
7 4 1

私はこの問題に何日も悩まされてきました。行列は永続的に保存されないため、直接比較することはできません。誰かが私を正しい方向に向けることができますか?ありがとう

2
rhysw

8つの対称行列のそれぞれのハッシュ値を計算し、それらの最小のものだけを保持します-これでうまくいくはずです。これにより、同値類の各行列に同じ値が得られます。

1
Doc Brown

1つのハッシュ値を格納する代わりに、5つのハッシュ値を格納します

M0= 1 2 3
    4 5 6
    7 8 9

以下のすべての行列と同じものとして識別されます

M1からM4を作成する操作は以下のとおりです。

M1= 3 2 1  (vertical mirror  M1:= VM(M0) )
    6 5 4
    9 8 7
-----
M2= 7 8 9 (horizontal mirror M2:= HM(M0) )
    4 5 6
    1 2 3
-----
M3= 1 4 7 (transpose M3= T(M0) )
    2 5 8
    3 6 9
-----
M4=     9 6 3 (M4= VM(T(MO) )
    8 5 2
    7 4 1

すべての同等の行列(元の行列に加えて合計7つ)は、VM()、HM()、およびT()の組み合わせとして記述できます。

したがって、行列に8つのハッシュ値を保持している場合は、ハッシュ値を比較できます。

行列M0のハッシュ値を計算するには(この場合、数値は数字のみです)、それを文字列 "123456789"に変換し、ハッシュ関数を使用できます。

これがお役に立てば幸いです。

0

数学を使用して類似性を識別することができます。条件としての類似性のために、最初の行列の後に与えた各例を想定しました。

あなたの例のマトリックスの場合-

Let Ux = 1 2 3
         4 5 6
         7 8 9

Let Ix = 0 0 1
         0 1 0
         1 0 0

UxIxの行列乗算を実行すると、次のようになります。

Ux . Ix = 3 2 1
          6 5 4
          9 8 7 

これが条件1です。

もしあなたがそうするなら

Ix . Ux = 7 8 9
          4 5 6
          1 2 3

これが条件2です。したがって、Ixを使用して、定義した2つの類似条件を特定できます。

条件3の場合、それはTranspose(Ux)です。

条件4の場合、Trasnpose(Ix。Ux。Ix)です。

お役に立てれば!

0
Siva Senthil

封筒裏の計算に基づいて、次のアプローチをお勧めします。個々の行、各列、各対角線、および4つのコーナーを合計すると、9つの数値のセットが得られます。ソート済み。このソートされた番号のリストは、リストしたすべてのケースとそのローテーションで同一ですが、一意である必要があります(つまり、他の配置と衝突しないようにします)。この分析が真の場合、その9つの数値リストの 簡単なハッシュ関数 を保存値として使用できます。

(もちろん、ローテーションが類似性分類から除外されている場合は、図面に戻る必要があります。)

0
kmote