Licence informatique - L3 Année 2012/2013. Conception d algorithmes et applications (LI325) COURS 2



Documents pareils
1 Recherche en table par balayage

chapitre 4 Nombres de Catalan

Définitions. Numéro à préciser. (Durée : )

Les arbres binaires de recherche

Chapitre 3. Quelques fonctions usuelles. 1 Fonctions logarithme et exponentielle. 1.1 La fonction logarithme

Algorithmique et Programmation

ARBRES BINAIRES DE RECHERCHE

C f tracée ci- contre est la représentation graphique d une

INF601 : Algorithme et Structure de données

Statistique : Résumé de cours et méthodes

MIS 102 Initiation à l Informatique

1 de 46. Algorithmique. Trouver et Trier. Florent Hivert. Mél : Florent.Hivert@lri.fr Page personnelle : hivert

Algorithmes récursifs

Licence Sciences et Technologies Examen janvier 2010

Module 16 : Les fonctions de recherche et de référence

La fonction exponentielle

Les structures de données. Rajae El Ouazzani

Rappels sur les suites - Algorithme

Représentation des Nombres

Quelques Algorithmes simples

BACCALAURÉAT GÉNÉRAL SESSION 2012 OBLIGATOIRE MATHÉMATIQUES. Série S. Durée de l épreuve : 4 heures Coefficient : 7 ENSEIGNEMENT OBLIGATOIRE

Recherche dans un tableau

Algorithme. Table des matières

Limites finies en un point

avec des nombres entiers

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Arithmétique binaire. Chapitre. 5.1 Notions Bit Mot

Architecture des Systèmes d Information Architecture des Systèmes d Information

Feuille TD n 1 Exercices d algorithmique éléments de correction

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

Chp. 4. Minimisation d une fonction d une variable

Algorithmique et Programmation, IMA

Arbres binaires de recherche

Soit la fonction affine qui, pour représentant le nombre de mois écoulés, renvoie la somme économisée.

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Représentation d un entier en base b

t 100. = 8 ; le pourcentage de réduction est : 8 % 1 t Le pourcentage d'évolution (appelé aussi taux d'évolution) est le nombre :

introduction Chapitre 5 Récursivité Exemples mathématiques Fonction factorielle ø est un arbre (vide) Images récursives

Baccalauréat ES/L Métropole La Réunion 13 septembre 2013 Corrigé

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Chapitre 5 : Flot maximal dans un graphe

CCP PSI Mathématiques 1 : un corrigé

Fonctions de plusieurs variables

Algorithmes de recherche

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Baccalauréat ES Polynésie (spécialité) 10 septembre 2014 Corrigé

Les deux points les plus proches

Vous revisiterez tous les nombres rencontrés au collège, en commençant par les nombres entiers pour finir par les nombres réels.

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Développement décimal d un réel

Partie 1. Fonctions plus complexes dans Excel. Fonctions Si(), Et(), Ou() et fonctions imbriquées. Opérateurs logiques. I.1.

2.4 Représentation graphique, tableau de Karnaugh

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Exo7. Limites de fonctions. 1 Théorie. 2 Calculs

Excel avancé. Frédéric Gava (MCF)

Resolution limit in community detection

Image d un intervalle par une fonction continue

Cours d initiation à la programmation en C++ Johann Cuenin

Jade. Projet Intelligence Artificielle «Devine à quoi je pense»

Exercices - Polynômes : corrigé. Opérations sur les polynômes

Introduction à l étude des Corps Finis

De même, le périmètre P d un cercle de rayon 1 vaut P = 2π (par définition de π). Mais, on peut démontrer (difficilement!) que

Raisonnement par récurrence Suites numériques

* très facile ** facile *** difficulté moyenne **** difficile ***** très difficile I : Incontournable T : pour travailler et mémoriser le cours

données en connaissance et en actions?

STAGE IREM 0- Premiers pas en Python

Baccalauréat S Antilles-Guyane 11 septembre 2014 Corrigé

Suites numériques 3. 1 Convergence et limite d une suite

V- Manipulations de nombres en binaire

Compter à Babylone. L écriture des nombres

Complément d information concernant la fiche de concordance

Baccalauréat ES Pondichéry 7 avril 2014 Corrigé

Logiciel Libre Cours 3 Fondements: Génie Logiciel

Chapitre 7. Récurrences

Objectifs du cours d aujourd hui. Informatique II : Cours d introduction à l informatique et à la programmation objet. Complexité d un problème (2)

