Est-ce que ArrayList
est un tableau ou une liste en java? Quelle est la complexité temporelle de l'opération get, est-ce O(n)
ou O(1)
?
Un ArrayList
en Java est un List
soutenu par un array
.
La méthode get(index)
est une opération à temps constant, O(1)
,.
Le code tout droit sorti de la bibliothèque Java pour ArrayList.get(index)
:
public E get(int index) {
RangeCheck(index);
return (E) elementData[index];
}
Fondamentalement, il renvoie simplement une valeur directement à partir du tableau de sauvegarde. (RangeCheck(index)
) est aussi un temps constant)
Son implémentation est réalisée avec un tableau et l'opération get est O (1).
javadoc dit:
La taille, isEmpty, get, set, Les opérations iterator et listIterator sont exécutées avec une constante temps. L'opération add s'exécute dans temps constant amorti, en d'autres termes, l'ajout de n éléments nécessite O(n) temps. Toutes les autres opérations courir en temps linéaire (grosso modo). Le facteur constant est faible comparé à celle de l'implémentation LinkedList.
Comme tout le monde l’a déjà fait remarquer, les opérations de lecture ont une durée constante - O(1), mais les opérations d’écriture risquent de manquer d’espace dans le tableau de sauvegarde, de procéder à une nouvelle affectation et à une copie - de sorte qu’elles s'exécutent dans O(n) fois, comme le dit la doc:
La taille, isEmpty, get, set, iterator, et les opérations listIterator s'exécutent dans temps constant. L'opération add s'exécute en temps constant amorti, c'est-à-dire l'ajout de n éléments nécessite O(n) temps. Toutes les autres opérations sont exécutées temps linéaire (en gros). Le facteur constant est faible comparé à celle de la LinkedList la mise en oeuvre.
En pratique, tout est O(1) après quelques ajouts, car le tableau de fond est doublé chaque fois que sa capacité est épuisée. Donc, si le tableau commence à 16, est plein, il est réaffecté à 32, puis à 64, 128, etc., de sorte qu'il s'adapte correctement, mais GC peut se déclencher lors d'un grand realloc.
Pour être pédant, c'est une List
soutenue par un tableau. Et oui, la complexité temporelle pour get()
est O (1).
Juste une note.
La méthode get(index)
est une heure constante, O(1)
Mais c'est le cas si nous connaissons l'index. Si nous essayons d'obtenir l'index en utilisant indexOf(something)
, cela coûtera O(n)