Vous êtes sur la page 1sur 4

Université Yahia Fares de Médéa Mardi 10 Janvier 2017

1ère année MATSER (L.M.D) 10 :30 -12 :00


Option : ISTW Algorithmiques Avancés Durée : 01h :30min
et Complexité
Corrigé de l'EFS 1er Semestre

Support de cours est autorisé

Exercice 01: (03 pts) Boolean Fct(A : Tableau , d,f : entier)


Var K : entier ;
Soit A un tableau de n entiers. Debut
Si(d==f) alors
On considère la fonction suivante : Si (A[d]==d) alors
return Vrai ;
Question : Sinon
return Faux ;
1. Que fait cette fonction ? FinSi
(la fonction peut s’appeler Sinon
Fct(A, 1, n)) K =[(f+d)/2] ;
2. Quelle est sa complexité ? Si(Fct(A, d, k)==Vrai) alors
return Vrai ;
Sinon
return Fct(A, k+1, f);
FinSi
FinSi
Fin.

Solution :

1. La fonction retourne Vrai s'il existe un indice i dont A[i]=i, Faux sinon.
2. Equation de récurrence : C(n) = 2 C(n/2) + cste. => Complexité O(n) (Théorème n°2 )

Exercice 02: (06 pts )


Soit A un tableau de n entiers triés (décroissantes). Etant donné un entier x, nous voulons
chercher s'il existe dans A deux éléments distincts (i.e. avec deux indices distincts) dont la
somme vaut x.
Exemple : 20 15 11 9 8 7 5 3 1

 Si x=10 alors l'algorithme retourne vrai ( 7 + 3)


 Si x=6 alors l'algorithme retourne faux.
1. Proposer un algorithme naïf pour ce problème et calculer sa complexité.
2. Proposer un second algorithme qui résout ce problème en temps O(n).

Département Mathématiques et Informatique Page | 1/4 ‫ﻓﯿ ﻖﺑ ﺎﻟﺘﻮ‬


Université Yahia Fares de Médéa Mardi 10 Janvier 2017
1ère année MATSER (L.M.D) 10 :30 -12 :00
Option : ISTW Algorithmiques Avancés Durée : 01h :30min
et Complexité
Corrigé de l'EFS 1er Semestre

Solution :
3. Boolean exist2elt(A: Tableau , x : entier)
Debut
Pour i=1 à A.length faire
Pour j=i+1 à A.length faire
Si (A[i] + A[j] == x) alors
return vrai
FinSi
FinPour
FinPour
return faux
Fin.
Complexité : O(n2)
4. Un algorithme de complexité O(n)
Idée : Nous utilisons deux indices min et max qui indique le minimum et le
maximum dans A. Initialement, min = A.length et max = 1.
 Si A[min]+A[max] = x, alors l'algorithme retourne vrai.
 Si A[min]+A[max] > x, alors il n'y aura aucune solution utilisant
A[max]. Donc, nous pouvons oublier l'élément A[max] et continuer la
recherche dans A dans l'intervalle [max+1, min]
 Si A[min]+A[max] < x, alors il n'y aura aucune solution utilisant
A[min]. Donc, nous pouvons oublier l'élément A[min] et continuer la
recherche dans A dans l'intervalle [max, min-1]
Boolean exist2elt(A: Tableau , x : entier)
Debut
min, max : Entier;
min = A.length
max = 1
TantQue(min != max) faire
Si (A[min]+A[max] == x) alors
return vrai
Sinon
Si (A[min]+A[max] > x) alors
max++
Sinon //A[min]+A[max] < x
min--
FinSi
FinSi
FinTantQue
return faux
Fin
Remarquons, à chaque itération, soit max est incrémenté, soit le min est
décrémenté. Ainsi, la boucle sera exécutée au plus n-1 fois.
Département Mathématiques et Informatique Page | 2/4 ‫ﻓﯿ ﻖﺑ ﺎﻟﺘﻮ‬
Université Yahia Fares de Médéa Mardi 10 Janvier 2017
1ère année MATSER (L.M.D) 10 :30 -12 :00
Option : ISTW Algorithmiques Avancés Durée : 01h :30min
et Complexité
Corrigé de l'EFS 1er Semestre

Exercice 03: (06 pts )


Soit A un tableau de n entiers différents non triés. Nous voulons chercher le kième
(k<=n) plus petit dans A.
Exemple:
25 7 12 10 8 2 5 4 1

 Si k=3 alors l'algorithme retourne 4


 Si k=5 alors l'algorithme retourne 7
1. Proposer un algorithme naïf pour retourner le kième plus petit dans A et calculer sa
complexité.
2. Proposer un second algorithme de type "diviser pour régner" et calculer sa
complexité.
Solution :
5. Boolean kpluspetit(A: Tableau, k : entier)
Debut
Tri_Selection(A) //voir le cours (chap. 02)
return A[k]
Fin.
Complexité : O(n2)
6. Diviser pour régner (inspirer des principes du Tri Rapide)
Boolan kpluspetit(A: Tableau, d,f,k : entier)
Debut
si d==f alors return A[d] FinSi
entier p = A[d] //choisir le premier élément comme le pivot
entier j = d //indice de dernier élément <= p
Pour i=d+1 à f faire
Si A[i]<=p alors
Permuter(A[i], A[j+1])
j++
FinSi
Permuter(A[d], A[j])
Si k==j alors
return A[j]
Sinon
Si k<j alors
return kpluspetit(A, d,j,k)
Sinon
return kpluspetit(A, j+1,f,k-j)
FinSi
FinSi
Fin
Complexité : C(n) = C(n/2) + b*n + Cste => C(n)= O(n2)

Département Mathématiques et Informatique Page | 3/4 ‫ﻓﯿ ﻖﺑ ﺎﻟﺘﻮ‬


Exercice 04: (05 pts )
Un scorpion est un graphe non-orienté G(S,E) avec |S|=n et |E|=m, de la forme
suivante : il y a 3 sommets spéciaux, appelés le dard (sting), la queue (tail), et le corps
(body), de degré 1, 2 et n−2, respectivement. Le dard est connecté seulement à la queue;
la queue est connectée seulement au dard et au corps; et le corps est connecté à tous les
sommets sauf le dard. Les autres sommets de G peuvent être connectés aux autres de
façon arbitraire.
Question : Proposez un algorithme polynomial qui teste si un graphe G est de la forme
scorpion ou non.
.

Solution : les deux fonctions suivantes seront utilisée


 degre(s) : retourne le nombre de sommets voisins du sommet s. Complexité
O(m)
 voisins(s) : retourne la liste des voisins du sommet s. Complexité O(m)
L'idée d'utiliser la liste d'adjacences (ou bien la liste des voisins) est dans le but d'avoir
une complexité constante O(1) pour les cas suivants :
 le test : degre(s) ==1.
 retourner les voisins d'un sommet s voisins(s), sachant que degre(s)=1

Boolean GrapheScorpion(G(S, E))


Debut
Si |S| >= 3 alors
Pour chaque xS faire
Si degre(x) ==1 alors //x=dard, le test est O(1)
y = voisins(x) //O(1)
Si degre(y)==2 alors //y=queue, le test est O(1)
z = voisins(y)\{x} //O(1)
Si degre(z)=n-2 alors //a=corps, le test est O(n), mais ne se fait qu'une fois
return vrai
Sinon
return faux
FinSi
FinSi
FinSi
FinPour
FinSi
return faux
Fin
Complexité : O(n)

Département Mathématiques et Informatique Page | 4/4 ‫ﻓﯿ ﻖﺑ ﺎﻟﺘﻮ‬

Vous aimerez peut-être aussi