Initiation à la Programmation en Logique avec SISCtus Prolog

Continuité et dérivabilité d une fonction

Définition 0,752 = 0,7 + 0,05 + 0,002 SYSTÈMES DE NUMÉRATION POSITIONNELS =

Chapitre 2 Le problème de l unicité des solutions

Nouvelles propositions pour la résolution exacte du sac à dos multi-objectif unidimensionnel en variables binaires

Le langage SQL Rappels

Probabilités Loi binomiale Exercices corrigés

IMAGES NUMÉRIQUES MATRICIELLES EN SCILAB

Exercices - Nombres complexes : corrigé. Formes algébriques et trigonométriques, module et argument

clef primaire ; clef étrangère ; projection ; restriction ; jointure ; SQL ; SELECT ; FROM ; WHERE

Développements limités, équivalents et calculs de limites

Chapitre 6. Fonction réelle d une variable réelle

Université Paris-Dauphine DUMI2E 1ère année, Applications

Fonctions homographiques

TP3 : Manipulation et implantation de systèmes de fichiers 1

Correction du baccalauréat ES/L Métropole 20 juin 2014

Algorithmique avec Algobox

Dérivation : cours. Dérivation dans R

Algorithmique et structures de données I

Comment tracer une droite représentative d'une fonction et méthode de calcul de l'équation d'une droite.

RÉALISATION DE GRAPHIQUES AVEC OPENOFFICE.ORG 2.3

BACCALAUREAT GENERAL MATHÉMATIQUES

Probabilités conditionnelles Exercices corrigés

DOCM Solutions officielles = n 2 10.

Transcription:

Licence informatique - L Année 0/0 Conception d algorithmes et applications (LI) COURS Résumé. Cette deuxième séance est entièrement consacrée aux applications du principe Diviser pour Régner. Nous regarderons plus particulièrement une application à l algorithmique numérique (un algorithme de multiplication d entiers - Karatsuba), une application à l algorithmique des graphes (recherche d un élément dans un arbre de recherche) et enfin une application à la géométrie algorithmique (trouver deux points les plus proches dans un nuage).. Diviser pour Régner (en algorithmique numérique) Multiplication de deux entiers par la méthode de Karatsuba. Dans cette section, nous évaluerons le coût des algorithmes en nombre de multiplications élémentaires effectuées (multiplications de nombres à un chiffre). On remarque que pour le produit de deux nombres de n chiffres en utilisant la méthode naïve (celle apprise à l école), on fait n multiplications élémentaires, le coût T en calcul d une multiplication de deux nombres à n chiffres est donc T (n) = Θ(n ). L algorithme de Karatsuba (A. Karatsuba, Ofman Yu, Multiplication of multiple numbers by mean of automata, Dokadly Akad. Nauk SSSR, no,, pp-.) est une application du principe diviser pour régner qui permet d améliorer le coût des multiplications des grands nombres. Le principe en est assez simple : Soient a et b deux nombres positifs écrits en base de n = k chiffres, on peut écrire : a = (a k + a 0 ) et b = (b k + b 0 ), avec a 0, b 0, a, b des nombres binaires à k chiffres. On remarque alors que le calcul de ab : (a k + a 0 )(b k + b 0 ) = a b k + (a b 0 + a 0 b ) k + a 0 b 0 ne nécessite pas les quatre produits a b, a b 0, a 0 b et a 0 b 0, mais peut en fait être effectué seulement avec les trois produits a b, a 0 b 0 et ( a a 0 )( b b 0 ) en regroupant les calculs sous la forme suivante (on note sgn(x) le signe de x) : ab = a b k + (a b + a 0 b 0 sgn(a a 0 )sgn(b b 0 )( a a 0 )( b b 0 )) k + a 0 b 0 Ce que l on peut écrire ainsi : Diviser : On décompose a et b des nombres de k chiffres en a = (a k +a 0 ) et b = (b k +b 0 ) où a 0, b 0, a, b sont des nombres à k chiffres. Régner : On résout par appel récursif le problème pour a 0 b 0, a b et ( a a 0 )( b b 0 ). Combiner : On obtient le produit ab en faisant (a k + a 0 )(b k + b 0 ) = a b k + (a b + a 0 b 0 sgn(a a 0 )sgn(b b 0 )( a a 0 )( b b 0 )) k + a 0 b 0. On admet que les opérations / k (division entière par une puissance de ) et mod k (reste de la division entière par une puissance de ) ne nécessitent pas de multiplication. En fait, ces opérations se font en machine en temps constants et sont négligeables. D où le pseudo-code suivant :

