Adloun

Les tableaux

Cours · OCaml (option informatique), chapitre 5 · prépas MPSI et MP, option informatique · le début du chapitre, la suite sur Adloun

Le calcul scientifique avec NumPy : un tableau de nombres sur lequel les opérations agissent en bloc, axe par axe.

5.1 Introduction et motivation

La liste (chapitre 2) est la structure naturelle du style fonctionnel, mais elle a un défaut : accéder à son -ème élément coûte un parcours, proportionnel à . Quand on a besoin d'un accès direct — lire ou écrire la case d'indice en temps constant — on emploie le tableau. C'est une structure mutable et de taille fixe, cousine de la liste Python, et qui se marie naturellement avec les boucles du chapitre précédent.

iRemarqueNiveau A.2 : un rappel sera toujours fourni

Les tableaux et les fonctions du module Array relèvent des éléments « utilisables après rappel » du programme : en épreuve, leur documentation est fournie. On les présente donc ici avec leur signature, qu'il n'est pas exigé de mémoriser, mais qu'il faut savoir lire et utiliser.

5.2 Créer et lire un tableau

Un tableau littéral s'écrit entre [| et |], éléments séparés par des points-virgules. Son type est 'a array, et comme une liste il est homogène.


# let t = [| 10; 20; 30 |];;
val t : int array = [|10; 20; 30|]
# t.(0);;
- : int = 10
# Array.length t;;
- : int = 3

On accède à la case d'indice i par t.(i), en temps constant. Les indices vont de 0 à Array.length t - 1.

Attention

Un accès t.(i) avec i hors de l'intervalle lève l'exception Invalid_argument "index out of bounds" à l'exécution. Comme en Python, la moitié des bogues sur les tableaux sont des erreurs d'indice : on relit chaque borne en se demandant « la dernière case est-elle t.(n) ou t.(n-1) ? » — c'est t.(n-1).

5.3 Modifier un tableau

C'est la grande différence avec la liste : un tableau est mutable. L'instruction t.(i) <- v remplace le contenu de la case i par v ; sa valeur est ().


# let t = [| 10; 20; 30 |];;
# t.(1) <- 99;;
- : unit = ()
# t;;
- : int array = [|10; 99; 30|]

5.3.1 Construire un tableau

iRemarqueRappel des constructeurs (A.2)
  • Array.make n v : int -> 'a -> 'a array — un tableau de n cases, toutes initialisées à v ;
  • Array.init n f : int -> (int -> 'a) -> 'a array — un tableau de n cases, la case i valant f i ;
  • Array.copy t : 'a array -> 'a array — un nouveau tableau qui contient les mêmes éléments que t : copie superficielle, donc pour une matrice les lignes restent partagées (copier chaque ligne avec Array.map Array.copy m).

Exercices du chapitre

La suite du cours · Tous les exercices du chapitre