Les Objets JavaScript Hachages? C'est la complexité plus grande que O(1)?
Pour certains algorithme que j'écrivais récemment, j'ai pensé qu'un hash serait excellent. J'ai pensé que je pourrais probablement juste utiliser les variables dans un objet sous forme de paires clé-valeur. Je ne sais pas si c'est optimal puisque je ne sais pas vraiment ce qui se passe derrière les coulisses. Je suppose que la V8 est-il différent de celui des autres environnements. Je n'ai toutefois imaginer que la recherche de variables de membre serait assez rapide (je l'espère)?
Que tout est dit, je me demande si le temps d'exécution de la complexité de l'écriture, la lecture, la création et la suppression des variables de membre dans les objets JavaScript sont tous O(1). Si il y a des différences dans l'environnement (v8 vs d'autres) que sont-ils?
- Si vous voulez la recherche de votre objet par un certain domaine, pourquoi s'en faire à propos de l'ajout et de la suppression? L'ID n'est pas censé changer après l'instanciation de l'objet.
- Je suppose que l'ajout et la suppression n'est pas aussi grande affaire. Je ne vois pas de cas d'utilisation pour plus de quelques millions de paires, et même qui est le plus susceptible de ridicule pour ce cas d'utilisation en particulier. Puis de nouveau, les gens peuvent vouloir utiliser cette fonction pour d'autres choses. Je voudrais donner quelques indications.
- "utiliser les variables dans un objet en tant que paires clé-valeur" - C'est à peu près ce que les membres de "variables" sont, n'est-ce pas?
- eh bien, je n'ai pas forcément vu de garanties apportées sur les performances. Ils sont des paires clé-valeur, mais vous pouvez dire que sur n'importe quelle variable dans n'importe quelle langue.
- "Ils sont des paires clé-valeur, mais vous pouvez dire que sur n'importe quelle variable dans n'importe quelle langue" - Non, vous ne pouvez pas: dans la plupart des langues chaînes de caractères, les nombres et les booléens sont des valeurs sans les touches associées. Mon point était qu'un JS objet de la mission est de maintenir une collection de paires clé/valeur (où la valeur peut être une référence à une fonction ou d'un autre objet). Je constate que ce n'est pas vous aider avec votre question à propos de la performance.
Vous devez vous connecter pour publier un commentaire.
Oui, ils sont les tables de hachage. La mise en œuvre est différente dans les navigateurs. Malgré de nombreux articles qui prétendent que les objets ne sont pas des hachages de très bien se comporter comme de la cendre, et par conséquent peut être utilisé en tant que tel.
J'ai eu à le prouver par l'exécution de tests de performance:
La façon de lire ces tests est que si il n'y a pas de différence de performances de l'ops/sec lorsque la taille de l'objet augmente, alors cela signifie que les objets sont les tables de hachage. La définition des caractéristiques d'une table de hachage est que la complexité de chaque opération est de O(1), indépendamment du fait qu'il soit plus rapide ou plus lent en comparaison à d'autres opérations.
Tests:
http://jsperf.com/objectsashashes/2 (100 clés)
http://jsperf.com/objectsashashes/3 (100k touches)
http://jsperf.com/objectsashashes/ (1 million de touches)
http://jsperf.com/objects-as-hashes-300-mil (10m touches)
Remarque: Chaque navigateur est plus rapide/lent à différentes opérations. Cela semble avoir changé entre les versions et d'une année à l'autre.
n
est pas défini. Vous avez spécifié un mondial, mais jsPerf a enveloppé le code dans une fonction. Donc la fonction (si on l'appelle) est de lancer une erreur qui semble être ignoré par jsPerf.Des objets JavaScript sont les tables de hachage. Je ne peut imaginer sane mise en œuvre qui ne serait pas fournir constante de temps des opérations CRUD sur les propriétés de l'objet.
Voyez-vous des problèmes de performances spécifiques à cette approche?
dict
en python). Dans le cas où les clés sont à venir à partir de douteuses en entrée, il faut vraiment donner devthought.com/2012/01/18/an-object-is-not-a-hash à lire.