J'essaie d'optimiser une fonction qui effectue une recherche binaire de chaînes en JavaScript.
La recherche binaire nécessite que vous sachiez si la clé est ==
le pivot ou <
le pivot.
Mais cela nécessite deux comparaisons de chaînes en JavaScript, contrairement à C
comme les langages qui ont la fonction strcmp()
qui renvoie trois valeurs (-1, 0, +1)
pour (inférieur à, égal, supérieur à).
Existe-t-il une telle fonction native en JavaScript, qui peut renvoyer une valeur ternaire de sorte qu’une seule comparaison est requise à chaque itération de la recherche binaire?
Vous pouvez utiliser la méthode localeCompare()
.
string_a.localeCompare(string_b);
/* Expected Returns:
0: exact match
-1: string_a < string_b
1: string_a > string_b
*/
Lectures complémentaires:
Eh bien en JavaScript, vous pouvez vérifier que la valeur de deux chaînes est identique à celle des entiers afin que vous puissiez le faire:
"A" < "B"
"A" == "B"
"A" > "B"
Et par conséquent, vous pouvez créer votre propre fonction qui vérifie les chaînes de la même manière que le strcmp()
.
Donc, ce serait la fonction qui fait la même chose:
function strcmp(a, b)
{
return (a<b?-1:(a>b?1:0));
}
Vous pouvez tilisez les opérateurs de comparaison pour comparer les chaînes . Une fonction strcmp
pourrait être définie comme ceci:
function strcmp(a, b) {
if (a.toString() < b.toString()) return -1;
if (a.toString() > b.toString()) return 1;
return 0;
}
Edit Voici une fonction de comparaison de chaînes prenant au plus min {longueur ( a ), longueur ( b )} comparaisons pour indiquer le lien entre deux chaînes:
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;
}