疑似コードでは、素朴な実装は次のようになります。
1. for each column c1 in table1
2. for each column c2 in table2
3. if approximately_isomorphic(c1, c2) then
4. emit (c1, c2)
approximately_isomorphic(c1, c2)
1. hmap = hash()
2. for i = 1 to min(|c1|, |c2|) do
3. hmap[c1[i]] = c2[i]
4. if |hmap| - unique_count(c1) < error_margin then return true
5. else then return false
アイデアは次のとおりです。各列の要素を他の列とペアごとに比較します。列のペアごとに、2 つの列の対応する要素をリンクするハッシュ マップを作成します。ハッシュ マップに、最初の列の一意の要素と同じ数のリンクが含まれている場合、完全な同形性があります。さらにいくつかある場合は、ほぼ同形です。最初の列の要素の数まで、さらに多くの要素がある場合は、おそらく相関関係を表していないものがあります。
入力の例:
ID & anything : perfect isomorphism since all of ID are unique
Opt1 & ID : 4 mappings and 3 unique values; not a perfect
isomorphism, but not too far away.
Opt1 & Opt1 : ditto above
Opt1 & Type : 3 mappings & 3 unique values, perfect isomorphism
Opt2 & ID : 4 mappings & 3 unique values, not a perfect
isomorphism, but not too far away
Opt2 & Opt2 : ditto above
Opt2 & Type : ditto above
Type & anything: perfect isomorphism since all of ID are unique
最良の結果を得るには、この手順を両方の方法 (つまり、table1 と table2 を比較してから table2 と table1 を比較する) を実行して、全単射マッピングを探すことができます。そうしないと、些細なケースで失敗する可能性があります...最初のすべての値が異なる (完全同型) または 2 番目のすべての値が同じ (完全同型)。この手法は、列がどの程度類似しているか、または類似していないかをランク付けまたは測定する方法を提供することにも注意してください。
これは正しい方向に進んでいますか?ちなみに、これは O(ijk) で、table1 には i 列、table 2 には j 列があり、各列には k 要素があります。理論的には、ペアごとの比較を行わずに相関関係を見つけることができる場合、メソッドに対して実行できる最善の方法は O(ik + jk) です。