web-dev-qa-db-fra.com

Tables de hachage VS tableaux associatifs

Récemment, j'ai lu des tables de hachage dans un livre très célèbre " Introduction to Algorithms ". Je ne les ai pas encore utilisés dans de vraies applications, mais je le veux. Mais je ne sais pas par où commencer.
Quelqu'un peut-il me donner quelques exemples de son utilisation, par exemple, comment réaliser une application de dictionnaire (comme ABBYY Lingvo) en utilisant des tables de hachage?
Et enfin je voudrais savoir quelle est la différence entre les tables de hachage et les tableaux associatifs en PHP, je veux dire quelle technologie dois-je utiliser et dans quelles situations?
Si je me trompe (je vous demande pardon) veuillez me corriger, car en fait je commence avec des tables de hachage et je n'ai que des connaissances de base (théoriques) à leur sujet.
Merci beaucoup.

79
Bakhtiyor

En PHP, les tableaux associatifs sont implémentés sous forme de tables de hachage, avec un peu de fonctionnalités supplémentaires.

Cependant, techniquement parlant, un tableau associatif n'est pas identique à une table de hachage - il est simplement implémenté en partie avec une table de hachage en arrière-plan. Parce que la plupart de son implémentation est une table de hachage, il peut faire tout ce qu'une table de hachage peut faire - mais il peut aussi faire plus.

Par exemple, vous pouvez parcourir un tableau associatif en utilisant une boucle for, ce que vous ne pouvez pas faire avec une table de hachage.

Donc, bien qu'ils soient similaires, un tableau associatif peut réellement faire sur-ensemble de ce qu'une table de hachage peut faire - donc ce n'est pas exactement la même chose. Considérez-le comme des tables de hachage et des fonctionnalités supplémentaires.

Exemples de code:

tilisation d'un tableau associatif comme table de hachage:

$favoriteColor = array();
$favoriteColor['bob']='blue';
$favoriteColor['Peter']='red';
$favoriteColor['Sally']='pink';
echo 'bob likes: '.$favoriteColor['bob']."\n";
echo 'Sally likes: '.$favoriteColor['Sally']."\n";
//output: bob likes blue
//        Sally likes pink

Boucle à travers un tableau associatif:

$idTable=array();
$idTable['Tyler']=1;
$idTable['Bill']=20;
$idTable['Marc']=4;
//up until here, we're using the array as a hashtable.

//now we loop through the array - you can't do this with a hashtable:
foreach($idTable as $person=>$id)
    echo 'id: '.$id.' | person: '.$person."\n";

//output: id: 1 | person: Tyler
//        id: 20 | person: Bill
//        id: 4 | person: Marc

Notez surtout comment dans le deuxième exemple, l'ordre de chaque élément est maintenu (Tyler, Bill Marc) en fonction de l'ordre dans lequel ils ont été entrés dans le tableau. Il s'agit d'une différence majeure entre les tableaux associatifs et les tables de hachage. Une table de hachage ne maintient aucune connexion entre les éléments qu'elle contient, contrairement à un PHP tableau associatif le fait (vous pouvez même trier un PHP tableau associatif).

118
Cam

les tableaux php SONT essentiellement des tables de hachage

21
Sergey Eremin

La différence entre un tableau associatif et une table de hachage est qu'un tableau associatif est un type de données, tandis qu'une table de hachage est une implémentation de données. Évidemment, le type de tableau associatif est très important dans de nombreux langages de programmation actuels: Perl, Python, PHP, etc. Une table de hachage est le principal moyen d'implémenter un tableau associatif, mais pas tout à fait la seule. Et les tableaux associatifs sont l'utilisation principale des tables de hachage, mais pas tout à fait la seule utilisation. Ce n'est donc pas qu'ils sont les mêmes, mais si vous avez déjà des tableaux associatifs, vous ne devriez généralement pas vous soucier de la différence.

Pour des raisons de performances, il peut être important de savoir que vos tableaux associatifs dans votre langue préférée sont implémentés comme des hachages. Et il peut être important d'avoir une idée des frais généraux de cette mise en œuvre. Les tables de hachage sont plus lentes et utilisent plus de mémoire que les tableaux linéaires comme vous les voyez en C.

Perl regroupe les deux concepts ensemble en appelant les tableaux associatifs "hachages". Comme un certain nombre de fonctionnalités de Perl, ce n'est pas tout à fait faux, mais c'est bâclé.

17
Greg Kuperberg

Un tableau en PHP est en fait une carte ordonnée, pas une table de hachage. La principale différence entre la carte et la table de hachage consiste en l'impossibilité de se souvenir de l'ordre dans lequel les éléments ont été ajoutés. En revanche, les tables de hachage sont beaucoup La complexité de la récupération d'un élément à partir de la carte est O(nlogn) et à partir de la table de hachage est O (1).

8
WoZ

Un tableau associatif est un tableau où vous n'accédez pas aux éléments par un index, mais par une clé. La façon dont cela fonctionne en interne est spécifique à l'implémentation (il n'y a pas de règle sur la façon dont cela doit fonctionner). Un tableau associatif pourrait être implémenté par une table de hachage (la plupart des implémentations le feront), mais il pourrait également être implémenté par une sorte d'arborescence ou une liste de sauts ou l'algorithme ne fait qu'itérer sur tous les éléments du tableau et recherche une clé qui correspond (ce serait terriblement lent, mais cela fonctionne).

Une table de hachage est un moyen de stocker des données où les valeurs sont associées aux clés et où vous avez l'intention de trouver des valeurs pour les clés dans un temps (généralement presque) constant. Cela ressemble exactement à ce que vous attendez d'un tableau associatif, c'est pourquoi la plupart du temps des tables de hachage sont utilisées pour implémenter ces tableaux, mais ce n'est pas obligatoire.

2
Mecki