Boyer-Mooreは、おそらく最も知られているインデックスなしのテキスト検索アルゴリズムです。だから、私はBlack Belt CoderウェブサイトのC#で実装しています。Boyer-Moore C#で実践していますか?
私はそれを動作させました。これは、String.IndexOf()
と比較して、予想されるパフォーマンスの向上をほぼ示しました。しかし、StringComparison.Ordinal
引数をIndexOf
に追加すると、Boyer-Mooreの実装よりパフォーマンスが向上し始めました。時には、かなりの量。
なぜ誰かが私を助けることができるのだろうかと思います。私はなぜStringComparision.Ordinal
が物事をスピードアップするのか理解していますが、Boyer-Mooreより速いのはどうでしょうか?それは.NETプラットフォーム自体のオーバーヘッドのためでしょうか。おそらく、配列インデックスが範囲内にあるかどうかを確認するために検証する必要があります。いくつかのアルゴリズムはC#.NETでは実用的ではありませんか?
以下はキーコードです。
// Base for search classes
abstract class SearchBase
{
public const int InvalidIndex = -1;
protected string _pattern;
public SearchBase(string pattern) { _pattern = pattern; }
public abstract int Search(string text, int startIndex);
public int Search(string text) { return Search(text, 0); }
}
/// <summary>
/// A simplified Boyer-Moore implementation.
///
/// Note: Uses a single skip array, which uses more memory than needed and
/// may not be large enough. Will be replaced with multi-stage table.
/// </summary>
class BoyerMoore2 : SearchBase
{
private byte[] _skipArray;
public BoyerMoore2(string pattern)
: base(pattern)
{
// TODO: To be replaced with multi-stage table
_skipArray = new byte[0x10000];
for (int i = 0; i < _skipArray.Length; i++)
_skipArray[i] = (byte)_pattern.Length;
for (int i = 0; i < _pattern.Length - 1; i++)
_skipArray[_pattern[i]] = (byte)(_pattern.Length - i - 1);
}
public override int Search(string text, int startIndex)
{
int i = startIndex;
// Loop while there's still room for search term
while (i <= (text.Length - _pattern.Length))
{
// Look if we have a match at this position
int j = _pattern.Length - 1;
while (j >= 0 && _pattern[j] == text[i + j])
j--;
if (j < 0)
{
// Match found
return i;
}
// Advance to next comparision
i += Math.Max(_skipArray[text[i + j]] - _pattern.Length + 1 + j, 1);
}
// No match found
return InvalidIndex;
}
}
EDIT:私はhttp://www.blackbeltcoder.com/Articles/algorithms/fast-text-search-with-boyer-mooreで問題にすべての私のテストコードと結論を掲載しました。
ジョナサン、 "C#.NET"のようなものはありません。 –
内部的にBoyer-Mooreが.netに採用されている可能性を完全に排除していますか?ちょっと興味があるんだけど。 –
http://stackoverflow.com/questions/2584169/what-algorithm-net-use-for-searching-a-pattern-in-a-stringおよび特に受け入れられた回答の下のコメントを参照してください。 –