Sébastien Verel
vereli3s.unie.fr
www.i3s.unie.fr/
∼
verelÉquipeSoBi-UniversitédeNieSophia-Antipolis
16 mars2009
Objetifs de la séane 8
1
Reherhe itératived'un élémentdansuntableau
2
Reherhe dihotomiqued'unélément dansuntableau
3
Dénombrement d'un élémentdansuntableau
4
Dénombrement d'un élémentdansdeux tableauxen parallèle
Questions prinipales dujour :
Comment reherheret ompter desélémentsdansuntableau?
Caratéristiques de es strutures de données
De taillenie:
le nombremaximum de donnéesest déterminée
En général,lesdonnées sont"numérotables"(indexables)
On doit pouvoir aéder à unedonnée dontle rang(l'indie)
est déterminé
0 1 2 3 4 5 6 7 8
12 3 4 78 12 3 9 11 12
Délaration tableau
Délarationd'un tableaut de type typeElement aveN valeurs
variable t:tableau de N typeElement
0 1 2 3 4 5 6 7 8
12 3 4 78 12 3 9 11 12
variable t:tableau de 9entiers
Délarationd'un tableauontenant 12 aratères:
variable :tableau de 12 aratères
Délarationd'un tableauontenant n nombres réels:
variable tabReal:tableau de n réel
Leture des valeurs
leture de lavaleur d'indiei dutableau t
t
[
i]
0 1 2 3 4 5 6 7 8
12 3 4 78 12 3 9 11 12
t
[
3]
apour valeur78On peut réaliserdes alulsommeaveune variable
lassique :
t
[
3] +
10a pourvaleur 88t
[
7] +
t[
0]
apourvaleur 23Aetation des valeurs
Aetation dela valeura àlaase d'indiei dutableau t
t
[
i] ←
a0 1 2 3 4 5 6 7 8
12 3 4 78 12 3 9 11 12
t
[
3] ←
15t
[
2] ←
t[
0]
t
[
8] ←
t[
1]
2+
10 1 2 3 4 5 6 7 8
12 3 12 15 12 3 9 11 10
en Java
Délarationd'un tableaut de taille9 :
int[℄ t = new int[9℄;
Leture :
t[3℄ + 1;
Aetation:
t[4℄ = 6;
Algorithmes
rempliritérativementuntableau
alul de lamoyenne desnombres
alul de lasommedesarrés deséléments
reherhe dumaximumdutableau
Plan
1
Rappel
2
Reherhe d'un élément
3
Dénombrement
Reherhe itérative
Exemple
0 1 2 3 4 5 6 7 8
12 3 12 15 12 3 15 11 10
La valeurde reherhe
(
15,
t)
est VraiLa valeurde reherhe
(
17,
t)
est FauxReherhe itérative : langage algorithmique
Algorithme reherhe(x :entier,t:tableau d'entier):booleen
début
variable i:entier
variable b: booleen
b
←
Fauxpour ide 0 àt.taille -1 faire
si t
[
i] =
x alorsb
←
Vrainsi
npour
retournerb
n
Mais pas trèseae...
Exemple d'exéution
reherhe(15, t)
i
=
0 t[
i] =
12 b=
fauxi
=
1 t[
i] =
3 b=
fauxi
=
2 t[
i] =
12 b=
fauxi
=
3 t[
i] =
15 b=
vraii
=
4 t[
i] =
12 b=
vraii
=
5 t[
i] =
3 b=
vraii
=
6 t[
i] =
15 b=
vraii
=
7 t[
i] =
11 b=
vraii
=
8 t[
i] =
10 b=
vraiL'algorithmeitére 9fois alorsque 4fois auraitété susant.
Reherhe itérative : version "tant que"
Algorithme reherhe(x :entier,t:tableau d'entier):booleen
début
variable i:entier
i
←
0tant quet
[
i] 6=
x fairei
←
i+
1ntant que
retournert
[
i] =
xn
Malheur! Lorsque x n'est pasdans letableau
Exemple d'exéution
reherhe(17, t)
i
=
0 t[
i] =
12i
=
1 t[
i] =
3i
=
2 t[
i] =
12i
=
3 t[
i] =
15i
=
4 t[
i] =
12i
=
5 t[
i] =
3i
=
6 t[
i] =
15i
=
7 t[
i] =
11i
=
8 t[
i] =
10i
=
9 t[
i] =???
L'algorithmetented'obtenir unevaleur inexistantedu tableau:
Java envoieunsignal d'exeption
Reherhe itérative : version "tant que"
Algorithme reherhe(x :entier,t:tableau d'entier):booleen
début
variable i:entier
i
←
0tant quei
<
t.
taille??t[
i] 6=
x fairei
←
i+
1ntant que
sii
<
t.
taille alorsretourner vrai
sinon
retourner faux
nsi
n
Il faut testeri
<
t.
taille pourne pas sortirdesbornesdu tableau.Le top
Algorithme reherhe(x :entier,t:tableau d'entier):booleen
début
variable i:entier
i
←
0tant quei
<
t.
taille ett[
i] 6=
x fairei
←
i+
1ntant que
retourneri
<
t.
taillen
Nombremoyen de omparaisons pouruntableau de taillen? n
2
En Java
/**************************** ***** **** ****
* reherhe d'un nombre dans un tableau de manière itérative
*
* entrée :
* - x : nombre à reherher
* - t : tableau où le nombre est à reherher
*
* sortie :
* - booléen : vrai ssi le nombre est dans le tableau
**************************** ***** **** ***** /
bool reherheIter(int x, int [℄ t) {
int i = 0;
while (i < t.length && t[i℄ != x)
i++;
return i < t.length;
Reherhe dihotomique
La reherhedihotomiquene peut s'eetuerquesur untableau
ordonné.
0 1 2 3 4 5 6 7 8
3 3 10 11 12 12 12 15 15
La tehniqueonsisteàhoisir l'élémentdu milieu
puis àreherher àdroitesi l'élémentà reherherest plusgrand
ou à reherherà gauhesi l'élémentàreherher est pluspetit
Prinipe
reherhe(10, t)
0 1 2 3 4 5 6 7 8
3 3 10 11 12 12 12 15 15
a b
10
<
t[
]
don :0 1 2 3 4 5 6 7 8
3 3 10 11 12 12 12 15 15
a b
Reherhe dihotomique
Algorithme reherheDihotomique(x:entier,t:tableaud'entier):
booleen
début
variable a,b,:entier
a
←
0b
←
t.
taille−
1
← (
a+
b)/
2tantque a
≤
bett[
] 6=
x fairesit
[
] <
x alorsa
←
+
1sinon
b
←
−
1n si
← (
a+
b)/
2n tantque
retourner a
≤
bExemple d'exéution
reherhe(11, t)
a
=
0 b=
8=
4 t[
] =
12a
=
0 b=
3=
1 t[
] =
3a
=
2 b=
3=
2 t[
] =
10a
=
3 b=
3=
3 t[
] =
11Vrai
reherhe(17, t)
a
=
0 b=
8=
4 t[
] =
12a
=
5 b=
8=
6 t[
] =
12a
=
7 b=
8=
7 t[
] =
15a
=
8 b=
8=
8 t[
] =
15a
=
9 b=
8=
8 t[
] =
15Nombre de omparaisons
T
(
k)
:nombre de omparaisons dansunsous-tableaude taillek. T(
k) =
T(
k2
) +
1Tailledutableau :n
=
2α
T
(
n) =
T(
n2
) +
1T
(
n) =
T(
n4
) +
1+
1T
(
n) =
T(
n8
) +
1+
1+
1. . .
T
(
n) =
T(
1) + α
T
(
n)
estde l'ordre delog2(
n)
.Pour n
=
109 nous avonsT(
n) ≈
30En Java
/**************************** ***** **** ****
* reherhe d'un nombre dans un tableau de manière dihotomique
*
* entrée :
* - x : nombre à reherher
* - t : tableau où le nombre est à reherher
*
* sortie :
* - booléen : vrai ssi le nombre est dans le tableau
**************************** ***** **** ***** /
boolean reherheDihotomique(int x, int [℄ t) {
En Java
boolean reherheDihotomique(int x, int [℄ t) {
int a = 0;
int b = t.length - 1;
int = (a + b) / 2;
while (a <= b && t[℄ != x) {
if (t[℄ < x)
a = + 1;
else
b = - 1;
= (a + b) / 2;
}
return a <= b;
}
exemple
0 1 2 3 4 5 6 7 8
12 3 12 15 12 3 15 11 10
La valeurde denombrer
(
15,
t)
est 2La valeurde denombrer
(
17,
t)
est 0La valeurde denombrer
(
12,
t)
est 3Algorithme
Algorithme denombrer(x:entier,t: tableaud'entier) :entier
début
variable i,:entier
←
0pour ide 0 à.taille-1faire
si t
[
i] =
x alors
←
+1nsi
npour
retourner
n
Exemple
denombrer(12, t)
i
=
0 t[
i] =
12=
1i
=
1 t[
i] =
3=
1i
=
2 t[
i] =
12=
2i
=
3 t[
i] =
15=
2i
=
4 t[
i] =
12=
3i
=
5 t[
i] =
3=
3i
=
6 t[
i] =
15=
3i
=
7 t[
i] =
11=
3i
=
8 t[
i] =
10=
3En Java
/**************************** ***** **** ****
* denombrer le nombre d'apparition d'un nombre dans un tableau
*
* entrée :
* - x : nombre à dénombrer
* - t : tableau où le nombre est à reherher
*
* sortie :
* - nombre d'ourene
**************************** ***** **** ***** /
int denombrer(int x, int [℄ t) {
int = 0;
for(int i = 0; i < t.length; i++)
if (t[i℄ == x)
++;
Denombrement en parallèle
Dénombrer selon lesvaleurs des élémentsdansdeux tableauxen
parallèle.
0 1 2 3 4 5 6 7 8
12 3 12 15 12 3 15 11 10
0 1 2 3 4 5 6 7 8
10 12 7 1 2 29 31 67 27
Parexemple:dénombrer les ouplesd'éléments quisontpairs àla
même positiondansles deuxtableaux.
Algorithme
Algorithme denombrerPairs(t1:tableau d'entier, t2:tableau
d'entier) :entier
début
variable i,:entier
←
0pour ide 0 àt1.taille -1 faire
si modulo
(
t1[
i],
2) =
0et modulo(
t2[
i],
2) =
0 alors
←
+1nsi
npour
retourner
n
En Java
/**************************** ***** **** ****
* denombrer en parallèle les nombres pairs
*
* entrée :
* - t1 : tableau où le nombre est à reherher
* - t2 : tableau où le nombre est à reherher
*
* sortie :
* - nombre d'ourenes de nombre pairs en parallèle
**************************** ***** **** ***** /
int denombrerParallele(int [℄ t1, int [℄ t2) {
int = 0;
for(int i = 0; i < t1.length; i++)
if (t1[i℄ % 2 == 0 && t2[i℄ % 2 == 0)
++;
Exeries
Un tableau de taillenontient leslettres A,T,Gou C.
Dénombrer le nombred'ourrenesde lasuession des
lettresA,T,A (isoleuine)
Deuxtableauxsontdetaillesn etontiennentleslettresA,T,G
ou C.
Dénombrer le nombrede basesnon orretement appariées.
Objetifs de la séane 8
1
Reherhe itératived'un élémentdansuntableau
2
Reherhe dihotomiqued'unélément dansuntableau
3
Dénombrement d'élémentsdansuntableau
4
Dénombrement d'élémentsdansdeux tableauxen parallèle
Questions prinipales dujour :
Comment reherheret ompter desélémentsdansuntableau?