web-dev-qa-db-fra.com

pourquoi l'accès à un élément d'un tableau prend-il un temps constant?

Disons que j'ai un tableau comme:

int a [] = {4,5,7,10,2,3,6}

lorsque j'accède à un élément, tel qu'un [3], que se passe-t-il réellement en coulisse? Pourquoi de nombreux livres d'algorithmes (comme le livre de Cormen ...) disent-ils que cela prend un temps constant?

(Je suis juste un noob dans la programmation de bas niveau, donc j'aimerais en savoir plus de vous les gars)

42
user188276

Pour être complet, "à quelle structure on accède en temps linéaire?" Une structure Linked List est accessible en temps linéaire. Pour obtenir l'élément n, vous devez parcourir n-1 éléments précédents. Vous savez, comme un magnétophone ou une cassette VHS, où aller à la fin de la cassette/VHS il a fallu attendre longtemps :-)

Un tableau ressemble plus à un disque dur: chaque point est accessible en temps "constant" :-)

C'est la raison pour laquelle le RAM d'un ordinateur est appelé RAM: Random Access Memory. Vous pouvez aller à n'importe quel emplacement si vous connaissez son adresse sans parcourir toute la mémoire avant cet emplacement.

Certaines personnes m'ont dit que l'accès HD n'est pas vraiment en temps constant (où par accès j'entends "le temps de positionner la tête et de lire un secteur de la HD"). Je dois dire que je n'en suis pas sûr. J'ai cherché sur Google et je n'ai trouvé personne en parler. Je sais que le temps n'est pas linéaire, car il est toujours accessible au hasard. En fin de compte, si vous pensez que l'accès HD n'est pas assez constant pour vous (mais alors, qu'est-ce qui est constant? L'accès de la RAM? Compte tenu des optimisations du cache, de la prélecture, de la localisation des données et du compilateur?), N'hésitez pas à considérer la phrase as Un tableau ressemble plus à une clé USB: chaque point est accessible en temps "constant": -)

14
xanatos

Le tableau, en fait, est connu par un emplacement mémoire (un pointeur). L'accès à a[3] Peut être trouvé en temps constant, car il ne s'agit que de location_of_a + 3 * sizeof (int).

En C, vous pouvez le voir directement. Souvenez-vous que a[3] Est identique à *(a+3) - qui est un peu plus clair en termes de ce qu'il fait (déréférencer le pointeur "3 éléments" dessus).

24
Reed Copsey

un tableau de 10 variables entières, d'indices 0 à 9, peut être stocké sous forme de 10 mots aux adresses mémoire 2000, 2004, 2008,… 2036, de sorte que l'élément d'indice i ait l'adresse 2000 + 4 × i. ce processus prend une multiplication et une addition. puisque ces deux opérations prennent un temps constant, nous pouvons donc dire que l'accès peut être effectué en temps constant

17
user3013127

"temps constant" signifie vraiment "temps qui ne dépend pas de la" taille du problème "". Pour le "problème" "sortir quelque chose d'un conteneur", la "taille du problème" est la taille du conteneur.

L'accès à un élément du tableau prend fondamentalement le même temps (c'est une simplification) quelle que soit la taille du conteneur, car un ensemble fixe d'étapes est utilisé pour récupérer l'élément: son emplacement en mémoire (c'est aussi une simplification) est calculé, puis la valeur à cet emplacement de la mémoire est récupérée.

Une liste liée, par exemple, ne peut pas faire cela, car chaque lien indique l'emplacement du suivant. Pour trouver un élément, vous devez parcourir tous les éléments précédents; en moyenne, vous travaillez sur la moitié du conteneur, donc la taille du conteneur compte évidemment.

8
Karl Knechtel

Parce que les tableaux sont stockés en mémoire de manière séquentielle. Donc en fait, lorsque vous accédez au tableau [3], vous dites à l'ordinateur: "Obtenez l'adresse mémoire du début du tableau, puis ajoutez-en 3, puis accédez à cet endroit." Puisque l'ajout prend un temps constant, l'accès au tableau aussi!

6
Phil

Array est une collection de types de données similaires. Donc, tous les éléments prendront la même quantité de mémoire.Par conséquent, si vous connaissez l'adresse de base du tableau et le type de données qu'il contient, vous pouvez facilement obtenir l'élément Array [i] en temps constant en utilisant la formule ci-dessous:

int takes 4 bytes in a 32 bit system.
int array[10];
base address=4000;
location of 7th element:4000+7*4.
array[7]=array[4000+7*4];

Par conséquent, il est clairement visible, vous pouvez obtenir le ith élément en temps constant si vous connaissez l'adresse de base et le type de données qu'il contient. Veuillez visiter this link pour en savoir plus sur la structure des données des tableaux.

3
Sunil Kumar Jha

Si nous connaissons l'emplacement de la mémoire auquel il faut accéder, cet accès est en temps constant. Dans le cas d'un tableau, l'emplacement de la mémoire est calculé en utilisant le pointeur de base, l'index de l'élément et la taille de l'élément. Cela implique une opération de multiplication et d'addition qui prend un temps constant à s'exécuter. Par conséquent, l'accès aux éléments à l'intérieur du tableau prend un temps constant.

1
Narendra Kalekar

Un tableau est séquentiel, ce qui signifie que l'adresse de l'élément suivant dans le tableau est à côté de celle du présent. Donc, si vous voulez obtenir le 5e élément d'un tableau, vous calculez l'adresse du 5e élément en additionnant l'adresse de base du tableau par 5. Cette adresse directe est maintenant directement utilisée pour obtenir l'élément à cette adresse.

Vous pouvez maintenant poser la même question ici: "Comment l'ordinateur connaît-il/accède-t-il directement à l'adresse calculée?" C'est la nature et le principe de la mémoire informatique (RAM). Si vous êtes davantage intéressé par la façon dont RAM accède à n'importe quelle adresse en temps constant, vous pouvez la trouver dans n'importe quel texte d'organisation informatique ou simplement sur Google.

1
nikhiltejadonkana