Avantages des arbres binaires de recherche sur les tables de hachage

voix
81

Quels sont les avantages des arbres binaires de recherche sur les tables de hachage?

Les tables de hachage peuvent rechercher tout élément Theta (1) le temps et il est tout aussi facile d'ajouter un élément .... mais je ne suis pas sûr des avantages qui vont dans l'autre sens.

Créé 08/11/2010 à 23:06
source utilisateur
Dans d'autres langues...                            


20 réponses

voix
70

Un « avantage » d'un arbre binaire est qu'il peut être traversé à la liste de tous les éléments dans l'ordre. Ceci est impossible avec une table de hachage, mais n'est pas une opération normale d'une conception dans une structure hachée.

Créé 08/11/2010 à 23:11
source utilisateur

voix
9

Hashtable prendrait plus d' espace quand il est créé - il aura emplacements disponibles pour les éléments qui ne sont pas encore à insérer (ou non ils sont jamais insérés), un arbre de recherche binaire ne sera aussi grande qu'elle doit être. En outre, quand une table de hachage a besoin de plus d' espace, en expansion à une autre structure pourrait prendre beaucoup de temps, mais cela pourrait dépendre de la mise en œuvre.

Créé 08/11/2010 à 23:11
source utilisateur

voix
76

Rappelez-vous que arbres binaires de recherche (base de référence) sont efficaces mémoire. Ils ne réservent plus de mémoire que nécessaire.

Par exemple, si une fonction de hachage a une portée R(h) = 0...100, alors vous devez allouer un tableau d'éléments 100 (pointeurs-à), même si vous êtes seulement 20 éléments de hachage. Si vous deviez utiliser un arbre de recherche binaire pour stocker les mêmes informations, vous n'allouez autant d' espace que vous avez besoin, ainsi que des métadonnées sur les liens.

Créé 08/11/2010 à 23:11
source utilisateur

voix
6

Un arbre binaire est plus lent à rechercher et insérer dans, mais a la très belle caractéristique de la traversal infix ce qui signifie essentiellement que vous pouvez parcourir les nœuds de l'arbre dans un ordre de tri.

Itérer les entrées d'une table de hachage n'a tout simplement pas beaucoup de sens parce qu'ils sont tous dispersés dans la mémoire.

Créé 08/11/2010 à 23:13
source utilisateur

voix
8

Un arbre de recherche binaire peut être mis en œuvre avec une persistante interface, où un nouvel arbre est retourné , mais le vieil arbre continue d'exister. Mis en œuvre avec soin, les anciens et les nouveaux arbres partage la plupart de leurs nœuds. Vous ne pouvez pas faire cela avec une table de hachage standard.

Créé 08/11/2010 à 23:19
source utilisateur

voix
23

Les principaux avantages d'un arbre binaire sur une table de hachage est que l'arbre binaire vous donne deux opérations supplémentaires que vous ne pouvez pas faire (facilement, rapidement) avec une table de hachage

  • trouver l'élément le plus proche (pas nécessairement égale à) une valeur de clé arbitraire (ou le plus haut / bas)

  • itérer à travers le contenu de l'arbre dans l'ordre de tri

Les deux sont reliés - l'arbre binaire conserve son contenu dans un ordre de tri, donc les choses qui nécessitent que l'ordre de tri sont faciles à faire.

Créé 08/11/2010 à 23:25
source utilisateur

voix
14

Un (équilibré) arbre binaire de recherche a aussi l'avantage que sa complexité asymptotique est en fait une limite supérieure, tandis que les temps « constantes » pour les tables de hachage sont fois amorti: Si vous avez une fonction de hachage ne convient pas, vous pourriez finir par dégrader en temps linéaire , plutôt que constante.

Créé 08/11/2010 à 23:29
source utilisateur

voix
1

Si vous voulez accéder aux données d'une manière triée, puis une liste triée doit être maintenue en parallèle à la table de hachage. Un bon exemple est Dictionnaire en .Net. (voir http://msdn.microsoft.com/en-us/library/3fcwy8h6.aspx ).

Cela a pour effet secondaire non seulement des inserts ralentissement, mais il consomme une plus grande quantité de mémoire qu'un b-arbre.

