7
votes

Quel est le meilleur algorithme de recherche auto-suggus pour JavaScript

dire que j'ai un objet:

var names = ["john", "jane", "al", "mary", "zane" ... 1000+ Names]


7 commentaires

Je commencerais en investissant la mémoire en haut pour les trier, vous pouvez commencer à les casser avec tranche et une recherche binaire. Gardez le montant potentiel si des données pour rechercher aussi bas que possible. (Bien que je ne sois pas sûr pourquoi vous avez plus de 1000 noms dans un tableau JavaScript ...)


Il existe diverses significations de «efficace»: la mémoire efficace, le temps efficace. Que préféreriez-vous?


Temps efficace. La vitesse est de la plus haute importance pour ma demande.


Si ce n'est que 1000 ou deux noms, la recherche linéaire fonctionne-t-elle si mal?


D'ACCORD. Stipulons c'est 5000. Qu'est-ce que je suis après la recherche efficace d'un objet important.


En fait, vous pouvez trier et utiliser une recherche binaire aussi pour accéder rapidement au premier élément, puis la recherche linéaire à partir de là. Mais faire un profilage est un bon point, afin de ne pas optimiser inutilement.


Si vous obtenez les données du serveur, pourquoi ne le triez-vous pas sur le côté serveur? Et puis comme @mellamokb suggéra, effectuez une recherche binaire.


5 Réponses :


0
votes

Vous pouvez utiliser l'autocomplete du cadre de l'interface utilisateur JQuery. Vous trouverez la documentation ici .
Il vous évitera de refaire la roue ...


1 commentaires

JQuery n'est pas la solution ici. C'est une petite application qui n'a pas besoin d'une bibliothèque JS complète. De plus, je veux apprendre à apprendre à résoudre le problème.



9
votes

Un trie serait une bonne solution. Votre ensemble de données ressemblerait à ceci comme suit:

{"j":
    {"a":
        ["jacob", "jane", ..],
    {"o":
        ["john", "joesph", ..],
    ..
};


3 commentaires

Je me demande s'il existe une différence de performance pour indexer les tableaux par char ou que chaque nœud trie soit un tableau statique (27) que vous accédez ensuite à l'index des lettres. Ce serait un test intéressant, ma pensée est qu'une matrice déclarée comme [] pourrait être traitée comme une table de hachage, auquel cas vous auriez beaucoup de tête ici. intéressant à la référence


Votre structure n'est pas correcte. Actuellement, vous avez une erreur de syntaxe. Il devrait être: {"J": {"A": ["Jacob", "Jane", ..], {"O": ["John", "Joesph", .. }; (notez les crochets pointus, vous souhaitez un objet, pas un tableau).


@JESSE, tous les tableaux sont traités comme des tables de hachage par la spécification de langue (les indices de tableau sont convertis en chaînes). Cependant, certains navigateurs optimisent la mise en oeuvre de tableaux dans le code natif sous-jacent, mais dans ce cas, soit [] ou tableau (...) sera traité comme un "tableau ".



1
votes

Je pense qu'une trie est un moyen naturel de penser à faire de l'auto-suggère d'une grande piscine - ce que vous avez à faire est une recherche de préfixe et essaie Excel à cela. Cela dit, je ne suis vraiment pas sûr de la manière dont la mise en œuvre sous-jacente des tableaux travaille dans JavaScript, vous devez donc l'informer et voir à quel point une trie devient efficace. C'est-à-dire qu'il y a probablement un nombre n inférieur auquel il est plus logique de faire de la recherche linéaire par rapport à une trie. Pour plus tôt que chaque navigateur utilise un moteur JS différent, l'efficacité de cela va probablement différer.

Cela dit, voici une implémentation trie en JS: http: / /notdennisbyrne.blogspot.com/2008/12/javascript-trie-Implementat.html

Si les matrices JS fonctionnent la façon dont je pense qu'ils pourraient (c'est-à-dire que des tables de hachage de fantaisie, ce qui signifie même que le triende [10] finira par être une recherche de table de hachage), une autre option simple à prendre en compte est de stocker chaque préfixe d'un mot dans un tableau. par exemple. Pour le nom john , vous inséreriez j jo joh john dans un tableau , cela vous donnerait une recherche de temps constante mais bien sûr, utilisez beaucoup de mémoire.


0 commentaires

1
votes

Pourquoi ne triez-vous pas le tableau à l'aide de Array.sort () puis effectuez une recherche binaire de la même manière?

Voici un code démontrant une recherche binaire dans JS.

http: // www .nczonline.net / Blog / 2009/09/01 / Computer-Science-in-JavaScript-Binary-Search /

Vérifiez également les commentaires sur la page, il a une implémentation plus efficace de la recherche binaire


1 commentaires

Je pense que cela fonctionnerait bien pour les recherches exactes, mais si vous voulez suggérer des chaînes plutôt que de les rechercher, je ne suis pas sûr de la manière dont cela sera utile.



0
votes

Si vous aimez trouver Jan à John que de regarder les fonctions PHP Soundex et Métaphone. Cette fonction convertit une chaîne dans une chaîne phonétique. Chez http://php.net sont quelques exemples que vous pouvez facilement convertir en JS. Vous êtes heureux - L'anglais n'a pas de caractères spéciaux.

Fabriquez une deuxième matrice avec cette égalisation phonétique et ajoutez un pointeur à l'élément source. Vous devez multiplier le deuxième tableau. https://stackoverflow.com/a/9374631/817152

Traduire aussi le mot de recherche.

Utilisez ensuite l'algorithme de recherche d'intervalle pour être rapide. https://stackoverflow.com/a/16371484/817152

N'abandonnez pas.


0 commentaires