文字が繰り返されないさまざまな量のセットでサブシーケンスを見つけることについて質問しました。解決策は、文字の各ペアの行列を作成し、各セットで発生しないものを破棄してから、有向非巡回グラフで最長パスを見つけることでした。ただし、最長パスだけが必要なわけではなく、いくつかの最長パスが必要です (たとえば、長さが 10、10、9、8、8、3、3、2、および 1 のサブシーケンスを生成する場合、最初の 5 つのサブシーケンスのみを表示します)。
したがって、最長パスだけを探しているわけではないため、ウィキペディアの記事で説明されている最長パス アルゴリズムを使用するのではなく、結果のサブシーケンスを生成するために、単純にすべてのリストを生成する単純なアルゴリズムを使用しています。可能なサブシーケンス。これにより、前の質問に対する回答の結果と同様のセットが生成されます。
問題は、生成されるサブシーケンスの量を減らしたいということです。
たとえば、次のセットがあるとします。
A = AB12034
B = BA01234
C = AB01234
...私のアルゴリズムは現在、各セットで発生する次のペアを考え出します:
A - 1 B - 1 1 - 2 2 - 3 0 - 3 3 - 4
2 2 3 4 4
3 3 4
4 4
0 0
これは技術的には正しいですが、これらのペアのいくつかを削除したいと思います。たとえば、2
常に の後に来ることに注意して1
ください。A2
したがって、 andのB2
ペアを削除したいと思います (つまりA
、andB
に直接ジャンプするべきではありません2
...常に最初に通過する必要があります1
)。また、は常にその直後に発生するため、1
以外の番号に決してジャンプしないでください。さらに、との間で常に発生することに注意してください。そのため、ペアを削除したいと思います(ここでも、にジャンプする前に常に通過する必要があります。これは、すべてのセットがこれらの 3 文字の位置を : として持っているためです)。2
2
0
B
3
B3
B
0
3
B < 0 < 3
明確にするために、現在のアルゴリズムは次のサブシーケンスを考え出します: (A
簡潔にするために で始まるものだけを含めました):
A1234
A124 *
A134 *
A14 *
A234 *
A24 *
A34 *
A4 *
A034
A04 *
...そして、 でマークされたものはすべて*
排除する必要があります。
目的のサブシーケンスを生成する (正しい) ペアは次のようになります。
A - 1 B - 1 1 - 2 2 - 3 0 - 3 3 - 4
0 0
...そして、サブシーケンスの完全なリストは次のようになります:
A1234
A034
B1234
B034
1234
234
034
34
言い換えれば、私はこの有向非巡回グラフから行こうとしています:
これに:
これらの不要なペア (つまり、グラフのエッジ) を取り除くには、どのようなアルゴリズム/ロジックを使用すればよいですか? それとも、そもそもペアを生成する私のロジックを変更する必要があると思いますか?