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