Conception d algorithmes et applications Algorithme : KARATSUBA Entrées : deux entiers positifs. Sorties : un entier. KARATSUBA(a, b) n := max( log a, log b ) + ; si n alors retourner ab; k = n ; a 0 = a mod k ; a = a/ k ; b 0 = b mod k ; b = b/ k ; x := KARATSUBA(a 0, b 0 ); y := KARATSUBA(a, b ); z := KARATSUBA((( a a 0 ), ( b b 0 )); retourner y k + (x + y sgn(a a 0 )sgn(b b 0 )z) k + x; 0 Analyse de l algorithme KARATSUBA Preuve de Terminaison. Par induction sur n = max( log a, log b ) + : Si n = alors, on ne fait qu une multiplication, donc l algorithme est fini. Supposons que pour tout n < n 0, l algorithme KARATSUBA(a, b) se termine, alors pour tous a et b avec n 0 = max( log a, log b ) +, KARATSUBA(a, b) se termine aussi car il appelle recursivement trois copies de KARATSUBA sur des instances plus petites (qui par hypothèse d induction se terminent). Preuve de Validité. Par induction sur k = max( log a, log b ) + : Si k = alors, KARATSUBA(a, b) renvoie ab. Supposons que pour tout k < n 0, l algorithme KARATSUBA(a, b) renvoie ab, alors pour tous a et b avec n 0 = max( log a, log b ) + : KARATSUBA(a, b) = y k + (x + y sgn(a a 0 )sgn(b b 0 )z) k + x, qui vaut ab car par récurrence x = a 0 b 0, y = a b et z = ( a a 0 )( b b 0 )). Analyse de la Complexité en nombre de multiplications élémentaires : Notons T (n) le nombre de multiplications élémentaires nécessaires pour multiplier deux nombres de n chiffres. Le principe Diviser pour Régner permet de donner la formule de récurrence pour T suivante : T () = et T (n) = T (n/). On en déduit que T (n) = Θ(n log ). Or log = ln() ln()., ce qui bien mieux que le n de la multiplication naïve.

UPMC Année /. Diviser pour Régner (en algorithmique des graphes) Arbres binaires de recherche. L ensemble AB des arbres binaires étiquetés sur N est défini inductivement comme suit : Base : AB Induction : Si G AB, D AB et n N alors (n, G, D) AB Si (n, G, D) est un arbre binaire étiqueté alors G est appelé le sous-arbre gauche et D le sous-arbre droit de (n, G, D). L étiquette n de (n, G, D) est appelée la clef de la racine de (n, G, D). Plus généralement, les nombres présents dans un arbre binaire sont appelés des clefs. Un arbre binaire de recherche est un arbre binaire étiqueté dont les étiquettes vérifient la propriété suivante : Pour tout noeud x, la clef de x est supérieure à toutes les clefs du sous-arbre gauche de x et inférieure à toutes les clefs du sous-arbre droit de x. Le problème que l on se pose est : étant donnés un nombre x et un arbre binaire de recherche B, x est-il une clef présente dans B? On va suivre pour cela le principe diviser pour régner suivant : Si B est vide, on renvoie NON Diviser : On divise B en trois parties : la racine, le sous-arbre gauche, le sous-arbre droit. Régner : Si x est égal à la clef de la racine de B, on renvoie OUI Si x est inférieur à la clef de la racine de B, on cherche si x est une clef du sous-arbre gauche on cherche x dans le sous-arbre droit. Ceci peut s écrire en pseudo-code de la manière suivante : Algorithme : RECHERCHE(x, B) Entrées : Une valeur x et un arbre binaire de recherche B. Sorties : Un booléen indiquant si x est une clef de B. RECHERCHE(x, B) si B = alors retourner NON; si x = clefracine(b) alors retourner OUI; si x < clefracine(b) alors retourner RECHERCHE(x,sous-arbre gauche(b)); retourner RECHERCHE(x,sous-arbre droit(b)); Analyse de l algorithme RECHERCHE Immédiat, étant donné que l on fait des appels sur des arbres de plus en plus petits et que si l arbre est vide, on s arrête. Sans difficulté par induction. Notons T (h) le nombre de comparaisons pour trouver x dans un arbre binaire de profondeur h, on a T (0) = 0 et T (h) T (h ) +, en effet dans le pire des cas, on appelle récursivement RECHERCHE sur le plus profond des sous-arbres. Donc T (h) = O(h). Remarquer que si l arbre binaire de recherche est équilibré, il peut contenir de l ordre de h clefs. RECHERCHE est donc un algorithme de recherche en temps logarithmique (si l arbre est équilibré) et non linéaire tel que la présentation pourrait le laisser penser.

