web-dev-qa-db-fra.com

Qu'est-ce que la structure des données vectorielles

Je connais Vector en C++ et Java, c'est comme un tableau dynamique, mais je ne trouve aucune définition générale de la structure des données Vector. Alors, qu'est-ce que Vector? Vector est-il une structure de données générale (comme un tableau, une pile, une file d'attente, un arbre, ...) ou simplement un type de données en fonction de la langue?

14
Ikarus

Le mot "vecteur" appliqué à l'informatique/à la programmation est emprunté aux mathématiques, ce qui peut prêter à confusion (même votre question pourrait porter sur plusieurs sujets).

L'exemple le plus simple de vecteurs en mathématiques est la droite numérique, utilisée pour enseigner les mathématiques élémentaires (en particulier pour aider à visualiser les nombres négatifs, la soustraction de nombres négatifs, l'addition de nombres négatifs, etc.).

Le vecteur est une distance et une direction à partir d'un point. C'est pourquoi cela peut confondre la discussion, car une structure de données vectorielles POURRAIT être composée de trois points, X, Y, Z, dans une structure utilisée dans les moteurs graphiques 3D, ou un point 2D (juste X, Y). Dans ce contexte, la soustraction de deux de ces points donne un vecteur - le vecteur décrit dans quelle mesure et dans quelle direction se déplacer d'un des opérandes source à l'autre.

Cela s'applique au stockage, comme les vecteurs stl ou Java, en ce que le stockage est représenté comme une distance à partir d'une adresse (où une adresse mémoire est similaire à un point dans l'espace ou sur une ligne numérique). ).

Le concept est lié aux tableaux, car les tableaux pourraient être le stockage alloué pour un vecteur, mais je soumets que le vecteur est un concept plus grand que le tableau. Un vecteur doit inclure le concept de distance à partir d'un point de départ, et si vous pensez au début d'un tableau comme point de départ, la distance jusqu'à la fin du tableau est sa taille.

Ainsi, la structure de données représentant un vecteur doit inclure la taille, alors qu'un tableau n'a pas de stockage pour inclure la taille, il est supposé par la façon dont il est alloué. C'est-à-dire que si vous allouez dynamiquement un tableau, il n'y a pas de structure de données stockant la taille de ce tableau, le programmeur doit supposer connaître cette taille, ou le stocker dans un certain nombre entier ou long.

La structure des données vectorielles (par exemple, la conception d'une classe vectorielle) DOIT stocker la taille, donc au minimum, il y aurait un point de départ (la base d'un tableau ou une adresse en mémoire) et une distance de celle-ci point indiquant la taille.

C'est vraiment orienté "RAM", cependant, dans la description, car il y a encore un point non décrit qui doit faire partie des données décrivant le vecteur - la notion de taille d'élément. Si un vecteur représente des octets et que le stockage en mémoire est généralement mesuré en octets, une adresse et une distance (ou taille) représenteraient un vecteur d'octets, mais rien d'autre - et c'est une réflexion très au niveau de la machine. Une pensée supérieure, celle d'une structure, a sa propre taille - disons, la taille d'un flottant ou d'un double, ou d'une structure ou d'une classe en C++. Quelle que soit la taille de l'élément, la mémoire requise pour stocker N d'entre eux nécessite que la structure de données vectorielles ait une certaine connaissance de CE qu'elle stocke et de sa taille. C'est pourquoi vous pensez en termes de "vecteur de chaînes" ou "vecteur de points". Un vecteur doit également stocker une taille d'élément.

Ainsi, une structure de données vectorielles de base doit avoir:

Une adresse (le point de départ)

Une taille d'élément (chaque chose qu'il stocke a une longueur de X octets)

Un certain nombre d'éléments stockés (combien d'éléments fois la taille de l'élément est la taille de stockage "minimale").

Une "hypothèse" importante faite dans cette simple liste d'entrées de 3 éléments dans la structure de données vectorielles est que l'adresse est allouée à la mémoire, qui doit être libérée à un moment donné, et doit être protégée contre l'accès au-delà de la fin du vecteur.

Cela signifie qu'il manque quelque chose. Afin de faire fonctionner une classe vectorielle, il existe une différence reconnaissable entre le nombre d'ITEM stockés dans le vecteur et la quantité de mémoire allouée pour ce stockage. En règle générale, comme vous pouvez vous en rendre compte grâce à l'utilisation du vecteur de la STL, il peut "savoir" qu'il a de la place pour stocker 10 éléments, mais n'en a actuellement que 2.

Ainsi, une classe de vecteur de travail devrait également stocker la quantité d'allocation de mémoire. Ce serait ainsi qu'il pourrait s'étendre dynamiquement - il aurait désormais suffisamment d'informations pour étendre automatiquement le stockage.

En réfléchissant à la façon dont vous souhaitez faire fonctionner une classe vectorielle, vous obtenez la structure des données nécessaires au fonctionnement d'une classe vectorielle.

18
JVene

C'est un tableau avec un espace alloué dynamiquement, chaque fois que vous dépassez cet espace, un nouvel emplacement en mémoire est alloué et l'ancien tableau est copié dans le nouveau. L'ancien est alors libéré.

De plus, le vecteur alloue généralement plus de mémoire que nécessaire, il n'a donc pas à copier toutes les données lors de l'ajout d'un nouvel élément.

Il peut sembler que les listes sont alors bien meilleures, mais ce n'est pas nécessairement le cas. Si vous ne changez pas souvent votre vecteur (en termes de taille), la mémoire cache de l'ordinateur fonctionne beaucoup mieux avec les vecteurs que les listes, car ils sont continus dans l'espace mémoire. L'inconvénient est que lorsque vous avez un grand vecteur, vous devez l'étendre. Ensuite, vous devez accepter de copier une grande quantité de données vers un autre espace en mémoire.

Quoi de plus. Vous pouvez ajouter de nouvelles données à la fin et à l'avant du vecteur. Parce que les vecteurs sont de type tableau, chaque fois que vous voulez ajouter un élément au début du vecteur, tout le tableau doit être copié. L'ajout d'éléments à la fin du vecteur est beaucoup plus efficace. Il n'y a pas un tel problème avec les listes chaînées.

Le vecteur donne un accès aléatoire à ses données internes, contrairement aux listes, files d'attente et piles.

7
DawidPi