chapitre iii. algorithmique élémentaire des tableaux...

37
Chapitre III. Algorithmique élémentaire des tableaux (recherche, tri) -Définition -Recherche séquentielle -Recherche dichotomique -Tri (insertion, sélection, à bulles, fusion, Dijkstra) -Utilisation des tableaux de nombres : histogrammes, matrices 1

Upload: trinhhanh

Post on 16-Sep-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

Chapitre III. Algorithmique élémentaire des tableaux

(recherche, tri) -Définition -Recherche séquentielle -Recherche dichotomique -Tri (insertion, sélection, à bulles, fusion, Dijkstra) -Utilisation des tableaux de nombres : histogrammes, matrices

1

Définition des tableaux

•  Tableau : collection d’objets de même type Type Element = Enregistrement

Début clé : entier;

inf1 : chaîne de caractères; inf2 : réel;

…. Fin Enregistrement; Var Tab[1..N] Tableau des Element;

•  Problèmes : –  Recherche des éléments (par clé) –  Tri (une relation d’ordre est définie sur l’ensemble des

clés) 2

Recherche séquentielle

•  La recherche ne porte que sur la valeur de la clé – « recherche associative »

•  Lorsqu'on recherche une clé qui est présente on parle de recherche positive (variétés des algorithmes : plusieurs occurrences, - première, dernière, toutes)

•  S’il n’existe pas de solution, la recherche se termine sur un échec et ne rend pas de résultat. On parle de recherche négative

3

Recherche séquentielle dans un tableau non trié (1)

Var L: tableau[1…n] des entiers X: entier

j: entier Début j:=1 TQ (j<=n et L[j]!=X) faire j:=j+1; FTQ Si j>n alors j:=0 Fsi

•  Complexité Moy?

4

Recherche séquentielle dans un tableau non trié (2)

•  Opération fondamentale : comparaison •  Probabilités qu’un élément se trouve à la ième

place :

•  Probabilité qu’un élément ne se trouve pas dans le tableau :

•  Coût moyen (nombre de comparaisons)

nqqq ,...,, 21

p

11

=+∑=

n

iiqp

