un lien

Transcription

un lien
Exercice 2
Algorithmes mystères et calcul de complexité (15 min)
On considère les deux algorithmes suivants où A est un tableau d’éléments, key est un élément de type
elem et i un entier.
Algorithme 1 : ALGO-X(A,key)
1
2
3
4
5
6
7
i←1
while i ≤ A.length do
if A[i] == key then
A ← ALGO-X-SUB(A, i )
else
i←i+1
return A
Algorithme 2 : ALGO-X-SUB(A,i)
1
2
3
4
5
while i < A.length do
A[i] ← A[i + 1]
i←i+1
A[i] ← N IL
return A
Question 2.1
Complexité
Analysez la complexité dans le pire et dans le meilleur cas de ces algorithmes en fonction de la taille n
du tableau A (en nombre d’opérations de base). Vos réponses devront être justifiées.
Réponse
6
Question 2.2
Compréhension d’algorithmes
Expliquez brièvement ce que font ces algorithmes. Vous pourrez pour cela illustrer votre explication par
des exemples.
Réponse
Question 2.3
Amélioration d’algorithmes
Ecrire un algorithme BETTER-ALGO-X faisant la même chose mais avec une complexité asymptotique
strictement inférieure dans le pire des cas. Des algorithmes ou des structures de données vues en cours
pourront être exploitées. Votre réponse devra être justifiée.
Réponse
7
Question 2.4
Recherche de motifs dans une liste
On considère l’algorithme MATCH qui reçoit en entrée un tableau A de taille n et un motif P [1..m] (avec
1 ≤ m ≤ n) et qui renvoie la position l de la première occurrence du motif P dans le tableau A, c’est-à-dire
l = p si A[p..p + m − 1] = P . l = −1 si le motif P n’apparaît pas dans le tableau A.
L’algorithme MATCH est incorrect. Repérez l’erreur, expliquez la et écrivez une version correcte de cet
algorithme.
Algorithme 3 : MATCH(A,P ,n,m)
1
2
3
4
5
6
7
8
9
10
11
12
13
l←0
matched ← FALSE
while l ≤ n and not matched do
l ←l+1
r←1
matched ← TRUE
while r ≤ m and matched do
matched ← matched and(P [r] == A[l + r − 1])
r ←r+1
if matched then
return l
else
return −1
Réponse
8
Question 2.5
Complexité dans le pire des cas
Donner un exemple correspondant au pire des cas (pour un tableau et un motif quelconque) et calculer
la complexité dans le pire des cas de l’algorithme corrigé en fonction de m et de n. Votre réponse devra être
justifiée.
Réponse
Question 2.6
Complexité dans le meilleur des cas
Donner un exemple correspondant au meilleur des cas (pour un tableau et un motif quelconque) et calculer
la complexité dans le meilleur des cas de l’algorithme corrigé en fonction de m et de n. Votre réponse devra
être justifiée.
Réponse
9
Exercice 5
Graphes (30 min)
Dans cet exercice, on considère des graphes orientés simples G donnés sous la forme d’un couple (V, E)
avec V ensemble de sommets de G et E ensemble d’arcs (u, v) avec u sommet source et v sommet cible.
2
4
1
6
3
5
Figure 1 – Graphe Gr
Question 5.1
Pour le graphe Gr donné en figure 1, donner tous les parcours en largeur possibles (sous forme de liste
des numéros des sommets dans l’ordre de visite) en partant soit du sommet 1, soit du sommet 3.
Combien y-a-t-il de parcours en largeur à partir de ces sommets 1 et 3 ?
Réponse
22
Question 5.2
Un circuit est un chemin de la forme x0 → x1 → . . . → xn = x0 avec ∀i, j < n, i 6= j ⇒ xi 6= xj .
Une source d’un graphe est un sommet sans prédécesseur, et un puits est un sommet sans successeur.
Quels sont les sources et les puits du graphe Gr donné en figure 1 ?
Montrer qu’un graphe simple fini sans cycle G = (V, E) possède au moins une source et un puits.
Réponse
23
Question 5.3
Soit G = (V, E) un graphe orienté simple quelconque. Le graphe G admet une partition en niveaux s’il
1
existe une partition
de E telle que :
Sp
— E = i=0 Ei est une partition
— E0 est l’ensemble des sources de G0 = (V, E) ;
— Ei est l’ensemble des sources de Gi = (Vi , E\(E0 ∪. . .∪Ei−1 )), Vi étant la restriction de V aux sommets
E\(E0 ∪. . .∪Ei−1 ) (i.e. l’ensemble des arcs de V ayant leurs deux extrémités dans E\(E0 ∪. . .∪Ei−1 ))
Donner la partition en niveaux du graphe Gr de la figure 1.
Réponse
Question 5.4
Soit G un graphe orienté simple fini.
Montrer que G admet une partition en niveaux si et seulement si G est sans circuit.
Réponse
1. (Ei )i∈I est une partition de E si ∪i∈I Ei et si les ensembles Ei sont disjoints deux à deux.
24
Question 5.5
Implémenter en python une fonction CircuitNiveau prenant en argument un graphe g et renvoie un
couple (lNiveau,circuit) vérifiant
— circuit à True si g est sans circuit, à False sinon
— lNiveau contient la liste des niveaux (chaque niveau étant consituté de la liste de sommets du niveau
en question) si g est sans circuit
Réponse
25
Exercice 6
Recherche de pics dans un tableau (35 min)
On considère un tableau A[1..A.length] et on suppose que A[0] = A[A.length+1] = −∞. Dans ce tableau,
A[i] est un pic (ou maximum local) s’il n’est pas plus petit que ses voisins, c’est-à-dire si :
A[i − 1] ≤ A[i] ≥ A[i + 1]
Par exemple, dans le tableau ci-dessous 6 et 7 sont des pics.
L’objectif de cet exercice est de proposer plusieurs algorithmes permettant de trouver un pic (n’importe
lequel) dans un tableau. Il s’agira de renvoyer l’indice et la valeur du pic.
Question 6.1
Approche par force-brute
Ecrire un algorithme par force-brute répondant à ce problème. Dans cette approche toutes les positions
seront donc traitées de manière séquentielle. Votre réponse pourra être soit donnée en pseudo-code soit sous
la forme d’une fonction en python. La complexité dans le pire des cas de votre algorithme doit être en O(n).
Réponse
26
Question 6.2
Approche diviser pour régner
Ecrire un algorithme récursif mettant en œuvre le paradigme diviser pour régner permettant de répondre
à ce problème. Votre stratégie devra être expliquée, notamment en l’illustrant par un exemple. Votre réponse
pourra être soit donnée en pseudo-code soit sous la forme d’une fonction en python.
Réponse
27
Question 6.3
Analyse de complexité
Etant donné T (n) le nombre d’appels récursifs effectués lors de l’exécution de l’algorithme précédent sur
un tableau de taille n, calculez la complexité de cet algorithme dans le pire des cas. Justifiez votre réponse.
Réponse
Question 6.4
Recherche de pics dans une matrice
On étend maintenant le problème au cas 2D. On considère donc une matrice M de n × n nombres et
on considère qu’un pic est un élément plus grand ou égal à ses 4 voisins dans la matrice (Si on considère
l’élément en (i, j), les voisins seront (i + 1, j), (i − 1, j), (i, j − 1), (i, j + 1)). Par exemple, dans la matrice
ci-dessous, les pics sont les éléments entourés. L’objectif est de trouver au moins un pic d’une matrice. On
considérera que l’on peut accéder à l’élément en (i, j) par la syntaxe M [i][j]
28
Ecrire un algorithme par force-brute répondant à ce problème. Votre réponse pourra être soit donnée
en pseudo-code soit sous la forme d’une fonction en python. Il faudra préciser dans ce dernier votre choix
d’implémentation pour la structure matrice.
Réponse
Question 6.5
Complexité de l’algorithme par force-brute
Quelle est la complexité dans le pire des cas de l’algorithme par force-brute ? Votre réponse devra être
justifiée.
Réponse
29
Question 6.6
Approche par diviser pour régner
Ecrire un algorithme récursif mettant en oeuvre le paradigme diviser pour régner permettant de répondre
à ce problème. Votre stratégie devra être expliquée, notamment en l’illustrant par un exemple. Votre réponse
pourra être soit donnée en pseudo-code soit sous la forme d’une fonction en python.
Réponse
30

Documents pareils