En outre, étant donné qu'un b-arbre est trié, il est simple de trouver des gammes de résultats ou d'effectuer des syndicats ou des fusions.

Créé 08/11/2010 à 23:34
source utilisateur

voix
48

En plus de tous les autres bons commentaires:

Les tables de hachage en général ont un meilleur comportement de cache nécessitant moins de mémoire par rapport à un lectures arbre binaire. Pour une table de hachage vous engager normalement une seule lecture avant d'avoir accès à une référence tenant vos données. L'arbre binaire, si elle est une variante équilibrée, exige quelque chose dans l'ordre de k * lg (n) mémoire lit pour une constante k.

D'autre part, si un ennemi connaît votre fonction de hachage l'ennemi peut appliquer votre table de hachage pour produire des collisions, ce qui entrave considérablement ses performances. La solution est de choisir la fonction de hachage au hasard d'une famille, mais un BST n'a pas cet inconvénient. En outre, lorsque la pression de la table de hachage augmente trop, vous avez souvent tendance à enlargen et réallouer la table de hachage qui peut être une opération coûteuse. Le BST a un comportement plus simple ici et ne tend pas à attribuer tout à coup un grand nombre de données et faire une opération de ressasser.

Les arbres ont tendance à être la structure de données moyen ultime. Ils peuvent agir comme des listes, peut facilement être divisé pour le fonctionnement en parallèle, ont le retrait rapide, insertion et recherche de l'ordre de O (logn) . Ils ne font rien particulièrement bien, mais ils n'ont ni aucun comportement trop mauvais.

Enfin, BSTS sont beaucoup plus faciles à mettre en œuvre dans les langages fonctionnels (pures) par rapport aux tables de hachage et ils ne nécessitent pas de mises à jour destructrices à mettre en œuvre (la persistance ces arguments par Pascal ci - dessus).

Créé 09/11/2010 à 01:01
source utilisateur

voix
-1

principal avantage de la table de hachage est qu'il fait presque toutes les opérations en ~ = O (1). Et il est très facile à comprendre et à mettre en œuvre. Il ne résout beaucoup de problèmes « d'interview » efficacement. Donc, si tu veux casser une entrevue de codage, faire les meilleurs amis avec table de hachage ;-)

Créé 05/04/2011 à 00:45
source utilisateur

voix
4

BSTS aussi les « findPredecessor » et les opérations « findSuccessor » (Pour les prochains petits et grands éléments suivant) O (logn) le temps, ce qui pourrait aussi être des opérations très pratiques. Le tableau hash ne peut pas fournir en temps que l'efficacité.

Créé 20/09/2012 à 18:55
source utilisateur

voix
1

Elle dépend aussi de l'utilisation, Hash permet de localiser correspondance exacte. Si vous souhaitez interroger une plage alors BST est le choix. Supposons que vous avez un grand nombre de données e1, e2, e3 ..... en.

Avec table de hachage vous pouvez localiser tout élément en temps constant.

Si vous voulez trouver des valeurs de portée supérieure à E41 et à moins de E8, BST peut rapidement constater que.

L'essentiel est la fonction de hachage utilisée pour éviter une collision. Bien sûr, nous ne pouvons pas éviter totalement une collision, dans ce cas, nous avons recours à d'autres méthodes ou Enchaînement. Cela rend le temps de récupération ne plus constante dans le pire des cas.

Une fois pleine, table de hachage doit augmenter sa taille de seau et copier tous les éléments à nouveau. Ceci est un coût supplémentaire ne présente plus BST.

Créé 29/01/2013 à 15:54
source utilisateur

voix
94

Un avantage que personne n'a d'autre fait remarquer que l'arbre de recherche binaire vous permet d'effectuer des recherches de portée efficace.

Pour illustrer mon idée, je veux faire un cas extrême. Dites que vous voulez obtenir tous les éléments dont les clés sont entre 0 à 5000. Et en réalité il n'y a qu'un seul élément et 10000 autres éléments dont les clés ne sont pas dans la gamme. BST peut effectuer des recherches de portée très efficace car il ne cherche pas un sous-arbre qui est impossible d'avoir la réponse.

