最初に考えました。文字列の長さn
をO(log2(n))
に設定できます。 Z
が、その後、0と1を起動して、一致が発生しなくなるまで、すべてのチェックに疑問符の数を2倍k
疑問符を表し
- チェック
Z*
。 n
はバイナリ検索が行うのと同じ方法でk
を変え、同じパターンを使用して正確な長さを探す
-
k/2
間と
k
でなければなりません。
正確な長さを知ることは、空間領域である種のdivide-et-imperaを実行するのに役立ちます。
UPDATE
あなたは長さがわかっている場合は、正しくシンボルを見つけるために同じパターンを使用することができます。
例:文字列の長さn
とアルファベットサイズm
については
..X. ..XX (spaces added for readability)
+ symbol may be X
- symbol is not X
X symbol is X
*X* => MATCH ++++ ++++
*X* ???? => MATCH ++++ ++++
*X*?? ???? => NO MATCH --++ ++++
??X? ???? => MATCH --X+ ++++
??XX ???? => NO MATCH --X- ++++
??X? *X*?? => NO MATCH --X- --++
??X? ??X? => MATCH --X- --X+
??X? ??XX => MATCH --X- --XX
この程度O(n • log2(n))
が正しくn
シンボルを配置するために、そしてO(m)
が使用するシンボルを見つけるために、文字列の長さを見つけるために約O(log2(n))
がかかります - 一緒に合計すると、O(n • log2(n) + m)
が得られます。
いくつかのステップをマージすることでこれをスピードアップすることができます - 文字列の長さを決定したり、同時に文字列の最初と後半に2つ。これは、チェックが失敗した場合、どのチェックが失敗したかを判断するために、マージされたステップを単独で再チェックする必要があります。しかし、マージされたチェックが成功する限り、両方の情報が得られます。
多分私はそれが実際に物事をスピードアップするかどうかを見るために明日計算します。
文字列に関するいくつかの質問:文字セットは何ができますか?文字のみ、または他の文字は許可されていますか?どのくらいの文字列ができますか?小文字/大文字は問題になりますか? – schnaader
私はこの情報が効率的なアルゴリズムをどのように手助けするのか本当に理解できませんが、あなたが質問して以来、文字列はインターネットのホスト名なので、英数字といくつかの記号があります。および - 。 –
ケーシングは関係ありません - ?正確に1つのシンボルに一致し、*はゼロ以上のシンボルに一致し、他のシンボルはすべてそのシンボルに正確に一致します(大文字と小文字を区別しない場合は、アルファベットも重要ではありません(アルファベットの?と*の扱い方を除いて)。興味深いのは、アルファベットのサイズ、文字列の長さ、記号の頻度、またはアルファベットのサイズと文字列の長さの比に何らかの前提がある場合です。 –