Conception d algorithmes et applications. Diviser pour Régner (en géométrie algorithmique) Recherche des deux points les plus rapprochés dans un nuage de points dans le plan. Le problème consiste à trouver les deux points les plus proches dans un nuage de n points (n > évidement). Il peut y avoir plusieurs points ayant les mêmes coordonnées dans ce nuage. Bien sûr par les plus proches, l on entend deux points dont la distance euclidienne est minimale. On rappelle à ce titre que la distance entre p = (x, y ) et p = (x, y ) vaut d(p, p ) = (x x ) + (y y ). Un algorithme naïf consisterait à calculer la distance entre toutes les paires possibles de points dans L et d en extraire le minimum. Mais il y a C n possibilités, ce qui donne un algorithme en Θ(n ). On va montrer qu il existe un algorithme de type diviser pour régner qui permet de trouver les deux points les plus rapprochés en O(n ln(n)). En voici l idée : Diviser : Partager le tableau T en deux tableaux T G et T D avec T D = T / et T G = T /. et tous les points de T G ont une abscisse plus petite ou égale à ceux de T D (Les points de T G sont à gauches ou sur une droite d tandis que des points de T D à droite ou sur d). Régner : On résoud récursivement le problème des points rapprochés sur T G et T D tant qu ils ont au moins éléments, on résoud naïvement. Fusionner : Soit (A G, B G ) (resp. (A D, B D )) les deux points les plus proches dans T G (resp. dans T D ) et soit (C, D) les deux points les plus proches avec C dans T G et D dans T D. On retourne parmis ces trois paires, celle qui a la distance la plus petite. Il nous faut donc pour fusionner, un algorithme spécifique pour calculer si la distance minimale entre T G et T D est plus petite que celles dans T G et T D. On va voir qu il en existe un efficace. Structure de données : On va utiliser deux tableaux T X et T Y, le premier contient les points classés par ordre croissant de leur abscisse (plus précisément, par ordre lexicographique sur les coordonnées (x, y)). Le deuxième par ordre croissant sur les ordonnées (plus précisément, par ordre lexicographique sur les coordonnées inversées (y, x)). Donc, on stoque deux fois trop de données (chaque point est présent dans les deux tableaux), mais cette structure va nous permettre d obtenir un algorithme en O(n ln(n)). Tout d abord, voici le pseudo-code qui permet de diviser les deux tableaux T X et T Y : Algorithme : SeparePoints Entrées : les tableaux de points T X, T Y. Sorties : les tableaux scindés T G X, T D X, T G Y, T D Y et l abscisse de la droite d qui sépare les points. SeparePoints (T X, T Y ) n := longueur(t X); T G X := T X[.. n/ ]; T D X := T X[ n/ +..n]; T G Y := CreerTableau[.. n/ ]; T D Y := CreerTableau[ n/ +..n]; g := ; d := ; med := T G X[ n/ ]; pour i allant de à n faire si T Y [i] x < med x ou (T Y [i] x = med x et T Y [i] y <= med y et g <= n/ ) alors T G Y [g] := T Y [i] ; g := g + ; T D Y [d] := T Y [i]; d := d + ; 0 retourner (med x, T G X, T D X, T G Y, T D Y )