Alors que, comment pouvez-vous faire des recherches dans une gamme table de hachage? Soit vous devez itérer chaque espace de godet, qui est O (n), ou vous devez rechercher si chacun 1,2,3,4 ... jusqu'à 5000 existe. (Quid des clés entre 0 et 5000 sont un ensemble infini? Par exemple les touches peuvent être décimales)

Créé 11/11/2013 à 01:05
source utilisateur

voix
0

Une table de hachage est une structure de données non triées, Lors de la conception d'un téléphone cellulaire, vous voulez garder autant de données que possible pour le stockage de données. Une table de hachage est une structure de données non ordonnée - ce qui signifie qu'il ne conserve pas ses éléments dans un ordre particulier. Donc, si vous utilisez une table de hachage pour un carnet d'adresses de téléphone cellulaire, alors vous avez besoin de mémoire supplémentaire pour trier les valeurs parce que vous avez certainement besoin d'afficher les valeurs dans l'ordre alphabétique - c'est un carnet d'adresses après tout. Ainsi, à l'aide d'une table de hachage vous devez mettre de côté la mémoire pour trier les éléments qui auraient autrement être utilisé comme espace de stockage. Mais arbre de recherche binaire est une donnée structure.Because un arbre triées de recherche binaire est déjà triée, il n'y aura pas besoin de perdre le tri des enregistrements mémoire ou temps de traitement dans un téléphone cellulaire. Comme nous l'avons mentionné plus tôt, faire une recherche ou un insert sur un arbre binaire est plus lent que de le faire avec une table de hachage, mais un carnet d'adresses du téléphone cellulaire aura presque jamais plus de 5000 entrées. Avec un si petit nombre d'entrées, un arbre de recherche binaire O (log (n)) sera certainement assez vite. Donc, compte tenu de toutes ces informations, un arbre de recherche binaire est la structure de données que vous devez utiliser dans ce scénario, car il est un meilleur choix qu'une table de hachage.

Créé 26/12/2013 à 17:40
source utilisateur

voix
0

Les tables de hachage ne sont pas bonnes pour l'indexation. Lorsque vous êtes à la recherche d'une gamme, BSTS sont mieux. C'est la raison pour laquelle la plupart des indices de base de données utilisent des arbres B + au lieu des tables de hachage

Créé 05/04/2015 à 17:34
source utilisateur

voix
4

De Cracking l'entrevue de codage, 6e édition

Nous pouvons mettre en œuvre la table de hachage avec un arbre binaire équilibré (BST). Cela nous donne une O (log n) lookup temps. L'avantage de ce potentiel est en utilisant moins d'espace, puisque nous n'allouons un large éventail. Nous pouvons également itérer les touches dans l'ordre, ce qui peut parfois être utile.

Créé 29/05/2016 à 18:47
source utilisateur

voix
-1

Les classes HashSet et table sont des collections non ordonnées. Il est pas évident de l'interface (et pourrait en être autrement) , mais les tables de hachage ont été mis en œuvre à l' aide AVL arbres. Cela signifie que le code de hachage ne diminue pas le modulo d'un tableau (moins de collisions) et cela signifie aussi qu'il n'y a pas ressasser d'un tableau à faire (lisse performance). Le fait qu'ils sont des collections non ordonnées signifie que vous fournissez seulement une fonction égale et une fonction hashCode - pas un comparateur plein pour les arbres. Donc , si vous utilisez une table de hachage table <K, T> ou un arbre binaire arbre <K, T> dépend de la classe K - que ce soit tout à fait comparable ou seulement comparable l' égalité.

Il y a des occasions où le type de données est à la fois comparables et de l'égalité comparable - comme String. Cela signifie que HashSet <String> et Set <String> sont à la fois possible. Recherches sur un ensemble de hachage de chaînes ont tendance à être environ 10 fois plus rapide que les recherches sur un ensemble ordonné de chaînes. Si le comparateur est cher alors des arbres ralentissent par rapport à Hashtables. Si le comparateur est rapide, (comme pour les entiers et les flotteurs) puis arbres courir plus vite que les tables de hachage.

Créé 19/08/2017 à 03:24
source utilisateur

voix
0

