昨日、StackOverflowが30分ダウンしました。その後、彼らはそれについてブログの投稿を書き、問題が正規表現マッチングの予想外に高い複雑さから生じたことを詳述しました。
つまり、正規表現a+b
は、文字列aaaaaaaaaaaaaac
で実行される場合、バックトラックを使用するため、時間で実行されますは文字数です。a
次のPythonコードで問題を再現できます。私のコンピューターでは、実行に4秒以上かかります。
import re, time
start = time.time()
re.findall(r'\s+$', ' '*20000 + 'x')
print(time.time() - start)
これは私にとって非常に驚きました。私が考えたのだろう必要があるだろうこれ、正規表現からDFAを構築し、それを通じて、希望の文字列を実行することにより、例えば、正規表現マッチャがより効率的に動作することを考えていると思います(DFA工事は含みません)。
(たとえば、Cormen、Leiserson、Rivestによる本のアルゴリズムの紹介は、Knuth-Morris-Prattアルゴリズムを導入する方法について同様のアルゴリズムを通過します)。
私の質問:アルゴリズムを許可しない正規表現マッチングに本質的に難しいものはありますか、または単に非効率的な実装(Pythonで、StackOverflowが使用するものなど)について話しているだけですか?