0

私はEclipseでコーディングしていCTRL-Fますが、文字列を見つけるためにaを実行すると、大文字と小文字を区別する単語全体の標準化されたオプションとは別に、正規表現検索のオプションもあります(Notepad ++にもあります)。

私はそれを1、2回試しましたが、通常、結果はほぼ瞬時に得られます. しかし結局のところ、コード ファイルはそれほど巨大ではありません。最大のファイルでも長さは 500 行を超えず、ほとんどの行が半分以下しか埋まっていません。ユーザーが指定した正規表現が、たとえば 10 ~ 15 MB のサイズの大きなテキストでより高速に実行されるように最適化する方法はありますか?

Rabin-Karp やサフィックス ツリーのような標準化された検索アルゴリズムがここには適用されないため、どのような方法も考えられません。

4

2 に答える 2

1

Eclipse で正規表現がどのように実装されているのか、なぜそれほど遅いのか、私にはわかりません。ここにいくつかの考えがあります:

まず、知っておくべき概念がいくつかあります:非決定性有限オートマトン (NFA)決定性有限オートマトン (DFA)です。理論的には、正規表現、NFA、および DFA は同等です。つまり、これらは言語 (文字列) を記述する能力がまったく同じであることを意味します。これは、それらのいずれかを別のものに変換できることを意味します (このサイトを参照してください)。

正規表現はそれを DFA に変換することで実装でき、DFA を使用してテキストを一致させるには線形時間しかかかりません (KMP などの文字列一致アルゴリズムの多くは、実際には特別な DFA です)。ただし、問題は、最新の正規表現の実装のほとんどが後方参照などの機能を導入しており、DFA を使用できなくなっていることです。

したがって、これらの複雑な機能を破棄できる場合は、高速な正規表現を実装することができます (線形時間でマッチングを行います)。詳細については、この記事を参照してください。

于 2013-08-05T02:51:32.927 に答える
0

サフィックス ツリーがこの問題に適したアルゴリズムではないと考える理由は何ですか? http://en.wikipedia.org/wiki/Suffix_treeから:

[サフィックス ツリーが] 構築されると、いくつかの操作をすばやく実行できます。たとえば、S 内の部分文字列の検索、特定の数の誤りが許容される場合の部分文字列の検索、正規表現パターンの一致の検索などです。

修正されたボイヤー・ムーア文字列検索アルゴリズムも可能だと思います。

于 2013-08-04T01:42:41.313 に答える