UPMC Année / Analyse du pseudo-code SeparePoints Il n y a qu une boucle définie. Exercice facile. On fait au plus deux comparaisons à chaque passage dans la boucle Pour de la ligne. On a donc un algorithme linéaire en la taille de l entrée. Soit δ G (resp. δ D ) la plus petite distance entre deux points de T G (resp. T D ), notons δ le minimum de δ G et δ D. Pour fusionner, il nous faut déterminer s il existe une paire de points dont l un est dans T G et l autre dans T D, et dont la distance est strictement inférieure à δ. Il est facile de voir que si une telle paire existe, alors les deux points se trouvent dans la bande verticale centrée en x = med x et de largeur δ. Nous allons donc devoir construire un tableau T Y, trié selon les ordonnées (nous verrons en suite pourquoi ce tri), et obtenu à partir de T Y en ne gardant que les points d abscisse x vérifiant med x δ x med x + δ. En voici le pseudo-code : Algorithme : BandeVerticale Entrées : le tableau de points T Y, la distance δ et l abscisse med x de la droite d. Sorties : le tableau T Y. BandeVerticale(T Y, δ, med x ) n := longueur(t X); j := ; pour i allant de à n faire si T Y [i] x med x δ et T Y [i] x med x + δ alors T Y [j] := T Y [i]; j := j + ; retourner T Y Analyse du pseudo-code BandeVerticale Il n y a qu une boucle définie. Immédiat. On fait au plus deux comparaisons à chaque passage dans la boucle Pour de la ligne. On a donc un algorithme linéaire en la taille de l entrée. Nous sommes presque en mesure de donner un pseudo-code efficace pour déterminer s il existe une paire de points dont l un est dans T G et l autre dans T D, et dont la distance est strictement inférieure à δ. Les deux remarques restant à faire sont : S il existe deux points p = (x, y ) et p = (x, y ) de T Y tels que dist(p, p ) < δ et y < y, alors p se trouve dans le rectangle R = {(x, y); med x δ x med x +δ et y y y +δ}. R ne peut contenir au plus que les points qui suivent p dans le tableau T Y. Ceci nous permet d écrire le pseudo-code suivant :

Conception d algorithmes et applications Algorithme : DePartEtDAutre Entrées : le tableau de points T Y, la distance δ. Sorties : Un quadruplet (b, P, P, δ) où b est un booléen qui vaut faux s il n y a pas de points dans T Y à distance inférieur à δ et P et P sont les coordonnées de deux points les plus proches dans T Y et δ leur distance. DePartEtDAutre(T Y, δ) n :=longueur(t Y ); δ min := δ; res := (F AUX, (0, 0), (0, 0), 0); pour i allant de à n faire j := i + ; tant que j n et j i + faire d := dist(t Y [i], T Y [j]); si d < δ min alors δ min := d; res := (V rai, T Y [i], T Y [j], δ min ); 0 j := j + ; retourner res Analyse du pseudo-code DePartEtDAutre Il y a une boucle définie ligne et emboîté dedans un tant que ligne, mais celui-ci n ai jamais itéré plus de fois à cause du compteur j. Donc l algorithme se termine. Immédiat si l on est d accord avec les remarques. On parcourt T Y une fois, et pour chaque point, on fait au plus comparaisons. On a donc un algorithme linéaire en la taille de l entrée. Nous pouvons finalement ecrire un pseudo-code pour la recherche de deux points les plus rapprochés (voir Algorithme sur la page suivante). Analyse du pseudo-code PlusProches Tant que la taille des tableaux est supérieur à, elle diminue de moitié à chaque appel recursif et dès qu elle est inférieur à, l algorithme s arête en lançant PlusProcheNaïf qui n est pas recursif. Donc l algorithme se termine. Immédiat. Le nombre de comparaisons effectuées par l algorithme suit la relation de récurence T (n) = T ( n/ ) + T ( n/ ) + O(n). Le O(n) vient du fait que DiviserPoints, BandeVerticale et De- PartEtDAutre se font tous les en O(n). Les T ( n/ ) et T ( n/ ) décrivent seulement les appels recursifs ligne et. Donc, on a une complexité en nombre de comparaisons qui est en O(n ln(n)).

UPMC Année / Algorithme : PlusProches Entrées : les tableaux de points T X, T Y. Sorties : Deux points à distance minimum et δ la distance minimum. PlusProches(T X, T Y ) si longueur(t X) < alors retourner PlusProcheNaïf(T X, T Y ); (med x, T G X, T D X, T G Y, T D Y ) := DiviserP oints(t X, T Y ); (p G 0, p G, δ ) := P lusp roches(t G X, T G Y ); (p D 0, p D, δ ) := P lusp roches(t D X, T D Y ); si δ < δ alors (p 0, p, δ) := (p G 0, p G, δ ); (p 0, p, δ) := (p D 0, p D, δ ); 0 T Y := BandeV erticale(t Y, δ, med x ); (b, p 0, p, δ ) := DeP artetdautre(t Y, δ); si b = V RAI alors (p 0, p, δ) := (p 0, p, δ ); retourner (p 0, p, δ) ; Le prétraitement qui consiste à créer les tableaux triés T X et T Y se fait aussi en O(n ln(n)) comparaisons avec un algorithme de tri comme tri fusion par exemple.