Aller au contenu principal

Tableaux et listes

Progression

#Tableaux et listes

Deux façons d’aligner des éléments en mémoire racontent deux histoires différentes. Le tableau dynamique est une étagère d’emplacements contigus: on sait pointer directement le 37ᵉ, ce qui rend l’accès indexé très rapide et “amical” pour les caches. Mais insérer en plein milieu oblige à décaler ceux à droite.

La liste chaînée est un sentier balisé: chaque maillon connaît le suivant. Glisser un nouveau maillon entre deux existants est facile si vous êtes déjà au bon endroit; en revanche, accéder au 37ᵉ impose de suivre 36 flèches — et les sauts en mémoire perdent le bénéfice des caches.

#Quand l’un brille plus que l’autre

  • Beaucoup d’accès par index, parcours séquentiels, ajouts en fin: privilégiez un tableau dynamique. Le redimensionnement par facteur (×2 classiquement) rend l’append amorti O(1).
  • Insertions locales fréquentes ou suppressions en tête: une liste ou une structure dédiée (deque) est plus adaptée.

#Exemple guidé (insertion triée)

pythonpython
1# Pseudo‑code pour insertion triée dans une liste chaînée2def insert_sorted(head, x):3    if not head or x < head.val:4        return Node(x, head)5    cur = head6    while cur.next and cur.next.val < x:7        cur = cur.next8    cur.next = Node(x, cur.next)9    return head

#Visualiser le coût d’une insertion

Tableau dynamique
Décalage (O(n)); si plein → ×2 et copie (amorti)
Liste chaînée
Insertion locale O(1) (recherche exclue)
Localité mémoire
Tableau profite du cache; liste: sauts coûteux

/>

#Cas pratiques (Python)

  • list: tableau dynamique; indexation O(1), append amorti O(1), insert(i,x) O(n).
  • collections.deque: file/pile à haut débit en tête/queue (append, popleft O(1)); pas d’accès indexé rapide.
  • numpy.ndarray: bloc contigu typé, idéal pour le calcul numérique et la vectorisation.
Pièges fréquents
  • Insérer souvent au début d’une list → préférez deque.
  • Itérer des listes chaînées d’objets lourds → localité médiocre, ralentissements.
  • Copier de gros tableaux inutilement → recherchez des opérations in‑place.

#Mini‑exercice (5 minutes)

Implémentez une file FIFO en Python de deux manières: (1) list avec append/pop(0), (2) deque avec append/popleft. Mesurez le temps pour 100 000 opérations et comparez.

Quelle structure convient le mieux à une file d’attente à haut débit ?
Quelle structure convient le mieux à une file d’attente à haut débit ?