J'essaie d'optimiser une fonction qui effectue une recherche binaire de chaînes de caractères en JavaScript.
La recherche binaire exige que vous sachiez si la clé est ==
le pivot ou <
le pivot.
Mais cela nécessite deux comparaisons de chaînes de caractères en JavaScript, contrairement à ce qui se passe en C
comme les langues qui ont la 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 soit nécessaire à chaque itération de la recherche binaire ?
12 votes
return str1 < str2 ? -1 : str1 > str2;
?3 votes
@1" Ce n'est pas optimal ; cela nécessite deux comparaisons de chaînes.
3 votes
C'est toujours un ordre de grandeur ( !) plus rapide que
localeCompare()
sur ma machine. @Gumbo's customstrcmp()
peut être plus rapide, en fonction de l'optimisation de l'implémentation interne des comparaisons d'égalité pour les chaînes de caractères.0 votes
@1" Vous avez raison ! J'ai fait un gros benchmark et j'ai remarqué un gros décalage avec
localeCompare
. Voici ce que dit MDN à propos delocaleCompare
: "Lorsque l'on compare un grand nombre de chaînes de caractères, comme pour trier de grands tableaux, il est préférable de créer un objet Intl.Collator et d'utiliser la fonction fournie par sa propriété compare." Malheureusement, cette fonction n'est pas encore implémentée dans Firefox !4 votes
Il faut de toute façon deux comparaisons, une pour voir si a > b une autre pour voir s'ils sont égaux, javascript est TRÈS rapide pour déterminer si des chaînes sont égales, parce que si elles sont égales elles sont un seul et même objet, c'est comme comparer deux pointeurs, les chaînes sont "atomisées", stockées dans une table de hachage, donc pour chaque combinaison de lettres, il n'existe qu'une seule instance.
2 votes
Je recommande de rouvrir cette question, plutôt que de renvoyer à une question sur les
strcmp
même si la réponse à cette question est la même, car je pense que toutes les personnes qui cherchent une réponse à cette question ne connaissent pas l'existence dustrcmp
.0 votes
J'avais besoin qu'il renvoie un entier.
return +(str1 < str2 ? -1 : str1 > str2);
1 votes
@HRJ il n'est pas possible de résoudre les trois résultats possibles (-1,0,1) sans deux comparaisons.