3. Algorithmique 4 - Déplacement de zéro

3.1. Méthodes

On rappelle que le but de l'exercice est de déplacer dans un tableau d'entiers, les éléments de valeur 0 au début du tableau.

On définit deux méthodes pour déplacer ces éléments :

3.1.1. Méthode 1

On utilise deux indices :

dès que l'on trouve un élément égal à zéro, on le place à l'indice i0, puis on incrémente i0.

  1. proc put_zero_at_beginning( t is array[1..N] of int)
  2.  
  3.     variable i, i0 are int
  4.  
  5.     i0 = 1
  6.     for i in range(1,N) do
  7.         if t[i] = 0 then
  8.             swap t[i] with t[i0]
  9.             i0 = i0 + 1
  10.         end if
  11.     end for
  12.  
  13. end proc
  14.  

L'inconvénient majeur de cette méthode est qu'elle échange t[i] avec t[i0] avec i = i0 lorsqu'on a des éléments zéro au début du tableau.

3.1.2. Méthode 2

On modifie la méthode précédente pour chercher le premier élément qui n'est pas un zéro :

  1. proc put_zero_at_beginning( t is array[1..N] of int)
  2.  
  3.     variable i, i0 are int
  4.  
  5.     i = 1
  6.     i0 = 1
  7.    
  8.     while i <= N and t[i] = 0 do
  9.         i = i + 1
  10.     end while
  11.    
  12.     while i <= N do
  13.         if t[i] = 0 then
  14.             swap t[i] with t[i0]
  15.             i0 = i0 + 1
  16.         end if
  17.     end for
  18.  
  19. end proc
  20.  

3.2. Résultats

3.2.1. Résultats sur un tableau de 100 éléments

Voici quelques résultats avec un tableau de 100 éléments dont un tiers des éléments sont des 0.

On reporte le nombre d'affectations, de comparaisons et d'incrémentations, ainsi que le total de ces 3 opérations.

 Remplissage   Méthode   Affectations   Comparaisons   Incrémentations   Total 
 Aléatoire   Méthode 1   99   100   33   232 
 Aléatoire   Méthode 2   99   167   33   299 
 Que des 0   Méthode 1   300   100   100   500 
 Que des 0   Méthode 2   0   100   100   200 
 Sans 0   Méthode 1   0   100   0   100 
 Sans 0   Méthode 2   0   100   0   101 
Résultats en fonction du remplissage et de la méthode

On remarque que dans le cas ou le tableau ne comprend que des zéro, la méthode 2 engendre moins de calculs (200) alors que la méthode 1 en engendre 500.

3.2.2. Test de performance

A présent, un test de performance avec un tableau de 100 millions d'éléments dont un tiers des éléments sont des 0. Le processeur utilisé est un AMD Ryzen 5 5600G.

 Remplissage   Méthode   Affectations   Comparaisons   Incrémentations   Total   Temps (s) 
 Aléatoire   Méthode 1   99999999   100000000   33333333   233333332   0.240853 
 Aléatoire   Méthode 2   99999999   166666667   33333333   299999999   0.236566 
 Que des 0   Méthode 1   300000000   100000000   100000000   500000000   0.0919376 
 Que des 0   Méthode 2   0   100000000   100000000   200000000   0.0367108 
 Sans 0   Méthode 1   0   100000000   0   100000000   0.029863 
 Sans 0   Méthode 2   0   100000001   0   100000001   0.027379 
Résultats en fonction du remplissage et de la méthode