Beruflich Dokumente
Kultur Dokumente
ORSAY
Algorithmique : Volume 6
Recherche Adressage dispers Tris Complexit
Recherche
2003-2004
Recherche
Problme gnral abstrait ensemble de valeurs E, lment a; rponse: boolen plus gnralement existe-t-il x vrifiant certains critres (x) { xE | j(x)} trouver tous les x satisfaisant certains critres est-ce que a E? (x) { xE | x=a }
2003-2004
Recherche en informatique
On ne travaille pas sur des ensembles mathmatiques, mais sur des structures de donnes particulires Les donnes peuvent tre de nature complexe (agrgats, classes) Exemples : tableau
20 18 9 5 24 13 27 2 8 32 7 12 36 15 17 19
tableau tri
2 5 7 8 9 12 13 15 17 18 19 20 24 27 32 36
Algorithmique 6 : Recherche, complexit, tris 4 2003-2004
27
32
36
2003-2004
Chaque structure a des avantages et des inconvnients : tableau, tableau tri, arbre binaire, liste chane, etc.
2003-2004 Algorithmique 6 : Recherche, complexit, tris 7
Recherche squentielle
fonction rechSeq (tab , nbre , val) retourne (boolen)
{renvoie VRAI si val est dans tab, FAUX sinon}
paramtre s (D) tab: tableau[1, MAX] d'entiers (D) nbr, val: entier variables trouv: boolen i: entier dbut trouv faux i 0 tant que non trouv ET i < nbr faire i i+ 1 trouv (tab[i] = val) ftq retourne (trouv) fin 2003-2004 Algorithmique 6 : Recherche, complexit, tris
fonction rechSeq (tab, nbre, val) retourne(entier) {renvoie le premier indice o se trouve val dans tab, -1 sinon} paramtre s (D) tab: tableau [1, MAX] d'entiers (D) nbr, val: entier variables trouv: boolen i: entier dbut trouv faux i0 tant que non trouv ET i < nbr faire i i+1 trouv (tab[i] = val) ftq si trouv alors retourne (i) sinon retourne (-1) fsi fin
2003-2004 Algorithmique 6 : Recherche, complexit, tris 9
paramtre s (D) tab_d: tableau [1, MAX] d'entiers, nbr_d, val: entier (R) tab_r: tableau [1, MAX] d'entiers, nbr_r: entier variables id, ir: entiers dbut ir 0 pour id l nbre_d faire si (tab_d[id] val) alors irir+ 1 tab_r[ir] tab_d[id] fsi fpour fin
2003-2004 Algorithmique 6 : Recherche, complexit, tris 10
paramtre s (D) tab : tableau [1, MAX] d'entiers, nbr : entier variables i, min : entiers dbut imin tab[l] pour id 2 nbre faire si (tab[i] < min) alors min tab[i] fsi fpour retourne (tab[min]) fin
2003-2004 Algorithmique 6 : Recherche, complexit, tris 11
paramtre s (D) tab: tableau [1, MAX] d'entiers, nbr: entier variables i, imin, min: entiers dbut min tab[1] imin 1 pour id 2 nbre faire si (tab[i] min) alors min tab[i] imin i fsi fpour retourne (imin) fin
2003-2004 Algorithmique 6 : Recherche, complexit, tris 12
paramtre s (D) tab: tableau [1, MAX] d'entiers (D) nbr, val: entier variables trouv, dpass : boolens ; i : entier dbut trouv faux; dpass faux; i 0 tant que non (trouv OU dpass) ET i < nbr faire i i+ 1 trouv (tab[i] = val) dpass (tab[i] > val) ftq si trouv alors retourne (i) sinon retourne(-1) fin
2003-2004 Algorithmique 6 : Recherche, complexit, tris 13
Recherche dichotomique
Rappel: les valeurs doivent tre tries !
2 5 7 8 9 12 13 15 17 18 19 20 24 27 32 36
Principe: on vise au milieu du tableau si l'lment vis est plus grand que val, il suffit de chercher gauche ; s'il est plus grand, il suffit de chercher droite
2003-2004 Algorithmique 6 : Recherche, complexit, tris 14
12 13 15 17 18 19 20 24 27 32 36
12 13 15 17 18 19 20 24 27 32 36
2003-2004
15
12 13 15 17 18 19 20 24 27 32 36
12 13 15 17 18 19 20 24 27 32 36
2003-2004
16
Recherche dichotomique
fonction rechDicho (tab, nbre, val) retourne(entier)
{renvoie un indice o se trouve val s'il est dans tab, -1 sinon}
(D) tab : tableau [1, MAX] d'entiers (D) nbr, val : entier variables trouv : boolen ; id, if, im: entiers dbut trouv faux; id 0 ; if nbre + 1 tant que non trouv ET (if - id) > 1 faire im (id + if)/2 trouv (tab[im] = val) si (tab[im] > val) alors if im sinon id im fsi ftq si (id = 0) alors retourne (-1) sinon si (tab[id]=val) alors retourne(id) sinon retourne (-1) fsi fsi 2003-2004 Algorithmique 6 : Recherche, complexit, tris fin
paramtre s
17
Simulation de recherche
20 18 9 5 2 8 7 15 12 17 19 13 24
27
32
36
2003-2004
21
2003-2004
22
Adressage Dispers
2003-2004
23
Adressage dispers
Objectif: classer M lments dans un tableau
Principe: dans un tableau de p cases, on classe l'lment x, lindice k, donn par une fonction d'adressage h
- classer un lment x entier k, compris entre 1 et p
Fonction h:
h(x)=k
h1("MmeDupont")=9
h2(100 340) = 8
x : entier h2(x) = somme de ses chiffres dcimaux x : entier h3(x)= nombre de bits 1 dans l'criture binaire
h3(342) = h3(101010010) = 4
x : chane de caractres
h4(x) = somme des codes ASCII des caractres de la chane
25
Jo
1 2
Ali
3
Izabelle
8
Constatations :
- la valeur k ne dpend que de l'lment x ; - la place de l'lment x n'est pas dtermine relativement aux autres lments classs... - ... la diffrence d'un tri avec relation d'ordre o la place d'un lment est dtermine par le nombre d'lments "meilleurs" selon cet ordre.
26
Marc Paule
1 2 3 4
Jo
5
Izabelle Michle
6 7 8
Jeanne
9
27
28
29
Exemples (avec h5 )
Recherche de "Isabelle"
- code associ par h5 : 1 et tabAdrDisp [1] "Isabelle " recherche ngative
Ajout de "Ali"
- code associ par h5 : 8 ; tabAdrDisp [8] : " " ajout possible
Ajout de "Lola"
- code associ par h5 : 2 ; or tabAdrDisp [2] : "Paule" collision
Marc Paule
1 2 3 4
Jo
5
Izabelle Michle
6 7
Ali
8
Jeanne
9
30
Jeanne
31
33
Exemples (avec h5 )
Marc Paule Lola
1 2 3
Isabelle
4
Jeanne
9
X
1
Paule Lola
2 3
Isabelle
4
Jeanne
9
X
1
Jeanne
9
X
1
Paule Lola
2 3
Isabelle
4
Jo Izabelle Michle
5 6 7
X
8
Jeanne
9
34
Algorithme d'ajout d'un lment entr en collision : rechercher une place libre dans la zone de dbordement et y placer l'lment entr en collision
35
Exemple
Ajout de Lola (code associ par h5 : 2) puis de Isabelle (code associ par h5 : 1)
Marc
1
Paule
2 3 4
Jo
5
Izabelle Michle
6 7
Ali
8
Jeanne
9
Lola
10
Isabelle
11 12 13 14 15
36
Recherche
1) on calcule le code associ cet lment x par la fonction d'adressage, soit p
2) on compare le contenu de la p-ime case de la table avec l'lment x : si identit, la recherche est positive, sinon on mne une recherche squentielle dans la zone de dbordement du tableau
37
et retrait
1) on calcule le code associ cet lment x par la fonction d'adressage, soit p 2) on compare le contenu de la p-ime case de la table avec l'lment x : si identit, on le supprime puis on place dans cette case une marque pour indiquer que l'lment supprim a pu provoquer d'ventuelles collisions si non identit, poursuivre la recherche squentiellement en cas d'ventuelles collisions, dans la zone de dbordement du tableau
38
Exemples
Marc
1
Paule
2 3 4
Jo
5
Izabelle Michle
6 7
Ali
8
Jeanne
9
Lola
10
Isabelle
11 12 13 14 15
Recherche de Ali (h5 : 8), puis Lola (h5 : 2) Retrait de Marc (h5 : 1) Recherche Isabelle (h5 : 1)
39
40
Paule
2 3 4
Jo
5
Izabelle Michle
6 7
Ali
8
Jeanne
9
Lola
41
Exemples (suite)
ajout de Isabelle (1)
Marc
1
Paule
2 3 4
Jo
5
Izabelle Michle
6 7
Ali
8
Jeanne
9
Isabelle
Lola
Paule
2 3 4
Jo
5
Izabelle Michle
6 7
Ali
8
Jeanne
9
Jos Isabelle
Lola
42
2) on compare le contenu de la premire information de la p-ime case de la table avec l'lment x si identit, la recherche est positive ; sinon, on mne une recherche squentielle dans la liste associe
Marc
1
Paule
2 3 4
Jo
5
Izabelle Michle
6 7
Ali
8
Jeanne
9
Jos
Lola
Isabelle
43
Paule
2 3 4
Jo
5
Izabelle Michle
6 7
Ali
8
Jeanne
9
Jos
Lola
Isabelle
fin
fonction code (uneChane) retourne (entier)
{retourne la valeur donne par la fonction dadressage}
paramtres (D/R) table: tableau [1, TAILLEMAX] de Info2 (D) laChane : chane variables ok: boolen ind: entier dbut ind code(laChane) si table[ind].principal = " " alors {c'est la premire occurrence de ce code d'adressage} table[ind].principal laChane sinon {il y a collision: la place principale est dj occupe, do
ajout dans la liste de dbordement,en tte}
fin
46
paramtres (D) table: tableau [1, TAILLEMAX] de Info2 (D) laChane : chane variables trouv, ok: boolens; ind : entier dbut ind code(laChane) trouv table[ind].principal = laChane si non trouv {recherche de laChane dans la liste de dbordement} alors table[ind].dbord.premier() tant que non trouv et non table[ind].dbord.horsListe() faire trouv (table[ind].dbord.info() = laChane) table[ind].dbord.suivant() ftq fsi retourne (trouv) 47 fin
paramtres (D/R) table: tableau [1, TAILLEMAX] de Info2 (D) laChane : chane variables ok : boolen; ind : entier dbut ind code(laChane) trouv (table[ind].principal = laChane) si trouv {alors retrait de laChane du champ principal de la table} alors retraitPrincipal (table, laChane, ind) sinon {recherche, et ventuel retrait, de laChane dans la liste de
dbordement}
paramtres (D/R) table: tableau [1, TAILLEMAX] de Info2 (D) laChane : chane; ind : entier variables elt : Info2; ind : entier dbut si (table[ind].dbord.vide()) {il ny a pas eu de collision sur ce code} alors {ce code nadresse plus aucune chane} table[ind].principal " " sinon {on rcupre llment en tte de liste de dbordement} table[ind].dbord.premier() ; elt table[ind].dbord.info()
{pour mettre sa valeur dans le champ principal}
table[ind].principal elt
fsi fin
table[ind].dbord.supprimer()
49
2003-2004
51
2003-2004
52
2003-2004
53
Complexit asymptotique
Ncessit d'tudier la complexit pour de grosses quantits de donnes Exemple : deux algorithmes pour une mme tche:
- A1 effectue n2 oprations de base, A2 effectue n.log2 n oprations
Deux machines :
- M1 effectue 210 (environ mille) oprations par sconde - M2 effectue 220 (environ un million d') oprations par seconde
2003-2004
54
2003-2004
55
2003-2004
56
Notations utilises
Grand O
f(n) = 0(g(n)) s'il existe C> 0 et no > 0 tels que f(n) C. g(n) pour tout n no
Grand omga
f(n) = (g(n)) s'il existe C> 0 et no > 0 tels que
f(n) C. g(n) pour tout n no
Grand thta
f(n) = (g(n)) s'il existe C1 et C2 > 0 et no > 0 tels que
C1.g(n) f(n) C2. g(n) pour tout n no
2003-2004 Algorithmique 6 : Recherche, complexit, tris 58
Exemples
f(n) = O(1) f est majore f(n) = (1) f est minore 3n+2 = O(n) 3n+3 = O(n) 100n+6 = O(n) 10n2+4n+2=O(n2) 3n+3 = O(n2) 1000n2 + 100 n -6 = O(n2) 10n2+4n+2= O(n4) 6*2n + n2 = O(2n) ----> c'est la plus petite fonction g(n) qui est intressante
2003-2004 Algorithmique 6 : Recherche, complexit, tris 59
Exemples (suite)
3n+3 = (n) 100n+6 = (n) 10n2+4n+2= (n2) 6*2n + n2 = (n2) 6*2n + n2 = (n) 6*2n + n2 = (1) ----> c'est la plus grande fonction g(n) qui est intressante
2003-2004
60
Temps exponentiel
2003-2004
O(cn)
( viter en gnral)
61
2003-2004
62
Calcul de la valeur d'un polynme en un point (2) p a[0] xpi 1 pour i 1 n faire xpi xpi * x p p + a[i]* xpi fpour
2n multiplications, n additions : algorithme en O(n)
2003-2004
63
Calcul de la valeur d'un polynme en un point (3) p a[n] pour i n - 1 0, pas -1 faire p p*x + a[i] fpour
n multiplications, n additions algorithme en O(n)
2003-2004
64
Oprations lmentaires retenues: les comparaisons 1. Recherche squentielle dans un tableau non tri
complexit au pire n comparaisons complexit moyenne n/2 comparaisons algorithme en O(n) complexit au pire n comparalsons complexit moyenne n/2 comparaisons algorithme en O(n)
Algorithmique 6 : Recherche, complexit, tris 65
2003-2004
Exemple avec n = 8 = 23
niveau 0 niveau 1 niveau 2 niveau 3
tableau de 8 lments
Tris
2003-2004
67
Tris
Donnes dans un ensemble d'lments S muni d'un ordre total ordre | a<a (rflexif) partiel | a < b et b < c => a < c (transitif) | a ~ b et b < a => a = b (antisymtrique) total | a,b a=b OU a<b OU b<a (total) Problme du tri lments al, ..., an ~ S donns trouver une permutation p: { 1, . . ., n} { 1, . . .,n} telle que ap(1) ap(n)
En gnral, on s'intresse plutt au rsultat de l'application de p
2003-2004 Algorithmique 6 : Recherche, complexit, tris 68
Exemple m = 10, 4 7 3 2 8 1 5
1 0 1 2 2 3 3 4 4 5 5 6 7 7 8 8 9
Rsultat: 1, 2, 3, 4, 5, Estimation du cot : chaque lment peut tre plac dans une file en temps constant, d'o O(n) pour les n lments ; concatnation de m files en O(m) ; si m = 0(n), cot total en O(n).
2003-2004
70
Cette mthode peut tre gnralise des k-uplets d'entiers munis de l'ordre lexicographique, et plus gnralement des chanes (de longueur variable): (s1,..., sp) < (t1,..., tq) si et seulement si
ou bien p < q et si = ti pour 1 i p (s est un prfixe de t); ou bien il existe j tel que si < tj et si = ti pour tout i < j.
Pour des suites de k-uplets dont chaque composante est un entier entre 0 et m-l, on obtient un algorithme de cot O((m+n)k).
2003-2004
71
Cas gnral: on trie des lments quelconques munis d'un ordre (total) la seule opration disponible est la comparaison de deux lments Exemple: tri de trois lments a, b, c
a<b b<c a<c a<c b<c
a, b, c a, c, b
b, a, c
c, a, b
b, c, a
c, b, a
2003-2004
72
Estimation du cot
Arbre binaire de hauteur h => au plus 2h feuilles
Thorme Un arbre de dcision pour n lments a une hauteur suprieure ou gale log(n!).
- En effet, un arbre de dcision doit avoir au moins autant de feuilles que de rsultats possibles, c'est--dire n! feuilles au moins. Donc la hauteur de cet arbre est log(n!)
Estimation
Formule de Stirling: n! approxim par (n/e)n, donc le nombre de tests ncessaires est minor par n(logn - log e) = nlog n -1,44n
liste trie
case courante
liste trie
reste trier
2003-2004
74
20
18
24
13
27
32
12
36
15
17
19
2003-2004
75
fpour fin
2003-2004 Algorithmique 6 : Recherche, complexit, tris 76
liste trie
reste trier
2003-2004
78
20
18
24
13
27
32
12
36
15
17
19
2003-2004
79
fpour fin
80
paramtre s (D/R) tab: tableau [1, MAX] d'entiers (D) nPlace, indVal: entiers variables indDuMin, ind, deCt: entiers dbut deCt tab[indVal]
{faire un trou au rang nPlace en dcalant les valeurs qui suivent d'un rang vers la droite}
pour ind indVal nPlace + 1 pas -1 faire tab[ind] tab[ind-1] fpour tab[nPlace] deCt fin
2003-2004 Algorithmique 6 : Recherche, complexit, tris 81
Simulation du dcalage
2003-2004
82
paramtre s (D) tab: tableau [1, MAX] d'entiers (D) nbr, indV: entiers variables dpass: boolen; i, val, nbValTries: entiers dbut val tab[indV]; nbValTries indV - 1 dpass faux; i 0 tant que i < nbValTries ET non dpass faire ii+ 1 dpass (tab[i] > val) ftq si dpass alors retourne (i) sinon retourne (i+l) fsi fin
2003-2004 Algorithmique 6 : Recherche, complexit, tris 83
2003-2004
84
paramtre s (D) tab: tableau [1, MAX] d'entiers (D) nbr, indV: entiers variables id, if, im, val: entiers dbut val tab[indV]; id 0 if indV + 1 tant que if - id > 1 faire im (id + if)/2 si (tab[im] > val) alors if im sinon id im fsi ftq retourne (id + 1) fin
2003-2004 Algorithmique 6 : Recherche, complexit, tris 85
2003-2004
86
Tris indirects
Problme : tri sur diffrents critres On veut mmoriser les rsultats des tris par nom, par taille, par date
Rep[1]
nom taille date
2003-2004
Rep[2]
toto.o 3 456 13.04.01
Rep[3]
toto 5 248 15.04.1
88
3 2 1
1 3 2
2 1 3
89
Fin du volume 6
2003-2004
91