pnnqqqnMoy n )1(...21)( 21 ++++⋅+⋅=

5

Recherche séquentielle dans un tableau non trié (3)

•  Recherche positive (on sait que la clé recherchée se trouve dans le tableau), places équiprobables :

•  Coût moyen minimal : Si lorsque les éléments les plus

recherchés sont au début du tableau •  Si plusieurs recherches, il est possible de faire évoluer le

tableau de sorte que les éléments les plus recherchés se trouvent au début – recherche autoadaptative –  M1. Après chaque recherche, placer l’élément

recherché en tête (début) –  M2. Faire progresser l’élément recherchée d’une

place vers le début. –  M1 est meilleure pour les listes chaînées, M2 pour les

tableaux.

2/)1()( += nnMoy

nqqq ≥≥≥ ...21

6

Recherche séquentielle dans un tableau trié (1)

•  (1) Dénotons probabilités que l’élément recherché X se trouve à la ième place

•  (2) Probabilités que X soit strictement compris entre j-ème et j+1-ème, j=1,..,n-1

Probabilités que X soit strictement inférieur (resp. supérieur) au premier (resp. au dernier)

•  (3)

nqqq ,...,, 21

jp

npp ,0

1..... 110 =++++++ nn qqppp7

Recherche séquentielle dans un tableau trié(2)

•  •  Cas particulier : recherche positive (pj=0),

toutes les places sont équiprobables (qj=1/n) :

•  Comme c’est le cas de recherche dans un tableau non-trié

•  Complexité

( ) jnjni

i pjiqnMoy ∑∑≤≤≤≤

++=01

1)(

2/)1()( += nnMoy

( )nΘ8

Recherche dichotomique

•  Recherche d’un élément X dans un tableau trié (on supposera l’ordre croissant)

•  Principe : comparer avec l’élément du milieu m du tableau (tab[m])

•  Si X=tab[m] , la solution est trouvée, arrêt •  Si X>tab[m], il est impossible que X se trouve avant m

dans le tableau et il ne reste à traiter que la moitié droite du tableau

•  Si X<tab[m], X ne peut se trouver que dans la moitié gauche du tableau.

On continue ainsi la recherche, en diminuant de moitié le nombre d’éléments de la liste restant à traiter, après chaque comparaison , et si on recherche X dans un tableau ne contenant aucun élément, la recherche se termine sur un échec : X n’est pas dans le tableau.

9

Recherche dichotomique. Version récursive

Procédure dichot(val X : élément; tab : tableau[1..n] des entiers, g,d : entiers, ref res : entier) {cette procédure renvoie soit l’indice de X dans le tableau soit 0. A

l’appel g=1 et d=n} var m : entier Début

Si g<d alors

m:=(g+d)/2 {division entière} Si X=tab[m] alors res:=m sinon Si X<tab[m] alors dichot(X,tab,g,m-1,res) sinon dichot(X,tab,m+1,d,res) FinSi FinSi sinon res:=0 FinSi Retourner res

Fin dichot

10

Version récursive. Eléments d’analyse

•  Rappel : Une procédure(fonction) récursive s’appelle récursive terminale si il n’y a aucun traitement à exécuter après chacun des appels à elle-même qu’elle contient

•  Transformation en version itérative

Procédure P(U) Debut Si C alors traite; P(a(U)); sinon Terminaison; Fin P

Procédure P(V) Var U; Debut Tant que C faire traite; U=a(U); FinTq Terminaison; Fin P

11

Version Récursive. Complexité

•  Opération fondamentale : comparaison

•  L’itération atteint 1 quand •  donc i = (ou dépasse)

•  Ainsi : la recherche dichotomique représente une amélioration importante par rapport à la recherche séquentielle

⎣ ⎦ 1)2/()( += nTnT

⎣ ⎦ ⎣ ⎦( ) ⎣ ⎦( )( )⎣ ⎦ )1(...11....8/111

1)8/(111)4/(11)2/()(Θ+++=+++

=+++=++=+=

nTnTnTnTnT

⎣ ⎦ 12/ =innlg

( )nnT lg)( Θ=

12

Tri (sélection, insertion, à bulles, fusion, Dijkstra)

(1) Tri par sélection

•  Principe : on recherche le minimum dans la

partie restante du tableau et on l’échange avec l’élément qui suit la partie déjà triée.

•  Après k placements les k plus petits éléments du tableau sont déjà à leur place définitive

G

13

Tri par sélection avec recherche séquentielle du minimum (1) •  Algorithme itératif

Procédure tri-select-iter(ref tab: tableau [1..n] des entiers) Var i,j,k : entiers Début

i:=1; Tant que i<n faire

j:=i; Pour k:=i+1 à n faire {boucle de recherche de min } Si tab[k]<tab[j] j:=k; FinSi FinPour échanger(tab[j], tab[i]); i:=i+1; FinTantque Fin tri-select-iter

14

Tri par sélection avec recherche séquentielle du minimum (2) •  Version récursive

Procédure tri-select(ref tab: tableau [1..n] des entiers, val i : entier) { appel avec i=1} Var i,j,k : entiers Début

Si i<n alors {recherche séquentielle du minimum} Pour k:=i+1 à n faire {boucle de recherche de min } Si tab[k]<tab[j] j:=k; FinSi échanger(tab[j], tab[i]); {tri de la fin du tableau} Tri-select(tab, i+1)

Fin tri-select

15

Analyse de complexité

•  Opération fondamentale : comparaison. •  Pour tout tableau de taille n le nombre de comparaisons pour

trouver le minimum est n-1 •  Maxc(n)=n-1+Maxc(n-1) pour n>1 et •  Maxc(1)=0 •  En itérant

•  Le nombre de comparaisons ne dépend pas de la valeur des éléments

( ) ( ) ( ) 2/111

1

−=+= ∑−

=

nniMaxnMaxn

iCC

( ) ( ) ( )221 nnnMoynMax CC Θ=

−==

16

Tri (sélection, insertion, à bulles, fusion, Dijkstra)

(2) Tri par insertion

•  Principe : à la i-ème étape on insère le i-ème élément à son rang parmi les i-1 éléments précédents qui sont déjà triés entre eux.

•  Après la i-ème étape les i plus petits éléments du tableau ne sont pas forcément à leur place

•  Tri de « joueur des cartes »

G

17

Tri par insertion: version récursive

Procédure tri-insert(réf tab: tableau [1..n] des entiers, val i : entier) Var k,x : entiers Début Si i>1

alors tri-insert(tab,i-1) {tri du début de la liste}

{recherche de la place de tab[i]} k:=i-1; x:=tab[i]; Tant que k>0 et tab[k]>x faire tab[k+1]=tab[k]; {décalage des éléments} k:=k-1; FinTantQue {on a tab[k] < x; la place de x est k+1} tab[k+1]:=x; FinSi Fintri-insert 18

Analyse •  La procédure n’est pas récursive terminale •  (transformer en itérative est une tâche plus complexe) •  Complexité dans le pire des cas : le tableau est trié dans l’ordre

décroissant •  Pour un tableau de n éléments on doit faire n-1 comparaisons après

l’appel de tri-insert(tab,i-1) (sans compter la comparaison de k avec 0)

•  Maxc(n)=n-1+Maxc(n-1) pour n>1 et •  Maxc(1)=0 •  ou si on compte le test de dépassement de la borne* * Sinon on peut utiliser la technique de sentinelle et insérer un élément inférieur à tous les éléments

du tableau à tab [0]

( ) ( ) ( )221 nnnnMaxC Θ=

−=

( ) ( )nMoynMax CC ≠

( ) ( ) ( )21 nnnnMaxC Θ=−=

19

Tri (sélection, insertion, à bulles, fusion, Dijkstra)

(3) Tri à bulles

•  Principe : on parcourt le tableau en effectuant un

échange à chaque fois que l’on trouve deux éléments successifs qui ne sont pas dans le bon ordre.

•  Il existe plusieurs versions –  tri à bulles avec parcours du début à la fin avec 2

boucles Pour imbriquées; –  tri à bulles amélioré (on retient l’indice de la dernière

permutation); –  tri « shaker » - deux parcours du début à la fin, et

inversement; –  tri avec parcours de la fin au début; 20

Tri à bulles

Procédure tri-bulles(réf tab : tableau[1..n] d’entiers); Var i,j : entiers; Début i:=1; Tant que i<n faire Pour j:=n jusqu’à i+1 par pas -1 faire Si tab[j]<tab[j-1] alors échanger(tab[j],tab[j-1]) FinSi FinPour i:=i+1; FinTantque Fintri-bulles

21

Analyse

•  Après k pas, les k plus petits éléments du tableau sont à leur place définitive.

•  Le nombre de comparaisons •  Maxc(n)=n-1+Maxc(n-1) pour n>1 et •  Maxc(1)=0•  Maxc(n)=Moyc(n)

( ) ( ) ( )221 nnnMoynMax CC Θ=

−==

22

Tri (sélection, insertion, à bulles, fusion, Dijkstra)

(4) Tri par fusion

…. ….

23

Algorithme de tri par fusion (2)

Procédure Tri-Fusion(val A,p,r) Var q : entier Début Si p<r

Alors Tri-Fusion(A,p,q) Tri-Fusion(A,q+1,r)

Fusionner(A,p,q,r) FinSi

Fin Tri-Fusion

( )⎣ ⎦2/rpq +←

24

Fusion de deux tableaux ordonnés

•  Interclassement des deux tableaux : étant donnés un tableau tab1 de n éléments et un tableau tab2 de m éléments, il s’agit de construire un tableau tab3 trié, qui contient la réunion des éléments de tab1 et tab2 en conservant les répétitions.

•  On utilisera la technique de sentinelle : dans la dernière case des tableaux augmentés (n+1) et (m+1) on insérera un élément maxelt d’emblée plus grand que les autres. 25

Fusion de deux tableaux ordonnés

Procédure fusion-tab(réf tab1: tableau [1…n+1] d’éléments; réf tab2: tableau [1…m+1] d’éléments; réf tab3: tableau [1…n+m] d’éléments) Var i,j,k: entiers; Début i:=1;j=1;k:=1; tab1[n+1]:=maxelt; tab2[m+1]:=maxelt; Tant que k< m+n faire Si tab1[i]<tab2[j] alors tab3[k]:=tab1[i]; i:=i+1; sinon tab3[k]:=tab2[j]; j:=j+1; FinSi k:=k+1; FinTantQue Finfusion-tab

26

Analyse de complexité du tri-fusion

1.  Fusion: MaxNbr de tours de la boucle Tq = n+m•  Lors de chaque tour on a une comparaison et 2 affectations. •  Donc Max(n+m)=

2.  Tri-fusion: •  avec a=b=2

•  D’après le théorème général, cas 2 (cf. chap II)

• 

)()( mnmnT +Θ=+

)()2/(2)(, NNTNTmnN Θ+=+=

)()/()( log abNbNaTNT Θ+=

( ) ( ) ( )NNNNNT ab lglglog Θ⇒Θ=

27

Tri (sélection, insertion, à bulles, fusion, Dijkstra)

(5) Algorithme de Dijkstra à deux couleurs •  Supposons que dans un tableau nous avons des

nombres pairs et impairs (ou des objets de deux couleurs)

•  Problème : placer les nombres pairs au début du tableau et les nombres impairs à la fin.

28

Tri de Dijkstra à deux couleurs

P1: A gauche de l’indice G tous les objets sont

rouges P2: A droite de l’indice D tous les objets sont bleus Problème : combler la zone d’incertitude

G D

29

Tri de Dijkstra à deux couleurs(2) •  Faire décroitre la zone d’incertitude en conservant la validité des

conditions •  G:=0;D:=N •  Tant que G<D

–  Tant que (G<D && T[G+1] rouge) –  G:=G+1; –  FTQ –  Tant que (D>G&& T[D] bleu)

D:=D-1; FTQ

Si (G<D) alors

permuter T[G+1] et T[D]; G:=G+1; D:=D-1; fin-Si Fin TQ

30

Utilisation des tableaux de nombres : histogrammes matrices

•  Tableau Hist [1…n] : permet de stocker les occurrences des valeurs d’une variable aléatoire X(t) : ai-1 < xi < ai

31 0

20

40

60

80

100

120

140

160

180

200

0 15 31 47 63 79 95 111 127 143 159 175 191 207 223 239 255

NbrP

NbrP

•  Problème : une variable aléatoire discrète prend des valeurs entières dans l’intervalle de 1…n.

•  Proposer un algorithme de calcul de

l’histogramme en

32

( )nΘ

Matrices

•  Une matrice peut être représentée par un tableau rectangulaire de nombres

•  Ex: A : tableau[1…3][1..2] des entiers •  La transposée d’un matrice A est la matrice At

en échangeant les lignes et les colonnes de A:

⎟⎟⎠

⎞⎜⎜⎝

⎛=

232221

131211

aaaaaa

A

⎟⎟⎟

⎜⎜⎜

=

2313

2212

2111

aaaaaa

At

33

Matrices et vecteurs

•  Vecteur est un tableau de nombres à une dimension Vect : tableau des entiers [1..n].

•  Vecteur colonne est équivalent à une matrice nx1, vecteur ligne est sa transposée.

•  Vecteur unité ei est le vecteur dont la i-ème composante est égale à 1 et toutes les autres composantes sont égales à 0;

• 

⎟⎟⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜⎜⎜

=

0...010

ie

34

Opérations sur les matrices

•  1. Addition •  2. Multiplication scalaire •  3. Soustraction

opposé de :

•  4. Multiplication

( ) ( )ijnmijnm bBetnjmiaA ==== ×× ,..1,,..,1, ( ) ijijijijnm bacBAcC +=+==× :

( ) ( )ijij aAaAR λλλ ==∈ ,

A ( )ijaAA −=⋅−=− 1( ) ( ) ijijijijnm bacBABAcC −=−+=−==× :( ) ( )ijnmijnm bBetaA == ×× ,

( ) ( )ijpnijnm bBetaA == ×× , ( ) jkij

n

jikikpm bacABcC ∑

=× ===

1:

35

Algorithme direct de multiplication de matrices

•  Fonction Multiplier_Matrices(réf A: tableau [1..m][1..n] d’entiers; ref B: tableau[1..n][1..p] d’entiers): tableau [1..m][1..p] d’entiers Var C: tableau [1..m][1..p] d’entiers; i,j,k: entiers; Début Pour i allant de 1 à m faire

Pour j allant de 1 à p faire C[i][j]:=0; Pour k allant de 1 à n faire C[i][j]:= C[i][k]+A[i][k]*B[k][j]; FinPour FinPour FinPour retourner C; FinMultiplier_Matrices

•  Complexité si A,B sont NxN

( )3NΘ36

37

0

20

40

60

80

100

120

140

160

180

200

0 15 31 47 63 79 95 111 127 143 159 175 191 207 223 239 255

NbrP

NbrP