Un hashmap est un tableau associatif ensemble. Ainsi, votre tableau de valeurs d'entrée se mis en commun dans des seaux. Dans un système ouvert d'adressage, vous avez un pointeur sur un seau, et chaque fois que vous ajoutez une nouvelle valeur dans un seau, vous trouvez où dans le seau il y a des espaces libres. Il y a quelques façons de le faire this- commencer au début du seau et incrémenter le pointeur à chaque fois et vérifier si son occupation. Ce sondage est appelé linéaire. Ensuite, vous pouvez faire une recherche binaire comme ajouter, où vous double la différence entre le début du seau et où vous doublez vers le haut ou vers le bas chaque fois que vous êtes à la recherche d'un espace libre. On appelle cela du second degré de sondage. D'ACCORD. Maintenant, les problèmes dans ces deux méthodes est que si le seau déborde dans les prochains seaux répondre, alors vous avez besoin To-

  1. Double chaque taille- seaux malloc (godets N) / changer le hachage Fonction- Temps requis: dépend de la mise en œuvre de malloc
  2. Transfert / copie chacune des données Seaux antérieures dans les nouvelles données de seaux. Ceci est une opération O (N) où N représente l'ensemble de données

D'ACCORD. mais si vous utilisez un chaînée il ne devrait pas être un problème non? Oui, dans les listes chaînées vous n'avez pas ce problème. Compte tenu de chaque seau pour commencer par une liste chaînée, et si vous avez 100 éléments dans un seau, il vous oblige à traverser ces 100 éléments pour atteindre la fin de la liste chaînée d'où l'List.add (élément E) prendra du temps To-

  1. Hash l'élément à un bucket- normal comme dans toutes les implémentations
  2. Prenez le temps de trouver le dernier élément de ladite opération bucket- O (N).

L'avantage de la mise en œuvre de chaînée est que vous n'avez pas besoin de l'opération d'allocation de mémoire et O (N) transfert / copie de tous les seaux comme dans le cas de la mise en œuvre ouverte d'adressage.

Ainsi, la façon de minimiser l'opération O (N) est de convertir la mise en œuvre à celle d'un binaire Recherche Arbre où les opérations de recherche sont O (log (N)) et que vous ajoutez l'élément dans sa position en fonction de sa valeur. La caractéristique supplémentaire d'un BST est qu'il vient triée!

Créé 20/08/2017 à 23:24
source utilisateur

voix
0

arbres binaires sont bon choix pour mettre en œuvre le dictionnaire si les clés ont un peu d'ordre au total (les clés sont comparables) définies sur eux et que vous voulez conserver les informations de commande.

Comme BST préserve les informations de commande, il vous offre quatre opérations de commutation dynamiques qui ne peuvent pas être effectuées (efficacement) en utilisant des tables de hachage. Ces opérations sont les suivantes:

  1. Maximum
  2. Le minimum
  3. Successeur
  4. Prédécesseur

Toutes ces opérations comme toutes les opérations de BST ont une complexité temporelle de O (H). De plus, toutes les clés stockées restent classés dans le BST vous permettant ainsi d'obtenir la séquence triée des clés juste en traversant l'arbre dans l'ordre.

En résumé, si vous voulez simplement opérations insérer, supprimer et supprimer ensuite la table de hachage est imbattable (la plupart du temps) dans l'exécution. Mais si vous voulez une partie ou toutes les opérations énumérées ci-dessus, vous devez utiliser un BST, de préférence un BST auto-équilibrage.

Créé 19/05/2018 à 16:46
source utilisateur

voix
0

arbres binaires de recherche peuvent être plus rapides quand il est utilisé avec les touches de chaîne. Surtout quand les chaînes sont longues.

arbres binaires de recherche utilisant des comparaisons moins / plus qui sont rapides pour les chaînes (quand ils ne sont pas égaux). Ainsi, un BST peut répondre rapidement lorsqu'une chaîne est introuvable. Quand il a trouvé qu'il devra faire une seule comparaison complète.

Dans une table de hachage. Vous devez calculer le hachage de la chaîne et cela signifie que vous devez passer par tous les octets au moins une fois pour calculer le hachage. Là encore, lorsqu'une entrée correspondante est trouvée.

Créé 13/10/2018 à 11:32
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more