以下に、私が望む正確な形式で問題を表現します。
与えられた :同じ長さ(は 2 の倍数) の 2つN
の浮動小数点リスト。すべての場合、 が存在することが知られています。(ゼロベースのインデックスを使用しています)D
k
k
i=0,...,k-1
j != i
D[j]*D[i] == N[i]*N[j]
戻り値: (長さ) のようなk/2
ペアのリスト。返されるペアは一意ではない可能性があります (ペアの有効なリストは問題ありません)。(i,j)
D[j]*D[i] == N[i]*N[j]
このアルゴリズムのアプリケーションは、一般化回文固有値問題の固有値の逆ペアを見つけることです。等式条件は と同等ですがN[i]/D[i] == D[j]/N[j]
、分母がゼロの場合にも機能します (これは確実な可能性です)。固有値問題の縮退により、ペアが一意ではなくなります。
より一般的には、アルゴリズムは次と同等です。
指定X
:長さのリストk
(k
は 2 の倍数)。すべての に対して、 がtrue を返すようなものi=0,...,k-1
が存在することが知られています。ここで、 はすべての に対して少なくとも 1 つに対して true を返すことが保証されているブール一致関数です。j != i
IsMatch(X[i],X[j])
IsMatch
j != i
i
戻り値 : リスト内のすべてのペアの (長さk/2
)ペアのリスト。返されるペアは一意ではない可能性があります (ペアの有効なリストは問題ありません)。(i,j)
IsMatch(i,j) == true
明らかに、私の最初の問題は を使って 2 番目の問題で定式化できますIsMatch(u,v) := { (u - 1/v) == 0 }
。現在、浮動小数点精度の制限により、正確に等しいことはありません。そのため、一致エラーを最小限に抑えるソリューションが必要です。つまり、IsMatch(u,v)
が値u - 1/v
を返し、IsMatch がエラーの最小セットを返すリストをアルゴリズムが返すようにしたいとします。これは組み合わせ最適化問題です。最初に、考えられるすべてのインデックスi
とのペア間の一致エラーを単純に計算できると考えてj
いましたが、次に最小エラーのセットを選択する必要があり、どうすればよいかわかりません。
明確化
IsMatch
関数は再帰的 ( をIsMatch(a,b)
意味する) ですが、推移的ではIsMatch(b,a)
ありません。しかし、それは 3 推移的です: をIsMatch(a,b) && IsMatch(b,c) && IsMatch(c,d)
意味しIsMatch(a,d)
ます。
補遺
この問題は明らかに、グラフ理論における最小重み完全一致問題と同じです。ただし、私の場合、「適切な」完全な一致が必要であることを知っているため、エッジの重みの分布は完全にランダムではありません。この情報は何らかの形で利用されるべきだと思います。ここでの問題は、検索の早い段階で私の以前の知識を使用して解決策に到達する、最小重量完全一致問題の適切な実装があるかどうかです。また、そのようなアルゴリズムの単純な実装への指針にもオープンです。