M1 2012–2013 Algorithmique de base Interrogation no 1 Durée : 1h Les notes de cours sont autorisées. Exercice 1 (sur 5 points) 1. a) Rappeler la définition d’un arbre binaire de recherche. b) Rappeler l’algorithme, vu en cours, de recherche dans un arbre binaire de recherche et donner sa complexité asymptotique. 2. a) Donner un algorithme qui prend en entrée un arbre binaire de recherche arbre et un élément x et qui renvoie le plus petit élément y supérieur ou égal à x qui est présent dans arbre (ou renvoie une erreur si un tel y n’existe pas). 3. a) Rappeler l’algorithme, vu en cours, de parcours en profondeur d’un graphe. b) Soit arbre un arbre binaire de recherche ayant n éléments. En s’inspirant de l’algorithme de parcours en profondeur, proposer un algorithme de complexité O(n) qui imprime dans l’ordre croissant tous les éléments de arbre. (On pourra écrire, au choix, un algorithme itératif ou récursif.) Exercice 2 (sur 5 points) Le but de cet exercice est de présenter un algorithme efficace de calcul de plus court chemin sur un graphe acyclique (i.e. n’ayant pas de cycle). Soit G un graphe orienté acyclique ayant S sommets et A arêtes. Chaque arête (u, v) de G est, en outre, munie d’une longueur qui est un réel strictement positif noté `(u, v). Si s et t sont deux sommets de G, la distance de s à t est alors définie comme l’infimum des quantités `(s0 , s1 ) + `(s1 , s2 ) + · · · + `(sk−1 , sk ) pris sur tous les chemins possibles hs0 , s1 , . . . , sk i reliant s à t (i.e. s0 = s, sk = t et (si , si+1 ) est une arête de G pour tout i). On rappelle que les sommets de G peuvent être triés topologiquement, c’est-à-dire qu’il existe un ordre total noté ≺ sur les sommets de G tel que u ≺ v dès qu’il existe une arête de u vers v. 1. Rappeler l’algorithme, vu en cours, permettant de calculer un ordre topologique sur les sommets de G. 1. Par définition, un voisin v de u est un sommet v de G pour lequel l’arête (u, v) existe dans G. 1/2 Algorithme 1: Distance(s, t) 5 calculer un ordre topologique ≺ sur les sommets de G; pour chaque sommet u de G faire δ[u] = +∞; δ[s] = 0; pour chaque sommet u de G parcouru selon l’ordre ≺ faire pour chaque voisin 1 v de u faire δ[v] = min(δ[v], δ[u] + `(u, v)); 6 retourner δ[t]; 1 2 3 4 2. On se donne s et t deux sommets de G et on suppose que hs0 , s1 , . . . , sk i est un plus court chemin reliant s à t. a) Montrer que si ≺ si+1 pour tout i ∈ {1, . . . , k − 1} b) Montrer que, pour tout i ∈ {1, . . . , k}, le chemin hs0 , s1 , . . . , si i est un plus court chemin reliant s à si . c) Montrer par recurrence sur i que la valeur δ[si ] calculée par l’algorithme Distance ci-dessus est la distance de s à si . d) En déduire que l’algorithme Distance(s, t) calcule la distance de s à t. 3. Montrer la complexité asymptotique de l’algorithme Distance est O(S +A). Comparer avec la complexité de l’algorithme de Dijkstra. 2/2