Conception d'une table de hachage
J'ai été demandé à cette question dans une Interview et a été laissé perplexe, même si je suis venu avec une réponse je ne me sentais pas à l'aise avec ma solution. Je voulais voir comment les experts ici sentez au sujet de cette question.
Je suis exactement citant la question comme il est sorti de l'Interviewer. "La conception d'une table de Hachage, Vous pouvez utiliser n'importe quelle structure de données, vous pouvez vous souhaitez. Je voudrais voir comment mettre en œuvre le O(1) pour le temps". Enfin, il a dit qu'Il est plus comme la simulation d'une table de Hachage via une autre structure de Données.
Quelqu'un peut léger-moi pour plus d'informations sur cette question. Merci!
PS: la raison Principale pour moi de mettre cette question est de savoir comment un expert concepteur de commencer avec la Conception de ce problème && encore une chose que j'ai effacé l'interview en quelque sorte, sur la base des autres questions qui ont été posées, mais cette question a été dans mon esprit et je voulais trouver la réponse!
Vous devez nous donner votre réponse, au moins jusqu'au point où vous vous sentez vous étiez perdu. Il n'est pas gênant de dire "et c'est autant que je sache". Commencer par décrire ce qu'est une table de hachage est.
Il me fait me demander si la question s'est posée parce que l'OP revendiquée tables de hachage ont toujours O(1) recherche de temps.
Kiers,@delnan,@Blindy j'ai dit que je ne savais pas comment procéder, après j'ai foiré la liste Liée approche!!
vous n'avez pas mentionné quelque chose à propos de votre tentative d'autre que "je ne me sentais pas à l'aise avec ma solution".
OriginalL'auteur | 2011-03-23
Vous devez vous connecter pour publier un commentaire.
Il est assez souvent question d'entrevue qui vous montre à comprendre les concepts sous-jacents être utile Java structures de données, comme HashSets et HashMaps.
Vous utilisez un tableau de listes, ceux-ci sont normalement appelées seaux. Vous démarrez votre table de hachage avec une capacité donnée n ce qui signifie que vous avez un tableau de 10 listes (ensemble vide).
Pour ajouter un objet à votre hastable vous appelez les objets
hashCode
fonction qui vous donne un int (un nombre dans un assez grand éventail). Donc, vous avez alors à modulo le hashCode wrt pour n pour vous donner le seau dans lequel il vit. Ajouter l'objet à la fin de la liste dans ce seau.Pour trouver un objet que vous utilisez à nouveau le hashCode et de la fonction mod pour trouver le seau et puis besoin de parcourir la liste à l'aide de
.equals()
pour trouver le bon objet.Que le tableau devient plus complète, vous permettra de faire plus et plus linéaire de la recherche, de sorte que vous aurez éventuellement besoin de re-hachage. Cela signifie la construction d'un tout nouveau, les grandes tables et de mettre les objets à nouveau.
Au lieu d'utiliser une Liste dans chaque position de tableau vous pouvez recalulate un autre seau position si celui que vous voulez est pleine, une méthode commune est quadratique de sondage. Cela a l'avantage de ne pas besoin de structures de données dynamiques comme des listes, mais c'est plus compliqué.
Encore une question: comment savez-vous que nous parlons de Java?
OriginalL'auteur brain
Vous avez besoin d'un tableau de listes, ou des "compartiments" pour vos valeurs. Ensuite, vous utilisez une fonction de hachage pour déterminer l'élément de tableau de regarder dans, et enfin faire une recherche linéaire dans les éléments de la liste.
Vous avez constante recherche de la matrice de localisation, et de la recherche linéaire des valeurs de hachage dans la petite liste.
Il existe d'autres approches (Disponible du
dict
mise en œuvre, par exemple, qui se déplace sur un autre emplacement dans la matrice par un motif fixe), mais celui-ci est agréable et simple.Vous êtes les bienvenus
OriginalL'auteur Winger
Si j'aurais été à votre place, j'aurais fait la suivante:
OriginalL'auteur Anand Patel
Utiliser un tableau => O(1)
Donc, si vous voulez utiliser une fonction de hachage pour activer votre clé à un numéro, puis utiliser ce numéro comme un index dans un tableau pour récupérer la valeur.
Ces derniers se perdre. C'est le prix à payer pour O(1)
C'est une façon d'aller à ce sujet. Mais une structure de données que de façon aléatoire données sur les rejets j'ai insérer ne semble pas très utile pour moi.
Dans un scénario où le code de hachage de l'objet premier se révèle être de 30 000 cette approche permettrait de déchets quantité importante de mémoire.
OriginalL'auteur fxtentacle
Considérer l'Univers U (par exemple, tous les possibles de l'adresse IP, ou de tous les noms possibles, ou tout du possible, les numéros de téléphone mobile ou de tous les possibles échecs de configuration de la carte). Vous avez peut-être remarqué que l'univers U est très grand.
Ensemble S est de taille raisonnable S⊆ U. Alors, cet ensemble S est de taille raisonnable, comme vous gardant le numéro de téléphone de vos amis.
La sélection de la structure des données pour la mise en œuvre
Sans la structure des données, nous n'obtiendrons pas la bonne solution. Nous pourrions utiliser un tableau rapide de l'insertion, la suppression et la recherche, mais il ne prend beaucoup de place,comme la taille de l'univers est très grand. Aussi, votre ami nom doit être un entier et l'espace requis est proportionnel à l'univers.
D'autre part, nous pourrions utiliser une liste chaînée. Cela ne ferait que prendre le plus d'espace qu'il y a des objets c'est à dire Ensemble S, mais les 3 opérations ne seraient pas en O(1). Pour résoudre ce problème, nous pouvons utiliser les deux.
Donc, la solution est d'utiliser le meilleur des deux mondes, c'est à dire la recherche rapide de tableaux et de stockage de petite taille comme la liste de liens.
Mais, ces monde réel entités doit être changé en entier, par quelque chose qui s'appelle la fonction de hash, de sorte qu'ils peuvent être utilisés comme index de tableau. Donc, supposons que vous souhaitez enregistrer le nom de votre ami d'alice, il suffit de convertir son nom en entier
L'insertion d'alice:
int k = hashFunc(alice);
arr[k] = Alice //this takes O(1) time
De recherche pour alice:
int k = hashFunc(alice);
string name = arr[k] ;
print name;//prints alice
Bien-sûr il n'est pas si simple, mais c'est ce que je peux l'expliquer maintenant. S'il vous plaît laissez-moi savoir où je ne suis pas clair.Merci. Pour plus d'informations sur la table de hachage de consulter ici
OriginalL'auteur kinshuk4
Une table de hachage fournit un moyen d'insérer et d'extraire des données de manière efficace (généralement en constante/O(1)). Pour cela, nous utilisons un très grand tableau pour enregistrer la cible des valeurs et une fonction de hachage qui généralement les cartes de la cible de valeurs, dans des valeurs de hachage qui n'est rien d'autre que de la validité des indices dans ce grand tableau. Une fonction de hachage parfaite hache une des valeurs stockées dans une clé unique (ou l'index dans le tableau) est connu comme un parfait fonction de hachage. Mais, dans la pratique de stocker ces valeurs pour lesquelles il n'existe aucun moyen d'obtenir unique des valeurs de hachage (indices dans le tableau), nous avons l'habitude d'utiliser une fonction de hachage qui peut correspondre chaque valeur d'indice particulier de sorte que la collision peut être maintenu à un minimum. Ici collision signifie que deux ou plusieurs éléments à être stockées dans la table de hachage carte de la même valeur de hachage.
Maintenant les questions originales, qui est:
"La conception d'une table de Hachage, Vous pouvez utiliser n'importe quelle structure de données, vous pouvez vous souhaitez. Je voudrais voir comment mettre en œuvre le O(1) pour le temps". Enfin, il a dit qu'Il est plus comme la simulation d'une table de Hachage via une autre structure de Données."
Recherche est possible dans exactement O(1) fois, dans des cas, on peut concevoir une fonction de hachage parfait. Les données sous-jacentes de la structure est encore un tableau. Mais cela dépend du stockage de valeurs, si l'on peut concevoir une fonction de hachage parfait ou pas. Par exemple, considérons les chaînes à l'alphabet anglais. Depuis, il n'existe pas de fonction de hachage qui peut correspondre chaque anglais valide mot de un unique int (32 bits) (ou long long int 64 bits), donc il y aura toujours certaines collisions. Pour faire face en cas de collision, nous pouvons utiliser des chaînage de méthode de collision de la manipulation dans laquelle chaque table de hachage fente stocke un pointeur vers la liste liée, qui stocke en fait tous les éléments de hachage à cette machine à sous particulière ou d'un index. Par exemple, considérons une fonction de hachage qui considère chaque alphabet anglais de la chaîne comme un certain nombre sur la base de 26 (parce qu'il y a 26 caractères dans l'alphabet anglais), Ce qui peut être codé comme:
Où taille_table est bien choisi le premier numéro vient de de plus que le nombre total de dictionnaire anglais mots destinés à être stockés dans la table de hachage.
Voici les résultats avec un dictionnaire de taille 144554, et le tableau de taille = 144563:
[Articles de la cartographie à la même cellule --> Nombre de slots dans la table de hachage ] =======>
Dans ce cas de rechercher les éléments qui ont été associées à des cellules contenant un seul élément, la recherche sera O(1), mais dans ce cas elle correspond à une cellule qui a plus de 1 éléments, alors que nous avons à parcourir cette liste, qui peut contenir de 2 à 7 nœuds et alors nous serons en mesure de trouver cet élément. Donc ce n'est pas constant dans ce cas.
De sorte qu'il dépend de la disponibilité de la fonction de hachage parfait seulement, si nous la recherche peut être effectuée en O(1) contrainte. Sinon, il ne sera pas exactement O(1) mais très proche de lui.
OriginalL'auteur js2016