1

可能であれば効率的な方法で、複数回出現する文字列の部分文字列を識別し、その部分文字列のすべての出現箇所をトークンに置き換える、ある種の「検索と置換」アルゴリズムを実行したいと思います。

たとえば、文字列「AbcAdAefgAbijkAblmnAbAb」が与えられた場合、「A」が繰り返されることに注意してください。そのため、パス 1 を「#1bc#1d#1efg#1bijk#1blmn#1b#1b」に減らします。ここで、#_ はインデックス付きパターンです (インデックス付きテーブルのパターン)、「#1b」が繰り返されることに注意してください。したがって、「#2c#1d#1efg#2ijk#2lmn#2#2」に縮小されます。文字列にこれ以上パターンが発生しないので、完了です。

「最長の共通サブシーケンス」と圧縮アルゴリズムに関する情報をいくつか見つけましたが、これを行うと思われるものは何もありません。これらは、2 つの文字列を比較するため、または何らかの種類のストレージに最適な結果を取得するためのものです。

一方、私の目的は、ゲノムを「文字」ではなく「言葉」に還元することです。つまり、gatcatcgatc の代わりに 2c1c2c を見たいのです。後で正規表現を実行して、「#42*#42」のようなものを見つけることができます。DNA に括弧が繰り返されるのを見るのはクールだろう。

オンラインでそれを見つけることができれば、自分でそれを行うことをスキップしますが、明らかにすることができたという点で、この質問に対する答えは以前には見られませんでした. 私を正しい方向に向けることができる人に感謝します。

4

1 に答える 1

1

バイトペアエンコーディングは、あなたが望むものにかなり近いことを行います。最長の繰り返し文字列 (トップダウン) を直接検索するのではなく、バイト ペア エンコーディングの各パスは、繰り返されるバイト ペア (ボトムアップ) を検索します。しかし、最終的には最長の繰り返し文字列 (*) を発見します。

  • ガットキャットガット
  • 1=g1c1cg1cで
  • 2=atc g22g2
  • 3=gatc 2=atc 323

ご覧のとおり、最長の繰り返し文字列「gatc」が見つかりました。

(*) バイトペアのエンコーディングは、最終的に最長の繰り返し文字列を見つけるか、または (2^8 - uniquechars(source) ) 置換を行った後に早期に停止します。早期停止条件が少し緩和されるように、バイトペアのエンコーディングを微調整することは可能かもしれないと思います-おそらく (2^9 - uniquechars(source) ) または 2^12 または 2^16. それが圧縮パフォーマンスに悪影響を与えたとしても、おそらくあなたのようなアプリケーションには興味深い結果が得られるでしょう。

于 2011-06-18T04:33:30.963 に答える