私はJavaScriptで文字列をバイナリ検索する関数を最適化しようとしています。
バイナリ検索では、キーがピボットの==
かピボットの<
かを知る必要があります。
しかし、JavaScriptでは2つの文字列比較が必要です。これは、3つの値(-1, 0, +1)
を返す(より小さい、等しい、より大きい)strcmp()
関数を持つC
のような言語とは異なります。
JavaScriptには、バイナリ検索を繰り返すたびに1回の比較しか必要としないように3進値を返すことができるネイティブ関数がありますか。
localeCompare()
メソッドを使うことができます。
string_a.localeCompare(string_b);
/* Expected Returns:
0: exact match
-1: string_a < string_b
1: string_a > string_b
*/
参考文献:
JavaScriptでは、整数と同じ値の2つの文字列をチェックできるので、これを実行できます。
"A" < "B"
"A" == "B"
"A" > "B"
したがって、strcmp()
と同じ方法で文字列をチェックする独自の関数を作成できます。
だからこれは同じことをする関数になるでしょう:
function strcmp(a, b)
{
return (a<b?-1:(a>b?1:0));
}
比較演算子を使用して文字列を比較できます 。 strcmp
関数は次のように定義できます。
function strcmp(a, b) {
if (a.toString() < b.toString()) return -1;
if (a.toString() > b.toString()) return 1;
return 0;
}
編集 これは、2つの文字列が互いにどのように関連しているかを示すために、最大{min(length/a)、length(b)}の比較を行う文字列比較関数です。
function strcmp(a, b) {
a = a.toString(), b = b.toString();
for (var i=0,n=Math.max(a.length, b.length); i<n && a.charAt(i) === b.charAt(i); ++i);
if (i === n) return 0;
return a.charAt(i) > b.charAt(i) ? -1 : 1;
}