liste, map ou tableau ?
Publié : dim. 22/janv./2012 23:19
Bonsoir, une petite question sur les fondamentaux de la programmation,
Liste, map ou tableau ?
Je me pose souvent cette question, je présume que chaque structure à son avantage, et si je pose cette question c'est pour essayer de mieux comprendre et d'optimiser au maximum mes programmes (je penses notamment au programme serveur de 3Arks).
Pour ce faire, je vais déjà expliquer que j'ai globalement compris comment fonctionne les tableaux et les listes ;
Un tableau récupère un espace mémoire qui correspond à ; 1ère dimension { * 2nd dimension ... }* taille de l'élément stocké. Dans la mémoire. Ainsi sa longueur est fixé, et pour accéder à un élément c'est instantanée (pour un tableau de dimension 5 sur 5 ) :
pointeur_sur_element[3,3] = *pointeur_du_tableau + 3*5 + 3
Pour une liste, chaque donnée stocké l’élément + un pointeur vers l'élément suivant. On a donc des choses de ce genre ;
[chose_a stocker][pointeur vers la seconde chose à stocker...]
Les maps, déjà, j'ai pas compris comment ça fonctionne mais vue le gros avantage qu'il existe sur les listes (pointer vers un élément avec sa clé), je présume que c'est plus lent qu'une liste. De même, une liste est plus lente qu'un tableau.
Je suis partie donc du principe qu'il valait mieux utiliser un tableau si on avait la taille de ce qu'on allait stocker (et que la taille était fixe). Une liste si la taille varie au cours du temps, et une map dans quel cas ? Pour ma part, dans mes programmes, j'ai tendance à abuser des maps, et je me demandais si il valait mieux faire ça :
Pour une structure qui comporte une ID, un pseudo, des coordonnées, pour récupérer rapidement un élément de la structure, en fonction d'un ID, mieux vaut il faire ça ;
Ou ça :
De même, une question du même genre, mon joueur se balade sur une carte. A chaque coordonnées de la carte, il est probable qu'il rencontre un évènement, l'évènement est traité dans une structure, je stocke donc des pointeurs. Ces évènements sont rare. J'ai pensé à 3 méthodes pour stocker ce genre de chose.
Via un tableau :
Chaque coordonnée est représenté dans le tableau, si une coordonné vaut 0, c'est qu'il n'y a pas d'évènement, sinon sa pointe vers l'évènements à executer. Le gros défaut d'une telle technique, c'est qu'on risque d'utiliser beaucoup plus de mémoire que nécessaire.
Via une map :
La map contiendrait uniquement les évènements, pour vérifier qu'un joueur a marché sur un évènement, j'utiliserais la clé de la map en faisant ; Map_Evenement(str(positionX)+":"+str(positionY))
Si la clé n'existe pas, il n'y a pas d'évènement, si la clé existe, on a directement le pointeur vers l'évènement.
Via une liste :
La liste contiendrait uniquement les évènements, pour vérifier qu'un joueur a marché sur un évènement, je ferais un :
Je suis arrivé donc au problème suivant ;
Avec une map, j'ai pas l'impression que ce soit propre, avec une liste ça me parait lourd de parcourir tout la liste pour chaque déplacement, avec un tableau ça me parait lourd d'utiliser autant de mémoire alors qu'il risque d'avoir peu d'évènement pour de grande carte.
Donc voilà, j'aimerais un petit éclaircissement, si quelqu'un sait, les différences de vitesse entre map/liste/tableau et les différences d'occupation mémoire (un ordre d'idée) ?
Je me doute que la réponse du problème dépends uniquement de la quantités de données à stocker.
Merci d'avance !
Liste, map ou tableau ?
Je me pose souvent cette question, je présume que chaque structure à son avantage, et si je pose cette question c'est pour essayer de mieux comprendre et d'optimiser au maximum mes programmes (je penses notamment au programme serveur de 3Arks).
Pour ce faire, je vais déjà expliquer que j'ai globalement compris comment fonctionne les tableaux et les listes ;
Un tableau récupère un espace mémoire qui correspond à ; 1ère dimension { * 2nd dimension ... }* taille de l'élément stocké. Dans la mémoire. Ainsi sa longueur est fixé, et pour accéder à un élément c'est instantanée (pour un tableau de dimension 5 sur 5 ) :
pointeur_sur_element[3,3] = *pointeur_du_tableau + 3*5 + 3
Pour une liste, chaque donnée stocké l’élément + un pointeur vers l'élément suivant. On a donc des choses de ce genre ;
[chose_a stocker][pointeur vers la seconde chose à stocker...]
Les maps, déjà, j'ai pas compris comment ça fonctionne mais vue le gros avantage qu'il existe sur les listes (pointer vers un élément avec sa clé), je présume que c'est plus lent qu'une liste. De même, une liste est plus lente qu'un tableau.
Je suis partie donc du principe qu'il valait mieux utiliser un tableau si on avait la taille de ce qu'on allait stocker (et que la taille était fixe). Une liste si la taille varie au cours du temps, et une map dans quel cas ? Pour ma part, dans mes programmes, j'ai tendance à abuser des maps, et je me demandais si il valait mieux faire ça :
Pour une structure qui comporte une ID, un pseudo, des coordonnées, pour récupérer rapidement un élément de la structure, en fonction d'un ID, mieux vaut il faire ça ;
Code : Tout sélectionner
;Utiliser une map :
*Mon_element.Ma_Structure = Stockage(str(ID))
Code : Tout sélectionner
;Utiliser une liste :
ForEach Stockage()
If Stockage()\ID = ID
*Mon_element.Ma_Structure = Stockage()
Break
Endif
Next
Via un tableau :
Chaque coordonnée est représenté dans le tableau, si une coordonné vaut 0, c'est qu'il n'y a pas d'évènement, sinon sa pointe vers l'évènements à executer. Le gros défaut d'une telle technique, c'est qu'on risque d'utiliser beaucoup plus de mémoire que nécessaire.
Via une map :
La map contiendrait uniquement les évènements, pour vérifier qu'un joueur a marché sur un évènement, j'utiliserais la clé de la map en faisant ; Map_Evenement(str(positionX)+":"+str(positionY))
Si la clé n'existe pas, il n'y a pas d'évènement, si la clé existe, on a directement le pointeur vers l'évènement.
Via une liste :
La liste contiendrait uniquement les évènements, pour vérifier qu'un joueur a marché sur un évènement, je ferais un :
Code : Tout sélectionner
ForEach Liste_Element()
If PositionX = Liste_Element()\X and PositionY = Liste_Element()\Y
C'est l'évènement à exécuté...
EndIf
Next
Avec une map, j'ai pas l'impression que ce soit propre, avec une liste ça me parait lourd de parcourir tout la liste pour chaque déplacement, avec un tableau ça me parait lourd d'utiliser autant de mémoire alors qu'il risque d'avoir peu d'évènement pour de grande carte.
Donc voilà, j'aimerais un petit éclaircissement, si quelqu'un sait, les différences de vitesse entre map/liste/tableau et les différences d'occupation mémoire (un ordre d'idée) ?
Je me doute que la réponse du problème dépends uniquement de la quantités de données à stocker.
Merci d'avance !