« Tableau associatif » : différence entre les versions
m Ajout rapide de {{portail}} : + informatique théorique ; avec BandeauxPortails |
|||
(31 versions intermédiaires par 22 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
En [[informatique]], un '''tableau associatif''' (aussi appelé '''dictionnaire''' ou '''table d'association''') est un [[type abstrait|type de données]] associant à un ensemble de ''clefs'', un ensemble correspondant de ''valeurs''. Chaque clef est associée à une seule valeur (au plus) : un tableau associatif correspond donc à une [[application (mathématiques)|application]] de domaine fini en mathématiques. |
|||
{{Sources|date=décembre 2013}} |
|||
En [[informatique]], un '''tableau associatif''' (aussi appelé '''dictionnaire''' ou '''table d'association''') est un [[type abstrait|type de données]] associant à un ensemble de clefs un ensemble correspondant de valeurs. Chaque clef est associée à une valeur : un tableau associatif correspond donc à une [[injection (mathématiques)|injection]] (ou fonction injective) en mathématiques. |
|||
Du point de vue du programmeur, le tableau associatif peut être vu comme une généralisation du [[tableau (structure de données)|tableau]] : alors que le tableau traditionnel associe des entiers consécutifs à des valeurs |
Du point de vue du programmeur, le tableau associatif peut être vu comme une généralisation du [[tableau (structure de données)|tableau]] : alors que le tableau traditionnel associe des entiers consécutifs à des valeurs, le tableau associatif associe des clefs d'un type ''arbitraire'' à des valeurs d'un autre type. |
||
Les opérations usuellement fournies par un tableau associatif sont : |
Les opérations usuellement fournies par un tableau associatif sont : |
||
Ligne 10 : | Ligne 9 : | ||
* '''recherche''' : détermination de la valeur associée à une clef, si elle existe. |
* '''recherche''' : détermination de la valeur associée à une clef, si elle existe. |
||
Les tableaux associatifs sont utilisés couramment en informatique, par exemple dans les [[systèmes de fichiers]] |
Les tableaux associatifs sont utilisés couramment en informatique, par exemple dans les [[systèmes de fichiers]], pour gérer la [[table des symboles]] des [[compilateur]]s durant l'analyse lexicale, pour accéder à la [[mémoire virtuelle]], ou pour router les paquets dans un [[routeur]]. |
||
== Exemples == |
== Exemples == |
||
On peut voir un annuaire téléphonique comme un tableau associatif, où les noms constituent les clefs et les numéros de téléphone les valeurs. Un autre exemple est celui d'un dictionnaire (au sens traditionnel), où les mots sont les clefs et les définitions les valeurs. Une table de base de données constitue également |
On peut voir un annuaire téléphonique comme un tableau associatif, où les noms constituent les clefs et les numéros de téléphone les valeurs. Un autre exemple est celui d'un dictionnaire (au sens traditionnel), où les mots sont les clefs et les définitions les valeurs. Une table de base de données constitue également un tableau associatif dans lequel les valeurs sont des enregistrements complets (lignes). Une [[base de données]] entière peut être vue comme un ensemble de tableaux associatifs liés par les contraintes que constituent les règles d'[[Edgar Frank Codd|Edgar Codd]]. |
||
== Structures de données pour les tableaux associatifs == |
== Structures de données pour les tableaux associatifs == |
||
Les tableaux associatifs sont le plus souvent utilisés lorsque l'opération de recherche est la plus fréquente. Pour cette raison, la conception privilégie le plus souvent cette opération, au détriment de l'efficacité de l'ajout et de l'occupation mémoire par rapport à |
Les tableaux associatifs sont le plus souvent utilisés lorsque l'opération de recherche est la plus fréquente. Pour cette raison, la conception privilégie le plus souvent cette opération, au détriment de l'efficacité de l'ajout et de l'occupation mémoire par rapport à d'autres structures de données (telles que les listes d'association). Dans les routeurs, pour l'accès à la mémoire virtuelle, ou plus généralement quand le temps d'accès est très limité, un tableau associatif peut être implémenté au niveau matériel (voir [[mémoire adressable par contenu]]). |
||
d'autres structures de données (telles que les listes d'association). Dans de rares cas, un tableau associatif peut être implémenté à un niveau matériel (voir [[mémoire adressable par contenu]]). |
|||
Dans la suite, <math>n</math> désigne le nombre d'éléments du tableau associatif. |
|||
=== Représentations efficaces === |
=== Représentations efficaces === |
||
Deux structures de données se montrent efficaces pour représenter les tableaux associatifs : la [[table de hachage]] et l'[[arbre équilibré]]. Les avantages et inconvénients respectifs de ces deux solutions sont les suivants : |
Deux structures de données se montrent efficaces pour représenter les tableaux associatifs : la [[table de hachage]] et l'[[arbre équilibré]]. Les avantages et inconvénients respectifs de ces deux solutions sont les suivants : |
||
* Les tables de hachage ont une meilleure complexité en moyenne pour l'insertion et la recherche (O(1)), alors que les arbres équilibrés ont une meilleure complexité dans le pire des cas (O(log |
* Les tables de hachage ont une meilleure complexité en moyenne pour l'insertion et la recherche (<math>O(1)</math>), alors que les arbres équilibrés ont une meilleure complexité dans le pire des cas (<math>O(\log{n})</math>), au lieu de (<math>O(n)</math>) pour certaines tables de hachage) ; |
||
* Les tables de hachage ont une représentation mémoire généralement plus compacte |
* Les tables de hachage ont une représentation mémoire généralement plus compacte ; |
||
* Les arbres équilibrés peuvent aisément fournir des structures de données [[structure de données persistante|persistantes]], ce qui est particulièrement mis en avant dans la [[programmation fonctionnelle]] |
* Les arbres équilibrés peuvent aisément fournir des structures de données [[structure de données persistante|persistantes]], ce qui est particulièrement mis en avant dans la [[programmation fonctionnelle]] ; |
||
* Les tables de hachage nécessitent la définition d'une bonne [[fonction de hachage]], ce qui peut être difficile à réaliser dans certains cas, alors que les arbres équilibrés ne demandent qu'un [[ordre total]] sur les clefs. Inversement, les tables de hachage peuvent être utilisées sur des clefs non ordonnées |
* Les tables de hachage nécessitent la définition d'une bonne [[fonction de hachage]], ce qui peut être difficile à réaliser dans certains cas, alors que les arbres équilibrés ne demandent qu'un [[ordre total]] sur les clefs. Inversement, les tables de hachage peuvent être utilisées sur des clefs non ordonnées ; |
||
* Les arbres équilibrés préservent l'ordre des clefs, permettant notamment d'effectuer un parcours des clefs dans l'ordre ou de localiser efficacement une clé proche d'une valeur donnée. Les tables de hachage, en revanche, ne préservent pas l'ordre des clefs (lorsqu'il existe). |
* Les arbres équilibrés préservent l'ordre des clefs, permettant notamment d'effectuer un parcours des clefs dans l'ordre ou de localiser efficacement une clé proche d'une valeur donnée. Les tables de hachage, en revanche, ne préservent pas l'ordre des clefs (lorsqu'il existe). |
||
=== Listes d'association === |
=== Listes d'association === |
||
Une manière inefficace (mais simple), de réaliser un tableau associatif est une ''liste d'association'', [[liste chaînée]] de paires clef-valeur. La recherche consiste alors à parcourir séquentiellement la liste jusqu'à trouver une clef donnée ; elle est donc de complexité O( |
Une manière inefficace (mais simple), de réaliser un tableau associatif (introduite dans Lisp en 1957) est une ''liste d'association'', [[liste chaînée]] de paires clef-valeur. La recherche consiste alors à parcourir séquentiellement la liste jusqu'à trouver une clef donnée ; elle est donc de complexité <math>O(n)</math>. La liste d'association possède les avantages suivants : |
||
* Aucune fonction sur les clefs n'est nécessaire (telle qu'une relation d'ordre ou une fonction de hachage) |
* Aucune fonction sur les clefs n'est nécessaire (telle qu'une [[relation d'ordre]] ou une fonction de hachage) ; |
||
* L'ajout est réalisable en temps constant (il suffit de l'effectuer en tête de liste) |
* L'ajout est réalisable en temps constant (il suffit de l'effectuer en tête de liste) ; |
||
* Pour de très petits tableaux associatifs (premiers [[téléphone mobile|téléphones mobiles]], par exemple), les listes d'associations consomment moins de mémoire que d'autres structures de données. |
* Pour de très petits tableaux associatifs (premiers [[téléphone mobile|téléphones mobiles]], par exemple), les listes d'associations consomment moins de mémoire que d'autres structures de données{{Référence nécessaire||date=25 août 2020}}. |
||
=== Représentations spécialisées === |
=== Représentations spécialisées === |
||
Si les clefs ont un type particulier, il est parfois possible d'obtenir de meilleures performances en utilisant une structure de données spécialisée. Par exemple, il est possible d'utiliser un [[arbre de Patricia]] si les clefs sont des entiers (lorsque les clefs sont trop clairsemées pour qu'un tableau traditionnel puisse être utilisé). D'une manière plus générale, un [[Trie (informatique)|''trie'']] peut être utilisé dès que les clefs ont une structure de mots. On évite alors de nombreuses comparaisons lorsque plusieurs clefs ont des préfixes communs, ce qui est le cas par exemple dans les tables de [[routage]]. |
Si les clefs ont un type particulier, il est parfois possible d'obtenir de meilleures performances en utilisant une [[structure de données]] spécialisée. Par exemple, il est possible d'utiliser un [[arbre de Patricia]] si les clefs sont des entiers (lorsque les clefs sont trop clairsemées pour qu'un tableau traditionnel puisse être utilisé). D'une manière plus générale, un [[Trie (informatique)|''trie'']] peut être utilisé dès que les clefs ont une structure de mots. On évite alors de nombreuses comparaisons lorsque plusieurs clefs ont des préfixes communs, ce qui est le cas par exemple dans les tables de [[routage]]. |
||
== Prise en charge dans les langages de programmation == |
== Prise en charge dans les langages de programmation == |
||
=== PHP et Perl === |
|||
Code source [[PHP]] utilisant un tableau associatif : |
|||
<source lang="php"> |
|||
$dico = array( "lundi"=>"dodo", |
|||
"mardi"=>"dodo", |
|||
"mercredi"=>"resto" ); |
|||
echo $dico["lundi"]; |
|||
foreach($dico as $key=>$value) |
|||
{ |
|||
echo "Le $key c'est $value."; |
|||
} |
|||
</source> |
|||
Le même code en [[Perl (langage)|Perl]] : |
|||
<source lang="perl"> |
|||
%dico = qw ( lundi dodo mardi dodo mercredi resto ) ; |
|||
print "$dico{lundi}\n"; |
|||
foreach $key (sort keys %dico) |
|||
{ |
|||
print "Le $key c'est $dico{$key}.\n"; |
|||
} |
|||
</source> |
|||
Sortie écran dans les deux cas : |
|||
dodo |
|||
Le lundi c'est dodo |
|||
Le mardi c'est dodo |
|||
Le mercredi c'est resto |
|||
=== Python === |
|||
Code source [[Python (langage)|Python]] créant et affichant le contenu d'un tableau associatif, plus communément appelé dictionnaire : |
|||
<source lang="python"> |
|||
monuments = {"La tour Eiffel": "à Paris", |
|||
"La statue de la liberté": "à New-York", |
|||
"Le nombre de visiteurs de la tour Eiffel": 6930000 |
|||
} |
|||
for key in monuments: |
|||
print("{} est {}".format(key, monuments[key])) |
|||
</source> |
|||
Comme le montre l'exemple, les dictionnaires peuvent contenir n'importe quel type de variable ou d'objets. Cette caractéristique est d'ailleurs aussi valable pour les listes ou les tuples. Le résultat sera : |
|||
La tour Eiffel est à Paris |
|||
La statue de la liberté est à New-York |
|||
Le nombre de visiteurs de la tour Eiffel est 6930000 |
|||
=== C++ === |
=== C++ === |
||
Code source [[C++]] utilisant un tableau associatif via la classe <code>map</code> de la [[bibliothèque standard]] : |
Code source [[C++]] utilisant un tableau associatif via la classe <code>map</code> de la [[bibliothèque standard]] : |
||
< |
<syntaxhighlight lang="cpp"> |
||
#include <map> |
#include <map> |
||
#include <string> |
#include <string> |
||
Ligne 104 : | Ligne 55 : | ||
return 0; |
return 0; |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
Le tableau associatif ci-dessus est aussi appelé ''dictionnaire'' notamment parce qu'il permet de faire des recherches rapides, sans parcourir le tableau entier. |
Le tableau associatif ci-dessus est aussi appelé ''dictionnaire'' notamment parce qu'il permet de faire des recherches rapides, sans parcourir le tableau entier. |
||
Ligne 110 : | Ligne 61 : | ||
=== OCaml === |
=== OCaml === |
||
Le langage [[OCaml]] fournit trois sortes de tableaux associatifs dans sa [[bibliothèque standard]]. La plus simple est une liste de paires : |
Le langage [[OCaml]] fournit trois sortes de tableaux associatifs dans sa [[bibliothèque standard]]. La plus simple est une liste de paires : |
||
< |
<syntaxhighlight lang="ocaml"> |
||
# let m = ["Sally Smart", "555-9999"; |
# let m = ["Sally Smart", "555-9999"; |
||
"John Doe", "555-1212"; |
"John Doe", "555-1212"; |
||
Ligne 119 : | Ligne 70 : | ||
# List.assoc "John Doe" m;; |
# List.assoc "John Doe" m;; |
||
- : string = "555-1212" |
- : string = "555-1212" |
||
</syntaxhighlight> |
|||
</source> |
|||
La seconde est une [[table de hachage]] polymorphe : |
La seconde est une [[table de hachage]] polymorphe : |
||
< |
<syntaxhighlight lang="ocaml"> |
||
# let m = Hashtbl.create 3;; |
# let m = Hashtbl.create 3;; |
||
val m : ('_a, '_b) Hashtbl.t = <abstr> |
val m : ('_a, '_b) Hashtbl.t = <abstr> |
||
Ligne 131 : | Ligne 82 : | ||
# Hashtbl.find m "John Doe";; |
# Hashtbl.find m "John Doe";; |
||
- : string = "555-1212" |
- : string = "555-1212" |
||
</syntaxhighlight> |
|||
</source> |
|||
Enfin, la dernière est un dictionnaire purement applicatif (réalisé par des [[Arbre AVL|arbres AVL]]) : |
Enfin, la dernière est un dictionnaire purement applicatif (réalisé par des [[Arbre AVL|arbres AVL]]) : |
||
< |
<syntaxhighlight lang="ocaml"> |
||
# include (Map.Make(String));; |
# include (Map.Make(String));; |
||
... |
... |
||
# let m = |
# let m = empty |
||
|> add "Sally Smart" "555-9999" |
|||
|> add "John Doe" "555-1212" |
|||
|> add "J. Random Hacker" "553-1337";; |
|||
val m : string t = <abstr> |
val m : string t = <abstr> |
||
# find "John Doe" m;; |
# find "John Doe" m;; |
||
- : string = "555-1212" |
- : string = "555-1212" |
||
</syntaxhighlight> |
|||
</source> |
|||
Les listes de paires et les dictionnaires sont des [[structure de données persistante|structures de données persistantes]], car [[purement fonctionnel]]les. Les tables de hachage sont au contraire des structures de données [[programmation impérative|impératives]], de meilleure efficacité que les listes et les AVL en général. |
Les listes de paires et les dictionnaires sont des [[structure de données persistante|structures de données persistantes]], car [[purement fonctionnel]]les. Les tables de hachage sont au contraire des structures de données [[programmation impérative|impératives]], {{Référence nécessaire|de meilleure efficacité que les listes et les AVL en général}}. |
||
=== Javascript === |
|||
En [[Javascript]], les tableaux associatifs sont appelés objets, la classe de base se nommant <code>Object</code>. |
|||
<syntaxhighlight lang="javascript"> |
|||
// définition de l'objet |
|||
const agenda = { |
|||
lundi: 'dodo', |
|||
mardi: 'dodo', |
|||
mercredi: 'resto' |
|||
} |
|||
// ajout dynamique de clés/valeurs |
|||
agenda.jeudi = 'apero' |
|||
// modification des clés/valeurs existante |
|||
agenda.mardi = 'apero' |
|||
delete agenda.lundi |
|||
// Pour obtenir une liste des clés |
|||
const jours = Object.keys(agenda) |
|||
// Pour obtenir une liste des valeurs |
|||
const activités = Object.values(agenda) |
|||
// Plusieurs manières de faire une boucle sur ces valeurs |
|||
for (const key in agenda) { |
|||
const value = agenda[key] |
|||
console.log(`${key} c'est ${value} : ça va être super bien`) |
|||
} |
|||
// ou bien |
|||
Object.keys(agenda).forEach(key => { |
|||
const value = agenda[key] |
|||
console.log(`${key} c'est ${value} : ça va être super bien`) |
|||
}) |
|||
</syntaxhighlight> |
|||
À noter que c'est de cette notation d'objet en javascript que vient le format standard d'échange de données '''JavaScript Object Notation''', abrégé en [[JSON]]. |
|||
=== PHP et Perl === |
|||
Code source [[PHP]] utilisant un tableau associatif : |
|||
<syntaxhighlight lang="php"> |
|||
$dico = array( "lundi"=>"dodo", |
|||
"mardi"=>"dodo", |
|||
"mercredi"=>"resto" ); |
|||
echo $dico["lundi"]; |
|||
foreach($dico as $key=>$value) |
|||
{ |
|||
echo "Le $key c'est $value."; |
|||
} |
|||
</syntaxhighlight> |
|||
Le même code en [[Perl (langage)|Perl]] : |
|||
<syntaxhighlight lang="perl"> |
|||
%dico = ( |
|||
lundi => 'dodo', |
|||
mardi => 'dodo', |
|||
mercredi => 'resto' |
|||
); |
|||
print "$dico{lundi}\n"; |
|||
foreach $key (sort keys %dico) |
|||
{ |
|||
print "Le $key c'est $dico{$key}.\n"; |
|||
} |
|||
</syntaxhighlight> |
|||
Sortie écran dans les deux cas : |
|||
dodo |
|||
Le lundi c'est dodo |
|||
Le mardi c'est dodo |
|||
Le mercredi c'est resto |
|||
=== Python === |
|||
Code source [[Python (langage)|Python]] créant et affichant le contenu d'un tableau associatif, plus communément appelé dictionnaire : |
|||
<syntaxhighlight lang="python"> |
|||
monuments = {"La tour Eiffel": "à Paris", |
|||
"La statue de la liberté": "à New-York", |
|||
"Le nombre de visiteurs de la tour Eiffel": 6930000 |
|||
} |
|||
for clef in monuments.keys(): |
|||
print("{} est {}".format(clef, monuments[clef])) |
|||
</syntaxhighlight> |
|||
Comme le montre l'exemple, les dictionnaires peuvent contenir n'importe quel type de variable ou d'objets. Cette caractéristique est d'ailleurs aussi valable pour les listes ou les tuples. Le résultat sera : |
|||
La tour Eiffel est à Paris |
|||
La statue de la liberté est à New-York |
|||
Le nombre de visiteurs de la tour Eiffel est 6930000 |
|||
=== WLangage (WINDEV) === |
|||
<syntaxhighlight lang="text"> |
|||
Monuments est un tableau associatif de chaînes = [["La tour Eiffel", "à Paris"], |
|||
["La statue de la liberté", "à New-York"], |
|||
["Le nombre de visiteurs de la tour Eiffel", 6930000] |
|||
] |
|||
// Parcourt les monuments |
|||
POUR TOUT Valeur, Cle de Monuments |
|||
Trace("[%sCle%] est [%sValeur%]") |
|||
FIN |
|||
</syntaxhighlight> |
|||
== Bibliographie == |
== Bibliographie == |
||
* {{chapitre |
* {{chapitre |
||
|langue=en |
|||
|titre chapitre =4 Hash Tables and Associative Arrays |
|||
|titre chapitre=''4 Hash Tables and Associative Arrays'' |
|||
|titre=Algorithms and Data Structures: The Basic Toolbox |
|titre=Algorithms and Data Structures: The Basic Toolbox |
||
|nom1=Kurt|prénom1=Mehlhorn | lien auteur1 =Kurt Mehlhorn |
|nom1=Kurt|prénom1=Mehlhorn | lien auteur1 =Kurt Mehlhorn |
Dernière version du 10 octobre 2024 à 08:13
En informatique, un tableau associatif (aussi appelé dictionnaire ou table d'association) est un type de données associant à un ensemble de clefs, un ensemble correspondant de valeurs. Chaque clef est associée à une seule valeur (au plus) : un tableau associatif correspond donc à une application de domaine fini en mathématiques.
Du point de vue du programmeur, le tableau associatif peut être vu comme une généralisation du tableau : alors que le tableau traditionnel associe des entiers consécutifs à des valeurs, le tableau associatif associe des clefs d'un type arbitraire à des valeurs d'un autre type.
Les opérations usuellement fournies par un tableau associatif sont :
- ajout : association d'une nouvelle valeur à une nouvelle clef ;
- modification : association d'une nouvelle valeur à une ancienne clef ;
- suppression : suppression d'une clef ;
- recherche : détermination de la valeur associée à une clef, si elle existe.
Les tableaux associatifs sont utilisés couramment en informatique, par exemple dans les systèmes de fichiers, pour gérer la table des symboles des compilateurs durant l'analyse lexicale, pour accéder à la mémoire virtuelle, ou pour router les paquets dans un routeur.
Exemples
[modifier | modifier le code]On peut voir un annuaire téléphonique comme un tableau associatif, où les noms constituent les clefs et les numéros de téléphone les valeurs. Un autre exemple est celui d'un dictionnaire (au sens traditionnel), où les mots sont les clefs et les définitions les valeurs. Une table de base de données constitue également un tableau associatif dans lequel les valeurs sont des enregistrements complets (lignes). Une base de données entière peut être vue comme un ensemble de tableaux associatifs liés par les contraintes que constituent les règles d'Edgar Codd.
Structures de données pour les tableaux associatifs
[modifier | modifier le code]Les tableaux associatifs sont le plus souvent utilisés lorsque l'opération de recherche est la plus fréquente. Pour cette raison, la conception privilégie le plus souvent cette opération, au détriment de l'efficacité de l'ajout et de l'occupation mémoire par rapport à d'autres structures de données (telles que les listes d'association). Dans les routeurs, pour l'accès à la mémoire virtuelle, ou plus généralement quand le temps d'accès est très limité, un tableau associatif peut être implémenté au niveau matériel (voir mémoire adressable par contenu).
Dans la suite, désigne le nombre d'éléments du tableau associatif.
Représentations efficaces
[modifier | modifier le code]Deux structures de données se montrent efficaces pour représenter les tableaux associatifs : la table de hachage et l'arbre équilibré. Les avantages et inconvénients respectifs de ces deux solutions sont les suivants :
- Les tables de hachage ont une meilleure complexité en moyenne pour l'insertion et la recherche (), alors que les arbres équilibrés ont une meilleure complexité dans le pire des cas (), au lieu de () pour certaines tables de hachage) ;
- Les tables de hachage ont une représentation mémoire généralement plus compacte ;
- Les arbres équilibrés peuvent aisément fournir des structures de données persistantes, ce qui est particulièrement mis en avant dans la programmation fonctionnelle ;
- Les tables de hachage nécessitent la définition d'une bonne fonction de hachage, ce qui peut être difficile à réaliser dans certains cas, alors que les arbres équilibrés ne demandent qu'un ordre total sur les clefs. Inversement, les tables de hachage peuvent être utilisées sur des clefs non ordonnées ;
- Les arbres équilibrés préservent l'ordre des clefs, permettant notamment d'effectuer un parcours des clefs dans l'ordre ou de localiser efficacement une clé proche d'une valeur donnée. Les tables de hachage, en revanche, ne préservent pas l'ordre des clefs (lorsqu'il existe).
Listes d'association
[modifier | modifier le code]Une manière inefficace (mais simple), de réaliser un tableau associatif (introduite dans Lisp en 1957) est une liste d'association, liste chaînée de paires clef-valeur. La recherche consiste alors à parcourir séquentiellement la liste jusqu'à trouver une clef donnée ; elle est donc de complexité . La liste d'association possède les avantages suivants :
- Aucune fonction sur les clefs n'est nécessaire (telle qu'une relation d'ordre ou une fonction de hachage) ;
- L'ajout est réalisable en temps constant (il suffit de l'effectuer en tête de liste) ;
- Pour de très petits tableaux associatifs (premiers téléphones mobiles, par exemple), les listes d'associations consomment moins de mémoire que d'autres structures de données[réf. nécessaire].
Représentations spécialisées
[modifier | modifier le code]Si les clefs ont un type particulier, il est parfois possible d'obtenir de meilleures performances en utilisant une structure de données spécialisée. Par exemple, il est possible d'utiliser un arbre de Patricia si les clefs sont des entiers (lorsque les clefs sont trop clairsemées pour qu'un tableau traditionnel puisse être utilisé). D'une manière plus générale, un trie peut être utilisé dès que les clefs ont une structure de mots. On évite alors de nombreuses comparaisons lorsque plusieurs clefs ont des préfixes communs, ce qui est le cas par exemple dans les tables de routage.
Prise en charge dans les langages de programmation
[modifier | modifier le code]C++
[modifier | modifier le code]Code source C++ utilisant un tableau associatif via la classe map
de la bibliothèque standard :
#include <map>
#include <string>
using namespace std;
int main()
{
map <string, string> repertoire;
repertoire["Jean Dupont"] = "01.02.03.04.05";
repertoire["François Martin"] = "02.03.04.05.06";
repertoire["Louis Durand"] = "03.04.05.06.07";
return 0;
}
Le tableau associatif ci-dessus est aussi appelé dictionnaire notamment parce qu'il permet de faire des recherches rapides, sans parcourir le tableau entier.
OCaml
[modifier | modifier le code]Le langage OCaml fournit trois sortes de tableaux associatifs dans sa bibliothèque standard. La plus simple est une liste de paires :
# let m = ["Sally Smart", "555-9999";
"John Doe", "555-1212";
"J. Random Hacker", "553-1337"];;
val m : (string * string) list =
[("Sally Smart", "555-9999"); ("John Doe", "555-1212");
("J. Random Hacker", "553-1337")]
# List.assoc "John Doe" m;;
- : string = "555-1212"
La seconde est une table de hachage polymorphe :
# let m = Hashtbl.create 3;;
val m : ('_a, '_b) Hashtbl.t = <abstr>
# Hashtbl.add m "Sally Smart" "555-9999";
Hashtbl.add m "John Doe" "555-1212";
Hashtbl.add m "J. Random Hacker" "553-1337";;
- : unit = ()
# Hashtbl.find m "John Doe";;
- : string = "555-1212"
Enfin, la dernière est un dictionnaire purement applicatif (réalisé par des arbres AVL) :
# include (Map.Make(String));;
...
# let m = empty
|> add "Sally Smart" "555-9999"
|> add "John Doe" "555-1212"
|> add "J. Random Hacker" "553-1337";;
val m : string t = <abstr>
# find "John Doe" m;;
- : string = "555-1212"
Les listes de paires et les dictionnaires sont des structures de données persistantes, car purement fonctionnelles. Les tables de hachage sont au contraire des structures de données impératives, de meilleure efficacité que les listes et les AVL en général[réf. nécessaire].
Javascript
[modifier | modifier le code]En Javascript, les tableaux associatifs sont appelés objets, la classe de base se nommant Object
.
// définition de l'objet
const agenda = {
lundi: 'dodo',
mardi: 'dodo',
mercredi: 'resto'
}
// ajout dynamique de clés/valeurs
agenda.jeudi = 'apero'
// modification des clés/valeurs existante
agenda.mardi = 'apero'
delete agenda.lundi
// Pour obtenir une liste des clés
const jours = Object.keys(agenda)
// Pour obtenir une liste des valeurs
const activités = Object.values(agenda)
// Plusieurs manières de faire une boucle sur ces valeurs
for (const key in agenda) {
const value = agenda[key]
console.log(`${key} c'est ${value} : ça va être super bien`)
}
// ou bien
Object.keys(agenda).forEach(key => {
const value = agenda[key]
console.log(`${key} c'est ${value} : ça va être super bien`)
})
À noter que c'est de cette notation d'objet en javascript que vient le format standard d'échange de données JavaScript Object Notation, abrégé en JSON.
PHP et Perl
[modifier | modifier le code]Code source PHP utilisant un tableau associatif :
$dico = array( "lundi"=>"dodo",
"mardi"=>"dodo",
"mercredi"=>"resto" );
echo $dico["lundi"];
foreach($dico as $key=>$value)
{
echo "Le $key c'est $value.";
}
Le même code en Perl :
%dico = (
lundi => 'dodo',
mardi => 'dodo',
mercredi => 'resto'
);
print "$dico{lundi}\n";
foreach $key (sort keys %dico)
{
print "Le $key c'est $dico{$key}.\n";
}
Sortie écran dans les deux cas :
dodo Le lundi c'est dodo Le mardi c'est dodo Le mercredi c'est resto
Python
[modifier | modifier le code]Code source Python créant et affichant le contenu d'un tableau associatif, plus communément appelé dictionnaire :
monuments = {"La tour Eiffel": "à Paris",
"La statue de la liberté": "à New-York",
"Le nombre de visiteurs de la tour Eiffel": 6930000
}
for clef in monuments.keys():
print("{} est {}".format(clef, monuments[clef]))
Comme le montre l'exemple, les dictionnaires peuvent contenir n'importe quel type de variable ou d'objets. Cette caractéristique est d'ailleurs aussi valable pour les listes ou les tuples. Le résultat sera :
La tour Eiffel est à Paris La statue de la liberté est à New-York Le nombre de visiteurs de la tour Eiffel est 6930000
WLangage (WINDEV)
[modifier | modifier le code]Monuments est un tableau associatif de chaînes = [["La tour Eiffel", "à Paris"],
["La statue de la liberté", "à New-York"],
["Le nombre de visiteurs de la tour Eiffel", 6930000]
]
// Parcourt les monuments
POUR TOUT Valeur, Cle de Monuments
Trace("[%sCle%] est [%sValeur%]")
FIN
Bibliographie
[modifier | modifier le code]- (en) Mehlhorn Kurt et Peter Sanders, « 4 Hash Tables and Associative Arrays », dans Algorithms and Data Structures: The Basic Toolbox, Springer, , p. 81-98