編集:すごい!?
大きな承認です。私はパターン構文の定義を台無しにし、正規表現fnmatch
のように動作するはるかに難しい問題を提案した(そしておそらく解決した)ようです。.?
もちろん、実際には.
正規表現のように動作するはずです(0または1ではなく、1文字に正確に一致します)。つまり、私の最初の問題削減作業は、(今ではかなり退屈な)元の問題を解決するのに十分だったことを意味します。しかし、より難しい問題を解決することは、まだかなり興味深いものです。私はいつかそれを書くかもしれません。
プラス面として、これは、2way / SMOAニードル因数分解のようなものがこれらのパターンに適用できる可能性がはるかに高いことを意味します。これにより、当初の望ましいパフォーマンスよりも優れたパフォーマンスが得られる可能性がありO(n)
ますO(n/m)
。
質問のタイトルでm
は、パターン/針n
の長さ、それに一致する文字列の長さとします。
私が見た/使用したすべてのアルゴリズムは、バックトラッキングが原因で病理学的に悪いパフォーマンスとスタックオーバーフローの悪用の可能性があるか、動的メモリ割り当てが必要なため(たとえば、DFAアプローチの場合、または呼び出しでバックトラックを実行しないようにする場合)、この質問は私にとって興味深いものですスタック)、したがって、プログラムがfnmatch
何らかのアクセス権を付与/拒否するために使用している場合にも危険な可能性のある障害ケースがあります。
正規表現のマッチングにはそのようなアルゴリズムは存在しないと私は信じていますが、ファイル名パターン言語は正規表現よりもはるかに単純です。私はすでに問題を単純化して、パターンが*
文字を使用していないと想定できるようにしました。この修正された問題では、文字列全体を照合するのではなく、文字列内のパターンの出現を検索します(部分文字列など)。一致の問題)。言語をさらに単純化して?
文字を削除すると、言語は固定文字列と角かっこ式の連結で構成され、これはO(mn)
時間とO(1)空間で簡単に一致させることができ、おそらく次のように改善できます。O(n)
2wayおよびSMOAサブストリング検索で使用される針分解技術をそのようなブラケットパターンに拡張できるかどうか。ただし、単純にそれぞれが文字を消費する?
かどうかにかかわらず試行を必要とし、パターン内の文字の数がどこにあるか?
という時間係数をもたらします。2^q
q
?
この問題がすでに解決されているかどうか、またはそれを解決するためのアイデアを持っている人はいますか?
注:O(1)スペースの定義では、Transdichotomous_modelを使用しています。
注2:このサイトには、私が参照した2wayおよびSMOAアルゴリズムの詳細があります:http ://www-igm.univ-mlv.fr/~lecroq/string/index.html