str1 が str2 のプレフィックスかどうかを判断する簡単な関数を書き留めました。これは非常に単純な関数で、(JS では) 次のようになります。
function isPrefix(str1, str2) // determine if str1 is a prefix of a candidate string
{
if(str2.length < str1.length) // candidate string can't be smaller than prefix string
return false;
var i = 0;
while(str1.charAt(i) == str2.charAt(i) && i <= str1.length)
i++;
if(i < str1.length) // i terminated => str 1 is smaller than str 2
return false;
return true;
}
ご覧のとおり、プレフィックス文字列の全長をループして、候補文字列のプレフィックスであるかどうかを判断します。これは、複雑さが O(N) であることを意味します。これは悪くありませんが、プレフィックス文字列がプレフィックスの一部として含まれる文字列を決定するためにループを検討する巨大なデータ セットがある場合、これは問題になります。これにより、複雑さが O(M*N) のように倍増します。ここで、M は特定のデータ セット内の文字列の総数です。良くない。
私はインターネットを少し調べて、最良の答えはパトリシア/基数のトライであると判断しました。文字列がプレフィックスとして格納される場所。それでも、文字列を挿入/検索しようとすると、前述のプレフィックスゲージ機能を使用すると、文字列の照合にかなりのオーバーヘッドが発生します。
プレフィックス文字列「rom」と候補単語のセットがあるとします
var dataset =["random","rapid","romance","romania","rome","rose"];
基数トライでこれが欲しい:
r
/ \
a o
/ \ / \
ndom pid se m
/ \
an e
/ \
ia ce
これは、すべてのノードに対して、プレフィックス一致関数を使用して、インデックスのプレフィックス文字列に一致する値を持つノードを特定することを意味します。どういうわけか、この解決策はまだ難しいようで、私にはあまりうまくいきません。もっと良いものはありますか、とにかくコアプレフィックスマッチング機能を改善できますか?