290

Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

Algorithmes et Programmation

Ecole Polytechnique

Robert Cori Jean�Jacques L�vy

Page 2: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

Page 3: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

TABLE DES MATI�RES �

Table des mati�res

Introduction �

Complexit� des algorithmes ��

Scalaires ��

Les entiers � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��Les nombres �ottants � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��

� Tableaux ��

��� Le tri � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ������� M�thodes de tri �l�mentaires � � � � � � � � � � � � � � � � � � � � ������� Analyse en moyenne � � � � � � � � � � � � � � � � � � � � � � � � � ������ Le tri par insertion � � � � � � � � � � � � � � � � � � � � � � � � � � �

��� Recherche en table � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ������� La recherche s�quentielle � � � � � � � � � � � � � � � � � � � � � � � ������� La recherche dichotomique � � � � � � � � � � � � � � � � � � � � � � ������� Insertion dans une table � � � � � � � � � � � � � � � � � � � � � � � ������� Hachage � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��

��� Programmes en Caml � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��

� R�cursivit�

��� Fonctions r�cursives � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ������� Fonctions num�riques � � � � � � � � � � � � � � � � � � � � � � � � ������� La fonction d�Ackermann � � � � � � � � � � � � � � � � � � � � � � � ����� R�cursion imbriqu�e � � � � � � � � � � � � � � � � � � � � � � � � � �

��� Ind�cidabilit� de la terminaison � � � � � � � � � � � � � � � � � � � � � � � ���� Proc�dures r�cursives � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ����� Fractales � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ����� Quicksort � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���� Le tri par fusion � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��� Programmes en Caml � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �

� Structures de donn�es �l�mentaires ��

��� Listes cha�n�es � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���� Files � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���� Piles � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���� Evaluation des expressions arithm�tiques pr��x�es � � � � � � � � � � � � ���� Op�rations courantes sur les listes � � � � � � � � � � � � � � � � � � � � � � �� Programmes en Caml � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �

Page 4: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� TABLE DES MATI�RES

Arbres ����� Files de priorit� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ����� Borne inf�rieure sur le tri � � � � � � � � � � � � � � � � � � � � � � � � � � ����� Impl�mentation d�un arbre � � � � � � � � � � � � � � � � � � � � � � � � � � ����� Arbres de recherche � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���� Arbres �quilibr�s � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ����� Programmes en Caml � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���

Graphes ������ D��nitions � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ������ Matrices d�adjacence � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ������ Fermeture transitive � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ������ Listes de successeurs � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �� ��� Arborescences � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ����� Arborescence des plus courts chemins� � � � � � � � � � � � � � � � � � � � ����� Arborescence de Tr�maux � � � � � � � � � � � � � � � � � � � � � � � � � � ����� Composantes fortement connexes � � � � � � � � � � � � � � � � � � � � � � ��

���� D��nitions et algorithme simple � � � � � � � � � � � � � � � � � � � �� ���� Utilisation de l�arborescence de Tr�maux � � � � � � � � � � � � � ������� Points d�attache � � � � � � � � � � � � � � � � � � � � � � � � � � � ���

��� Programmes en Caml � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���

� Analyse Syntaxique ����� D��nitions et notations � � � � � � � � � � � � � � � � � � � � � � � � � � � ���

���� Mots � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ������� Grammaires � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���

�� Exemples de Grammaires � � � � � � � � � � � � � � � � � � � � � � � � � � ������� Les syst�mes de parenth�ses � � � � � � � � � � � � � � � � � � � � � ������� Les expressions arithm�tiques pr��x�es � � � � � � � � � � � � � � � ������� Les expressions arithm�tiques � � � � � � � � � � � � � � � � � � � ������� Grammaires sous forme BNF � � � � � � � � � � � � � � � � � � � � ���

�� Arbres de d�rivation et arbres de syntaxe abstraite � � � � � � � � � � � � ���� Analyse descendante r�cursive � � � � � � � � � � � � � � � � � � � � � � � � ���� Analyse LL � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���� Analyse ascendante � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���� Evaluation � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���� Programmes en Caml � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��

� Modularit� �� �� Un exemple� les �les de caract�res � � � � � � � � � � � � � � � � � � � � � � ��� �� Interfaces et modules � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �� �� Interfaces et modules en Java � � � � � � � � � � � � � � � � � � � � � � � � � �� Compilation s�par�e et librairies � � � � � � � � � � � � � � � � � � � � � � � �� D�pendances entre modules � � � � � � � � � � � � � � � � � � � � � � � � � � � Tri topologique � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �� � Un exemple de module en C � � � � � � � � � � � � � � � � � � � � � � � � � � � � Modules en Caml � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �

� Exploration ����� Algorithme glouton � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �

���� A�ectation d�une ressource � � � � � � � � � � � � � � � � � � � � � � ���� Arbre recouvrant de poids minimal � � � � � � � � � � � � � � � � � � �

�� Exploration arborescente � � � � � � � � � � � � � � � � � � � � � � � � � � � ������ Sac � dos � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��

Page 5: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

TABLE DES MATI�RES �

���� Placement de reines sur un �chiquier � � � � � � � � � � � � � � � � ���� Programmation dynamique � � � � � � � � � � � � � � � � � � � � � � � � � ��

���� Plus courts chemins dans un graphe � � � � � � � � � � � � � � � � ������ Sous�s�quences communes � � � � � � � � � � � � � � � � � � � � � � �

�� Programmes en Caml � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �

A Java ���A�� Exemples simples � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A�� Symboles � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���

A���� S�parateurs� commentaires � � � � � � � � � � � � � � � � � � � � � � ���A���� Mots r�serv�s� op�rateurs � � � � � � � � � � � � � � � � � � � � � � ���A���� Identi�cateurs� litt�raux � � � � � � � � � � � � � � � � � � � � � � � ���

A�� Types primitifs � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A���� Num�rique entier � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A���� Num�rique �ottant � � � � � � � � � � � � � � � � � � � � � � � � � � ���A���� Bool�ens � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A���� Caract�res � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���

A�� Expressions � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A���� Expressions arithm�tiques � � � � � � � � � � � � � � � � � � � � � � ���A���� Expressions logiques � � � � � � � � � � � � � � � � � � � � � � � � � ���A���� Concat�nation � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��A���� Expressions sur les bits � � � � � � � � � � � � � � � � � � � � � � � ��A���� Pr�c�dences � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��

A�� Instructions � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �� A���� A�ectations � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �� A���� Incr�mentation � � � � � � � � � � � � � � � � � � � � � � � � � � � � �� A���� Conversions � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��A���� Instructions conditionnelles � � � � � � � � � � � � � � � � � � � � � ���A���� It�rations � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���

A� Tableaux � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A��� D�claration� construction � � � � � � � � � � � � � � � � � � � � � � ���A��� Matrices � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���

A� Fonctions� Proc�dures � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A� �� R�sultat void � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A� �� Variables locales� globales � � � � � � � � � � � � � � � � � � � � � � ���

A� Classes � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A��� Constructeurs � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A��� Champs statiques � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A��� M�thodes statiques et dynamiques� � � � � � � � � � � � � � � � � � ��A��� Copie� destruction � � � � � � � � � � � � � � � � � � � � � � � � � � ��A��� Surcharge � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��

A�� Entr�es�Sorties � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A���� sur le terminal � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A���� Sur des �chiers � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���

A��� Exceptions � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A��� Carr�s magiques � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���

A����� Pr�sentation � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A����� Texte du programme � � � � � � � � � � � � � � � � � � � � � � � � � ���A����� Explications � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���

A��� Sous�classes � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��A��� Fonctions graphiques � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��

A����� Fonctions �l�mentaires � � � � � � � � � � � � � � � � � � � � � � � � ��A����� Rectangles � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���

Page 6: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

TABLE DES MATI�RES

A����� La classe Maclib � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A����� Jeu de balle � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���

A��� Syntaxe BNF de Java � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A����� Contantes litt�rales � � � � � � � � � � � � � � � � � � � � � � � � � � ���A����� Types� valeurs� et variables � � � � � � � � � � � � � � � � � � � � � ���A����� Noms � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A����� Packages � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A����� Classes � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A���� Interfaces � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���A���� Tableaux � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��A���� Blocs et instructions � � � � � � � � � � � � � � � � � � � � � � � � � ��A����� Expressions � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���

B Caml ���B�� Un exemple simple � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���B�� Quelques �l�ments de Caml � � � � � � � � � � � � � � � � � � � � � � � � � ��

B���� Fonctions � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��B���� Symboles� s�parateurs� identi�cateurs � � � � � � � � � � � � � � � � ���B���� Types de base � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���B���� Expressions � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���B���� Blocs et port�e des variables � � � � � � � � � � � � � � � � � � � � � ���B��� Correction des programmes � � � � � � � � � � � � � � � � � � � � � ���B��� Instructions � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���B��� Exceptions � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��B���� Entr�es � Sorties � � � � � � � � � � � � � � � � � � � � � � � � � � � �� B����� D��nitions de types � � � � � � � � � � � � � � � � � � � � � � � � � ��B����� Modules � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���B����� Fonctions graphiques � � � � � � � � � � � � � � � � � � � � � � � � � ��

B�� Syntaxe BNF de Caml � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���

C Initiation au syst�me Unix ���C�� Trousse de Survie � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��

C���� Se connecter � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��C���� Se d�connecter � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��C���� Le syst�me de fen�tres par d�faut � � � � � � � � � � � � � � � � � � ��C���� Obtenir de l�aide � � � � � � � � � � � � � � � � � � � � � � � � � � � ��C���� Changer son mot de passe � � � � � � � � � � � � � � � � � � � � � � ��C��� Courrier �lectronique � � � � � � � � � � � � � � � � � � � � � � � � � ��C��� �diteur de texte � � � � � � � � � � � � � � � � � � � � � � � � � � � �C��� Manipulations simples de �chiers � � � � � � � � � � � � � � � � � � �C���� Cycles de mise au point � � � � � � � � � � � � � � � � � � � � � � � � C����� Types de machines � � � � � � � � � � � � � � � � � � � � � � � � � � �

C�� Approfondissement � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � C���� Syst�me de �chiers � � � � � � � � � � � � � � � � � � � � � � � � � � � C���� Raccourcis pour les noms de �chiers � � � � � � � � � � � � � � � � � �C���� Variables � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �C���� Le chemin d�acc�s aux commandes � � � � � � � � � � � � � � � � � � �C���� Quotation � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �C��� Redirections et �ltres � � � � � � � � � � � � � � � � � � � � � � � � � � �C��� Processus � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �C��� Programmation du shell � � � � � � � � � � � � � � � � � � � � � � � � �

C�� Unix et le r�seau de l�X � � � � � � � � � � � � � � � � � � � � � � � � � � � � C�� Bibliographie Unix � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �

Page 7: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

TABLE DES MATI�RES

Bibliographie ��

Table des �gures ���

Index ���

Page 8: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

TABLE DES MATI�RES

Page 9: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

AVANT�PROPOS �

Avant�propos

Nous remercions Serge Abiteboul� Fran�ois Anceau� Jean Berstel� Thierry Besan�on�Jean Betr�ma� Fran�ois Bourdoncle� Philippe Chassignet� Georges Gonthier� FlorentGuillaume� Martin Jourdan� Fran�ois Morain� Dominique Perrin� Jean�Eric Pin� NicolasPioch� Bruno Salvy� Michel Weinfeld� Paul Zimmermann pour avoir relu avec attentionce cours� Michel Mauny et Didier R�my pour leurs macros TEX� Ravi Sethi pour nousavoir donn� les sources pic des dessins de ses livres ��� ��� Martin Jourdan pour avoirfourni ces sources� Georges Gonthier pour sa connaissance de C� de pic et du reste�Damien Doligez pour ses talents de metteur au point� pour les dessins� les scripts enPerl et sa grande connaissance du Macintosh� Xavier Leroy pour ses magni�ques shell�scripts� Bruno Salvy pour sa grande connaissance de Maple� Pierre Weis pour son aideen CAML� Paul Zimmermann pour sa rigueur� Philippe Chassignet pour son expertiseen graphique Macintosh � � � et tous ceux que nous avons oubli�s involontairement�

Nous devons sp�cialement mentionner Pierre Weis� auteur de l�annexe Caml� etDamien Doligez et Xavier Leroy� auteurs de l�annexe sur Unix� ainsi que DominiqueMoret et G�rard Guillerm du Centre Informatique pour l�adaptation de cette annexeau contexte de l�X�

Bruno Blanchet� Fran�ois Bourdoncle� Philippe Chassignet� et Georges Gonthier ont�galement contribu� � l�adaptation du polycopi� au langage Java�

En�n� Pascal Brisset et � Luc Maranget ont traduit le polycopi� en document HTML�maintenant consultable sur le World Wide Web � l�adresse

http���w��edu�polytechnique�fr�informatique�info��html�

Polycopi�� version ���

Page 10: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� AVANT�PROPOS

Page 11: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

INTRODUCTION ��

Introduction

L�informatique qui est au coeur de la r�volution due � l�essor des technologies de l�in�formation est directement responsable de la croissance actuelle des pays occidentaux� Lesindices de chi�re d�a�aires des secteurs de services dans l�informatique avaient d�j� tr�svivement augment� depuis �� ans� ils ont connu ces deux derni�res ann�es une proges�sion spectaculaire d�passant ���� Une mani�re de pens�e et de communication a d�coul�de cette rapide �volution� L�informatique appara�t comme une discipline scienti�que in�troduisant des probl�mes nouveaux ou faisant revivre d�autres� Certains pensent quel�informatique est la partie constructive des math�matiques� puisqu�on ne s�y contentepas de th�or�mes d�existence� mais du calcul des objets� D�autres y voient les math��matiques concr�tes� puisque le domaine a l�exactitude et la rigueur des math�matiques�et que la confrontation des id�es abstraites � la r�alisation de programmes interdit leraisonnement approximatif� Une autre communaut� est int�ress�e surtout par la par�tie physique du domaine� car une bonne part des progr�s de l�informatique est due aud�veloppement foudroyant de la micro��lectronique�

La jeunesse de l�informatique permet � certains de nier son aspect scienti�que� �lesordinateurs ne sont que des outils pour faire des calculs ou des machines traitementde texte � Malheureusement� beaucoup de �fous de la programmation �tayent l�argu�ment pr�c�dent en ignorant toute consid�ration th�orique qui puisse les aider dans leursconstructions souvent tr�s habiles� Regardons la d��nition du mot hacker fournie dansThe New Hacker�s Dictionary ����� dictionnaire relu et corrig� �lectroniquement par unebonne partie de la communaut� informatique�

hacker �originally� someone who makes furniture with an axe� n� �� A personwho enjoys exploring the details of programmable systems and how to stretchtheir capabilities� as opposed to most users� who prefer to learn only the mi�nimum necessary� � One who programs enthusiastically even obsessively�or who enjoys programming rather than just theorizing about programming��� A person capable of appreciating hack value� � A person who is goodat programming quickly� �� An expert at a particular program� or one whofrequently does work using it or on it� as in �a Unix hacker�� �� An expertor enthusiast of any kind� One might be an astronomy hacker� for example��� One who enjoys the intellectual challenge of creatively overcoming or cir�cumventing limitations� �� �deprecated� A malicious meddler who tries todiscover sensitive information by poking around� Hence password hacker�network hacker� See cracker�

Hacker est un mot courant pour d�signer un programmeur passionn�� On peut consta�ter toutes les connotations contradictoires recouvertes par ce mot� La d��nition la plusinfamante est �� One who � � � enjoys programming rather than just theorizing aboutprogramming� � Le point de vue que nous d�fendrons dans ce cours sera quelque peudi��rent� Il existe une th�orie informatique !ce que ne contredit pas la d��nition pr�c��dente" et nous essaierons de d�montrer qu�elle peut aussi se r�v�ler utile� De mani�reassez extraordinaire� peu de disciplines o�rent la possibilit� de passer des connaissances

Page 12: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� INTRODUCTION

th�oriques � l�application pratique aussi rapidement� Avec les syst�mes informatiquesmodernes� toute personne qui a l�id�e d�un algorithme peut s�asseoir derri�re un termi�nal� et sans passer par une lourde exp�rimentation peut mettre en pratique son id�e� Biens#r� l�apprentissage d�une certaine gymnastique est n�cessaire au d�but� et la construc�tion de gros syst�mes informatiques est bien plus longue� mais il s�agit alors d�installerun nouveau service� et non pas d�exp�rimenter une id�e� En informatique� th�orie etpratique sont tr�s proches�

D�abord� il n�existe pas une seule th�orie de l�informatique� mais plusieurs th�oriesimbriqu�es� logique et calculabilit�� algorithmique et analyse d�algorithmes� conceptionet s�mantique des langages de programmation� bases de donn�es� principes des sys�t�mes d�exploitation� architectures des ordinateurs et �valuation de leurs performances�r�seaux et protocoles� langages formels et compilation� codes et cryptographie� appren�tissage et zero�knowledge algorithms� calcul formel� d�monstration automatique� concep�tion et v�ri�cation de circuits� v�ri�cation et validation de programmes� temps r�el etlogiques temporelles� traitement d�images et vision� synth�se d�image� robotique� � � �

Chacune des approches pr�c�dentes a ses probl�mes ouverts� certains sont tr�s c��l�bres� Un des plus connus est de savoir si P � NP � c�est���dire si tous les algorithmesd�terministes en temps polynomial sont �quivalents aux algorithmes non d�terministespolynomiaux� Plus concr�tement� peut�on trouver une solution polynomiale au probl�medu voyageur de commerce� !Celui�ci a un ensemble de villes � visiter et il doit organisersa tourn�e pour qu�elle ait un trajet minimal en kilom�tres"� Un autre est de trouver unes�mantique aux langages pour la programmation objet� Cette technique de program�mation incr�mentale est particuli�rement utile dans les gros programmes graphiques� Ace jour� on cherche encore un langage de programmation objet dont la s�mantique soitbien claire et qui permette de programmer proprement� Pour r�sumer� en informatique�il y a des probl�mes ouverts�

Quelques principes g�n�raux peuvent n�anmoins se d�gager� D�abord� en informa�tique� il est tr�s rare qu�il y ait une solution unique � un probl�me donn�� Tout lemonde a sa version d�un programme� contrairement aux math�matiques o$ une solu�tion s�impose relativement facilement� Un programme ou un algorithme se trouve tr�ssouvent par ra%nements successifs� On d�marre d�un algorithme abstrait et on �voluelentement par optimisations successives vers une solution d�taill�e et pouvant s�ex�cu�ter sur une machine� C�est cette diversit� qui donne par exemple la complexit� de lacorrection d�une composition ou d�un projet en informatique !� l�Ecole Polytechniquepar exemple"� C�est aussi cette particularit� qui fait qu�il y a une grande diversit� entreles programmeurs� En informatique� la solution unique � un probl�me n�existe pas�

Ensuite� les syst�mes informatiques repr�sentent une incroyable construction� unecath�drale des temps modernes� Jamais une discipline n�a si rapidement fait un telempilement de travaux� Si on essaie de r�aliser toutes les op�rations n�cessaires pourd�placer un curseur sur un �cran avec une souris� ou a%cher l��cho de ce qu�on frappesur un clavier� on ne peut qu��tre surpris par les di��rentes constructions intellectuellesque cela a demand�es� On peut dire sans se tromper que l�informatique sait utiliser latransitivit�� Par exemple� ce polycopi� a �t� frapp� � l�aide du traitement de texte LATEX���� de L� Lamport !jeu de macros TEX de D� Knuth ���"� les caract�res ont �t� calcul�sen METAFONT de D� Knuth �� �� les dessins en gpic version Gnu !R� Stallman" de picde B� Kernighan ����� On ne comptera ni le syst�me Macintosh !qui d�rive fortementde l�Alto et du Dorado faits � Xerox PARC ���� ���"� ni OzTeX !TEX sur Macintosh"�ni les �diteurs QED� Emacs� Alpha� ni le syst�me Unix fait � Bell laboratories ����� lesmachines Dec Stations ����� ����� Sun Sparc�� ni leurs composants MIPS ����&����

Page 13: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

INTRODUCTION ��

���� ou Sparc� ni le r�seau Ethernet !Xerox�PARC ���" qui permet d�atteindre les ser�veurs �chiers� ni les r�seaux Transpac qui permettent de travailler � la maison� ni lesimprimantes Laser et leur langage PostScript� successeur d�InterPress !J� Warnock �Xerox�PARC� puis Adobe Systems" ���� qui permettent l�impression du document� Onpeut �valuer facilement l�ensemble � quelques millions de lignes de programme et �ga�lement � quelques millions de transistors� Rien de tout cela n�existait en ���� Toutn�est que gigantesque m�cano� qui s�est assembl� di%cilement� mais dont on commence� comprendre les crit�res n�cessaires pour en composer les di��rents �l�ments� En in�formatique� on doit composer beaucoup d�objets�

Une autre remarque est la rapidit� de l��volution de l�informatique� Une loi due� B� Joy dit que les micro�ordinateurs doublent de vitesse tous les deux ans� et � prixconstant� Cette loi n�a pas �t� invalid�e depuis �� ' !cf� le livre de Hennessy et Patterson����"� Si on regarde les densit�s des m�moires ou des disques� on constate que desmachines de taille m�moire honorable de �� kilo�Octets en �� ont au minimum ��M�ga�Octets aujourd�hui� De m�me� on est pass� de disques de �� MO de �� poucesde diam�tre et de �� cm de hauteur � des disques ��� pouces de � GO !Giga�Octets" decapacit� et de �cm de hauteur� Une machine portable de ��� kg peut avoir un disquede ��� MO� Il faut donc penser tout projet informatique en termes �volutifs� Il estinutile d��crire un programme pour une machine sp�ci�que� puisque dans deux ans lemat�riel ne sera plus le m�me� Tout programme doit �tre pens� en termes de portabilit��il doit pouvoir fonctionner sur toute machine� C�est pourquoi les informaticiens sontmaintenant attach�s aux standards� Il est frustrant de ne pouvoir faire que des t(chesfugitives� Les standards !comme par exemple le syst�me Unix ou le syst�me de fen�tresX�Window qui sont des standards de facto" assurent la p�rennit� des programmes� Eninformatique� on doit programmer en utilisant des standards�

Une autre caract�ristique de l�informatique est le c)t� instable des programmes�Ils ne sont souvent que gigantesques constructions� qui s��croulent si on enl�ve unepetite pierre� Le �� janvier ����� une panne t�l�phonique a bloqu� tous les appelslongue distance aux Etats�Unis pendant une apr�s�midi� Une instruction break quiarr�tait le contr)le d�un for dans un programme C s�est retrouv�e dans une instructionswitch qui avait �t� ins�r�e dans le for lors d�une nouvelle version du programmede gestion des centraux d�AT*T� Le logiciel de test n�avait pas explor� ce recoin duprogramme� qui n�intervenait qu�accidentellement en cas d�arr�t d�urgence d�un central�Le r�sultat de l�erreur fut que le programme marcha tr�s bien jusqu�� ce qu�interviennel�arr�t accidentel d�un central� Celui�ci� � cause de l�erreur� se mit � avertir aussit)t tousses centraux voisins� pour leur dire d�appliquer aussi la proc�dure d�arr�t d�urgence�Comme ces autres centraux avaient tous aussi la nouvelle version du programme� ilsse mirent �galement � parler � leurs proches� Et tout le syst�me s��croula en quelquesminutes� Personne ne s��tait rendu compte de cette erreur� puisqu�on n�utilisait jamaisla proc�dure d�urgence et� typiquement� ce programme s�est e�ondr� brutalement� Il esttr�s rare en informatique d�avoir des ph�nom�nes continus� Une panne n�est en g�n�ralpas le r�sultat d�une d�gradation perceptible� Elle arrive simplement brutalement� C�estce c)t� exact de l�informatique qui est tr�s attrayant� En informatique� il y a peu desolutions approch�es� En informatique� il y a une certaine notion de l�exactitude�

Notre cours doit �tre compris comme une initiation � l�informatique� et plus exac�tement � l�algorithmique et � la programmation� Il s�adresse � des personnes dont noustenons pour acquises les connaissances math�matiques� nulle part on n�expliquera cequ�est une r�currence� une relation d��quivalence ou une congruence� Il est orient� versl�algorithmique� c�est���dire la conception d�algorithmes !et non l�analyse tr�s pr�cisede leur performance"� et la programmation� c�est���dire leur implantation pratique surordinateur !et non l��tude d�un + ou de plusieurs + langage!s" de programmations"�

Page 14: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� INTRODUCTION

Les cours d�algorithmique sont maintenant bien catalogu�s� et la r�f�rence principale surlaquelle nous nous appuierons est le livre de Sedgewick �� �� Une autre r�f�rence int�res�sante par sa compl�tude et sa pr�sentation est le livre de Cormen� Leiserson et Rivest����� Il existe bien d�autres ouvrages� Gonnet et Baeza�Yates ����� Berstel�Pin�Pocchiola��� Manber ����� Graham�Knuth�Patashnik �� �� � � � Il faut aussi bien s#r signaler leslivres de Knuth ��� ��� ���� Les cours de programmation sont moins clairement d��nis�Ils d�pendent souvent du langage de programmation ou du type de langage de program�mation choisi� Nous nous appuierons sur le polycopi� de P� Cousot ����� sur le livre deKernighan et Ritchie pour C ����� sur le livre de Wirth pour Pascal ����� sur le livre deNelson ���� ou Harbison pour Modula������

Le cours est organis� selon les structures de donn�es et les m�thodes de program�mation� utilis�es dans di��rents algorithmes� Ainsi seront consid�r�s successivement lestableaux� les listes� les piles� les arbres� les �les de priorit�� les graphes� En parall�le� onregardera di��rentes m�thodes de programmation telles que la r�cursivit�� les interfacesou modules� la compilation s�par�e� le backtracking� la programmation dynamique� En��n� nous essaierons d�encha�ner sur di��rents th�mes� Le premier d�entre eux sera laprogrammation symbolique� Un autre sera la validation des programmes� notammenten pr�sence de ph�nom�nes asynchrones� En�n� on essaiera de mentionner les di��rentesfacettes des langages de programmation !garbage collection� exceptions� modules� po�lymorphisme� programmation incr�mentale� surcharge"� Nous fournirons pour chaquealgorithme deux versions du programme !quand nous en montrerons son impl�men�tation"� une dans le langage Java et une autre en Caml !langage enseign� en classespr�paratoires"� Une introduction � Java �gurera en annexe� ainsi qu�un rappel de Caml�La lecture des chapitres et des annexes peut se mener en parall�le� Le lecteur qui conna�tles langages de programmation n�aura pas besoin de consulter les annexes� Celui quid�marre en Java ou en Caml devra plut)t commencer par les appendices�

Le choix de consid�rer les langages Java et Caml est dict� par deux consid�rations�Ce sont d�abord des langages fortement typ�s� Il est impossible de �nir un programmepar une violation de la m�moire ou une erreur syst�me irr�missible� Les deux langagesv�ri�ent la validit� des index dans les acc�s aux tableaux ou des r�f�rences dans lesacc�s aux structures de donn�es dynamiques� Par ailleurs� les deux langages ont unegestion automatique de la m�moire� car ils disposent d�un glaneur de cellules !garbagecollector en anglais" permettant de r�cup�rer automatiquement l�espace m�moire perdu�Cela simpli�e notablement l��criture des programmes et permet de se concentrer surleur essence� L�allocation m�moire� elle� reste toujours explicite et on pourra toujourscomprendre l�espace m�moire exig� par un programme� Autrefois� le cours �tais fait enPascal et en C� il sera possible de disposer d�appendices donnant les programmes de cecours dans ces deux langages�

Historiquement� Java est un langage orient��objet� quoique nous utiliserons peu cetteparticularit� dans notre cours qui doit garder un aspect �l�mentaire� Il provient deSimula� � Smalltalk� Modula������ et C,,����� Caml est un langage plut)t fonctionnel�dialecte de ML� dont il existe plusieurs impl�mentations� Caml et SML&NJ d�velopp�s �l�INRIA et � Bell laboratories� Il provient de Lisp et de Scheme���� Depuis peu de temps�Caml dispose d�une tr�s e%cace extention orient�e objet� Objective Caml !Ocaml"� Lesdeux langages n�ont pas l�e%cacit� de C ou C,,� quoique ceci reste � d�montrer dans lamanipulation des structures de donn�es dynamiques� Mais � l��re des machines RISC�il vaut mieux essayer d��crire des programmes simples et compr�hensibles� C�est lestyle que nous voulons adopter ici� La structure de nos programmes sera tr�s souventind�pendante du langage de programmation� comme en attesteront les quatre versionsde chacun de nos programmes en Pascal� C� Caml ou Java�

Pour �tre bien clair� prenons l�exemple du calcul de �� Un programme C esth�tique�ment correct� qui utilise la formule ��� � arctan��� �

Pn��n�� ����n���n� ��� est

Page 15: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

INTRODUCTION ��

�include �stdio�h

�define N �

main��

float pi � �

int sign � ��

int n � ��

int m � ��

while �n � N�

pi � pi � �float�sign � m�

m � m � ��

sign � �sign�

��n�

pi � � � pi�

printf �����f�n�� pi��

Mais le programme C suivant ���� est interdit dans notre cours�

�define � �F� �� ��F�OO���

int F��OO��

main�� F�OO���printf������f�n�� ����F�OO�OO���F�OO��

�������

�����������������

�����������������������

���������������������������

�����������������������������

�����������������������������

�������������������������������

�������������������������������

�������������������������������

�������������������������������

�����������������������������

�����������������������������

���������������������������

�����������������������

�����������������

�������

Ce programme fait un nombre inconsid�r� d�appels au pr�processeur et beaucoup tropd�e�ets de bord !cf� page �� "� Il est illisible� Il faut avoir une conception simple etdonc esth�tique des programmes� On n�est plus � l��poque o$ tout se joue � l�instructionmachine pr�s� La puissance des ordinateurs a rendu tr�s viable la programmation sansoptimisations excessives� Tout l�art du programmeur est de comprendre les quelquesendroits critiques d�un programme� en g�n�ral tr�s peu nombreux� o$ les optimisationssont n�cessaires� Donc le programme cryptique pr�c�dent� ou tout autre bourr� d�opti�misations inutiles sera mauvais et donc interdit�

Dans cet exemple� typiquement� la convergence du calcul de � est mauvaise� Inutiledonc de chercher � optimiser ce programme� Il faut changer de formule pour le calcul�La formule de John Machin !���� ��" fait converger plus vite en calculant ��� �

Page 16: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� INTRODUCTION

� arctan����� � arctan������ Une autre technique consiste � taper sur la commandesuivante sur une machine de l�Ecole Polytechnique

� maple

����� MAPLE V

����� ����� Copyright �c� �������� by the University of Waterloo�

� MAPLE � All rights reserved� MAPLE is a registered trademark of

����� ���� Waterloo Maple Software�

� Type for help�

evalf�Pi����

�����!���!�!��"���������������"�!������"�������"!�!���"����!���"���

������������������!�����"�"��������!���������"�������!!!������

"�!�!�����������"�!�����"����!���!!!�����������!����������������

"!��!����������"!������"��"����!�"�������!���!�������������!�������

��������"���������"�"��!�"�����!!���"����!����������!���"�!����

��"���!�������!�!�������!���������!����!�������!"�"��!"!�!����

!��������"���������"���!���!��"�����"����"��!�"�!���!"!�"�������"���

����������������"�������!����������������!���"�"��"��"������"��

""!����"�"�����"�"!�����"������"����!���!����"��!���!���""�!""���

��"!""�����"���"�"�"�������������!������!��!�!�"�!"���"�����!����

�!�����!��������������������!�������""�""�����!��""�������������

�"��"����!�!�"��"����������!�!���!��!!����������!�����!������!�

�!����������"�����"���"!����!�"!�����������"�""�����"��!���!����

���"!!���"���!�!���������!�"�"!��"!��!""���!""�!���"������������"�

�"������!����������

quit�

Page 17: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

COMPLEXITE DES ALGORITHMES �

Complexit� des algorithmes

Dans ce cours� il sera question de complexit� d�algorithmes� c�est���dire du nombred�op�rations �l�mentaires !a�ectations� comparaisons� op�rations arithm�tiques" e�ec�tu�es par l�algorithme� Elle s�exprime en fonction de la taille n des donn�es� On ditque la complexit� de l�algorithme est O�f�n�� o$ f est d�habitude une combinaisonde polyn)mes� logarithmes ou exponentielles� Ceci reprend la notation math�matiqueclassique� et signi�e que le nombre d�op�rations e�ectu�es est born� par cf�n�� o$ c estune constante� lorsque n tend vers l�in�ni�

Consid�rer le comportement � l�in�ni de la complexit� est justi�� par le fait queles donn�es des algorithmes sont de grande taille et qu�on se pr�occupe surtout dela croissance de cette complexit� en fonction de la taille des donn�es� Une questionsyst�matique � se poser est� que devient le temps de calcul si on multiplie la taille desdonn�es par �-

Les algorithmes usuels peuvent �tre class�s en un certain nombre de grandes classesde complexit��

� Les algorithmes sub�lin�aires� dont la complexit� est en g�n�ral en O�log n�� C�estle cas de la recherche d�un �l�ment dans un ensemble ordonn� �ni de cardinal n�

� Les algorithmes lin�aires en complexit� O�n� ou en O�n logn� sont consid�r�scomme rapides� comme l��valuation de la valeur d�une expression compos�e de nsymboles ou les algorithmes optimaux de tri�

� Plus lents sont les algorithmes de complexit� situ�e entre O�n�� et O�n��� c�est lecas de la multiplication des matrices et du parcours dans les graphes�

� Au del�� les algorithmes polynomiaux en O�nk� pour k � sont consid�r�s commelents� sans parler des algorithmes exponentiels !dont la complexit� est sup�rieure� tout polyn)me en n" que l�on s�accorde � dire impraticables d�s que la taille desdonn�es est sup�rieure � quelques dizaines d�unit�s�

La recherche de l�algorithme ayant la plus faible complexit�� pour r�soudre un pro�bl�me donn�� fait partie du travail r�gulier de l�informaticien� Il ne faut toutefois pastomber dans certains exc�s� par exemple proposer un algorithme excessivement alam�biqu�� d�veloppant mille astuces et ayant une complexit� en O�n������ alors qu�il existeun algorithme simple et clair de complexit� O�n��� Surtout� si le gain de l�exposant den s�accompagne d�une perte importante dans la constante multiplicative� passer d�unecomplexit� de l�ordre de n��� � une complexit� de ����n logn n�est pas vraiment uneam�lioration� Les crit�res de clart� et de simplicit� doivent �tre consid�r�s comme aussiimportants que celui de l�e%cacit� dans la conception des algorithmes�

Page 18: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� COMPLEXITE DES ALGORITHMES

Page 19: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

SCALAIRES ��

Scalaires

Faisons un rappel succinct du calcul scalaire dans les programmes� Il y a deuxgrandes cat�gories d�objets scalaires dans les programmes� les entiers en virgule �xe� lesr�els en virgule �ottante� on peut aussi utiliser ces scalaires � l�aide de repr�sentationssymboliques utilisant di��rents types de bases

Les entiers

Le calcul entier est relativement simple� Les nombres sont en fait calcul�s dans unearithm�tique modulo N � �n o$ n est le nombre de bits des mots machines�

n N Exemple� � �� � �� ��� Macintosh SE&���� � ��� � �� � �� ��� Pentium� � �� �� � � �� ��� � � �� ���� Alpha

Fig� � � Bornes sup�rieures des nombres entiers

Ainsi� les processeurs de ���� peuvent avoir une arithm�tique pr�cise sur quelquesmilliards de milliards� ��� fois plus rapide qu�une machine � bits' Il faut toutefois faireattention � la multiplication ou pire � la division qui a tendance sur les machines RISC!Reduced Instruction Set Computers" � prendre beaucoup plus de temps qu�une simpleaddition� typiquement �� fois plus sur le processeur R���� de Mips� Cette pr�cision peut�tre particuli�rement utile dans les calculs pour acc�der aux �chiers� En e�et� on a desdisques de plus de � Giga Octets actuellement� et l�arithm�tique �� bits est insu%santepour adresser leurs contenus�

Il faut pouvoir aussi utiliser des nombres n�gatifs� La notation couramment utilis�eest celle du compl�ment � �� En notation binaire� le bit le plus signi�catif est le bitde signe� Au lieu de parler de l�arithm�tique entre � et �n � �� les nombres sont prisentre ��n�� et �n�� � �� Soit� pour n � ��� sur l�intervalle ������ ������ En Java�Integer�MAX�VALUE � �n���� est le plus grand entier positif et Integer�MIN�VALUE ���n�� le plus petit entier n�gatif� En Caml� max�int � �n�� � � et min�int � ��n���

Une op�ration entre � nombres peut cr�er un d�bordement� c�est���dire d�passerles bornes de l�intervalle� Mais elle respecte les r�gles de l�arithm�tique modulo N �Selon le langage de programmation et son impl�mentation sur une machine donn�e� ced�bordement est test� ou non� Ni Java� ni Caml ne font ces tests�

Les nombres �ottants

La notation �ottante sert � repr�senter les nombres r�els a�n d�atteindre des valeursimpossibles � obtenir en notation �xe� Un nombre �ottant a une partie signi�cative� lamantisse� et une partie exposant� Un nombre �ottant tient souvent sur le m�me nombre

Page 20: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� SCALAIRES

de bits n qu�un nombre entier� En �ottant� on d�compose n � s� p� q en trois champspour le signe� la mantisse et l�exposant� qui sont donn�s par la machine� Ainsi toutnombre r�el �crit �signe decimal e exposant en Java ou Caml� vaut

signe decimal � ��exposant

Les nombres �ottants sont une approximation des nombres r�els� car leur partie signi��cative f ne tient que sur un nombre p de bits �ni� Par exemple� p � � en simplepr�cision� Le nombre de bits pour l�exposant e est q � � en simple pr�cision� ce qui faitque le nombre de bits total� avec le bit de signe� est bien ���

Pour rendre portables des programmes utilisant les nombres �ottants� une normeIEEE �� !the Institute of Electrical and Electronics Engineers" a �t� d��nie� Non seule�ment elle d�crit les bornes des nombres �ottants� mais elle donne une convention pourrepr�senter des valeurs sp�ciales� ��� NaN !Not A Number" qui permettent de donnerdes valeurs � des divisions par z�ro� ou � des racines carr�es de nombres n�gatifs parexemple� Les valeurs sp�ciales permettent d��crire des programmes de calcul de racinesde fonctions �ventuellement discontinues�

La norme IEEE est la suivante

Exposant Mantisse Valeure � emin � � f � � ��e � emin � � f �� � �� f � �emin

emin � e � emax �� f � �e

e � emax � � f � � ��e � emax � � f �� � NaN

Fig� � � Valeurs sp�ciales pour les �ottants IEEE

et les formats en bits simple et double pr�cision sont

Param�tre Simple Doublep �� ��q � ��emax ��� �����emin ��� �����Taille totale du mot �� �

Fig� � � Formats des �ottants IEEE

On en d�duit donc que la valeur absolue de tout nombre �ottant x v�ri�e en simplepr�cision

����� � ����� � jxj � ��� � � ���

et en double pr�cision

�� ������ � ����� � jxj � ����� � ����

Par ailleurs� la pr�cision d�un nombre �ottant est ���� � ��� en simple pr�cision et���� � � � ����� en double pr�cision� On perd donc � � � chi�res de pr�cision parrapport aux op�rations enti�res� Il faut comprendre aussi que deux nombres �ottantssont align�s avant toute addition ou soustraction� ce qui entra�ne des pertes de pr�cision�Par exemple� l�addition d�un tr�s petit nombre � un grand nombre va laisser ce dernier

Page 21: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

SCALAIRES ��

inchang�� Il y a alors d�passement de capacit� vers le bas !under�ow"� Un bon exerciceest de montrer que la s�rie harmonique converge en informatique �ottante� ou quel�addition �ottante n�est pas associative' Il y a aussi des d�bordements de capacit� versle haut !over�ows"� Ces derniers sont en g�n�ral plus souvent test�s que les d�passementsvers le bas�

En�n� pour �tre complet� la repr�sentation machine des nombres �ottants est l�g�re�ment di��rente en IEEE� En e�et� on s�arrange pour que le nombre � puisse �tre repr��sent� par le mot machine dont tous les bits sont �� et on additionne la partie exposantdu mot machine �ottant de emin� �� c�est���dire de �� en simple pr�cision� ou de ����en double pr�cision�

Page 22: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� SCALAIRES

Page 23: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��

Chapitre �

Tableaux

Les tableaux sont une des structures de base de l�informatique� Un tableau repr�senteselon ses dimensions� un vecteur ou une matrice d��l�ments d�un m�me type� Un tableaupermet l�acc�s direct � un �l�ment� et nous allons nous servir grandement de cettepropri�t� dans les algorithmes de tri et de recherche en table que nous allons consid�rer�

��� Le tri

Qu�est�ce qu�un tri- On suppose qu�on se donne une suite de N nombres entiershaii� et on veut les ranger en ordre croissant au sens large� Ainsi� pour N � ��� la suite

h��� � ��� ��� � � ��� �� �� �idevra devenir

h� � �� � ��� ��� �� ��� �� ��iCe probl�me est un classique de l�informatique� Il a �t� �tudi� en d�tail� cf� la moiti�du livre de Knuth ����� En tant qu�algorithme pratique� on le rencontre souvent� Parexemple� il faut �tablir le classement de certains �l�ves� mettre en ordre un dictionnaire�trier l�index d�un livre� faire une sortie lisible d�un correcteur d�orthographe� � � � Ilfaudra bien faire la distinction entre le tri d�un grand nombre d��l�ments !plusieurscentaines"� et le tri de quelques �l�ments !un paquet de cartes"� Dans ce dernier cas� lam�thode importe peu� Un algorithme amusant� bogo�tri� consiste � regarder si le paquetde cartes est d�j� ordonn�� Sinon� on le jette par terre� Et on recommence� Au bout d�uncertain temps� on risque d�avoir les cartes ordonn�es� Bien s#r� le bogo�tri peut ne passe terminer� Une autre technique fr�quemment utilis�e avec un jeu de cartes consiste �regarder s�il n�y a pas une transposition � e�ectuer� D�s qu�on en voit une � faire� on lafait et on recommence� Cette m�thode marche tr�s bien sur une bonne distribution decartes�

Plus s�rieusement� il faudra toujours avoir � l�esprit que le nombre d�objets � trierest important� Ce n�est pas la peine de trouver une m�thode sophistiqu�e pour trier ���l�ments� Pourtant� les exemples trait�s dans un cours sont toujours de taille limit�e�pour des raisons p�dagogiques il n�est pas possible de repr�senter un tri sur plusieursmilliers d��l�ments� Le tri� par ses multiples facettes� est un tr�s bon exemple d��cole�En g�n�ral� on exigera que le tri se fasse in situ� c�est���dire que le r�sultat soit aum�me endroit que la suite initiale� On peut bien s#r trier autre chose que des entiers� Ilsu%t de disposer d�un domaine de valeurs muni d�une relation d�ordre total� On peutdonc trier des caract�res� des mots en ordre alphab�tique� des enregistrements selon uncertain champ� On supposera� pour simpli�er� qu�il existe une op�ration d��change ou

Page 24: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� TABLEAUX

plus simplement d�a�ectation sur les �l�ments de la suite � trier� C�est pourquoi nousprendrons le cas de valeurs enti�res�

����� M�thodes de tri �l�mentaires

Dans tout ce qui suit� on suppose que l�on trie des nombres entiers et que ceux�ci setrouvent dans un tableau a� L�algorithme de tri le plus simple est le tri par s�lection�Il consiste � trouver l�emplacement de l��l�ment le plus petit du tableau� c�est���direl�entier m tel que ai � am pour tout i� Une fois cet emplacement m trouv�� on �changeles �l�ments a� et am� Puis on recommence ces op�rations sur la suite ha�� a�� � � � � aN i�ainsi on recherche le plus petit �l�ment de cette nouvelle suite et on l��change avec a��Et ainsi de suite � � � jusqu�au moment o$ on n�a plus qu�une suite compos�e d�un seul�l�ment haN i�

La recherche du plus petit �l�ment d�un tableau est un des premiers exercices deprogrammation� La d�termination de la position de cet �l�ment est tr�s similaire� elles�e�ectue � l�aide de la suite d�instructions�

m � �

for �int j � �� j � N� ��j�

if �a#j$ � a#m$�

m � i�

L��change de deux �l�ments n�cessite une variable temporaire t et s�e�ectue par�

t � a#m$� a#m$ � a#�$� a#�$ � t�

Il faut refaire cette suite d�op�rations en remplacant � par �� puis par et ainsi de suitejusqu�� N � Ceci se fait par l�introduction d�une nouvelle variable i qui prend toutesles valeurs entre � et N � Ces consid�rations donnent lieu au programme pr�sent� end�tail ci�dessous� Pour une fois� nous l� �crivons pour une fois en totalit�� les proc�duresd�acquisition des donn�es et de restitution des r�sultats sont aussi fournies� Pour lesautres algorithmes� nous nous limiterons � la description de la proc�dure e�ective detri�

class TriSelection

final static int N � ��

static int#$ a � new int#N$� �� Le tableau � trier

static void initialisation�� �� On tire au sort des nombres�� entre � et ���� en initialisant�� le tirage au sort sur lheure

for �int i � � i � N� ��i�

a#i$ � �int� �Math�random�� � �����

static void impression��

for �int i � � i � N� ��i�

System�out�print �a#i$ � � ���

System�out�println �����

static void triSelection��

int min� t�

for �int i � � i � N � �� ��i�

min � i�

for �int j � i��� j � N� ��j�

Page 25: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� LE TRI ��

� � �� �� � � �� �� ��

i m

� � �� �� � � �� �� ��

i m

� � �� �� � � �� �� ��

i m

� � �� � � �� �� �� ��

i m

� � � �� � �� �� �� ��

i m

� � � �� � �� �� �� ��

i m

� � � �� �� � �� �� ��

i m

� � � �� �� �� � �� ��

i m

� � � �� �� �� � �� ��

i m

� � � �� �� �� � �� ��

Fig� ��� � Exemple de tri par s�lection

Page 26: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� TABLEAUX

if �a#j$ � a#min$�

min � j�

t � a#min$� a#min$ � a#i$� a#i$ � t�

public static void main �String args#$�

initialisation��� �� On lit le tableauimpression��� �� et on limprimetriSelection��� �� On trieimpression��� �� On imprime le rsultat

Il est facile de compter le nombre d�op�rations n�cessaires� A chaque it�ration� ond�marre � l��l�ment ai et on le compare successivement � ai��� ai��� � � � � aN � On faitdonc N � i comparaisons� On commence avec i � � et on �nit avec i � N � �� Donc onfait �N � �� � �N � �� � � � � � � � � � N�N � ���� comparaisons� et N � � �changes�Le tri par s�lection fait donc de l�ordre de N� comparaisons� Si N � ���� il y a ����comparaisons� soit � ms si on arrive � faire une comparaison et l�it�ration de la bouclefor en ��s� ce qui est tout � fait possible sur une machine plut)t rapide actuellement�On �crira que le tri par s�lection est en O�N��� Son temps est quadratique par rapportaux nombres d��l�ments du tableau�

Une variante du tri par s�lection est le tri bulle� Son principe est de parcourir la suiteha�� a�� � � � � aN i en intervertissant toute paire d��l�ments cons�cutifs �aj��� aj� non or�donn�s� Ainsi apr�s un parcours� l��l�ment maximum se retrouve en aN � On recommenceavec le pr��xe ha�� a�� � � � � aN��i� � � � Le nom de tri bulle vient donc de ce que les plusgrands nombres se d�placent vers la droite en poussant des bulles successives de lagauche vers la droite� L�exemple num�rique pr�c�dent est donn� avec le tri bulle dansla �gure ����

La proc�dure correspondante utilise un indice i qui marque la �n du pr��xe � trier�et l�indice j qui permet de d�placer la bulle qui monte vers la borne i� On peut compteraussi tr�s facilement le nombre d�op�rations et se rendre compte qu�il s�agit d�un tri enO�N�� comparaisons et �ventuellement �changes !si par exemple le tableau est donn�en ordre strictement d�croissant"�

static void triBulle��

int t�

for �int i � N��� i � � ��i�

for �int j � �� j �� i� ��j�

if �a#j��$ a#j$�

t � a#j��$� a#j��$ � a#j$� a#j$ � t�

����� Analyse en moyenne

Pour analyser un algorithme de tri� c�est � dire d�terminer le nombre moyen d�op��rations qu�il e�ectue� on utilise le mod�le des permutations� On suppose dans ce mod�leque la suite des nombres � trier est la suite des entiers �� �� � � � n et l�on admet quetoutes les permutations de ces entiers sont �quiprobables� On peut noter que le nombrede comparaisons � e�ectuer pour un tri ne d�pend pas des �l�ments � trier mais del�ordre dans lequel ils apparaissent� Les supposer tous compris entre � et N n�est donc

Page 27: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� LE TRI �

� � �� �� � � �� �� ��

ij

� � �� �� � � �� �� ��

ij

� �� � �� � � �� �� ��

ij

� �� � � �� � �� �� ��

ij

� �� � � � �� �� �� ��

ij

� �� � � � �� �� �� ��

ij

� �� � � � �� �� �� ��

ij

� �� � � � �� �� �� ��

j i

� �� � � � �� �� �� ��

ij

� �� � � �� �� � �� ��

ij

� � � �� �� �� � �� ��

ij

� � � �� �� �� � �� ��

ij

� � � �� �� �� � �� ��

ij

� � � �� �� �� � �� ��

ij

� � � �� �� �� � �� ��

ij

� � � �� �� �� � �� ��

j i

� � � �� �� �� � �� ��

Fig� ��� � Exemple de tri bulle

Page 28: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� TABLEAUX

pas une hypoth�se restrictive si on ne s�int�resse qu�� l�analyse et si l�on se place dansun mod�le d�algorithme dont l�op�ration de base est la comparaison�

Pour une permutation de f�� � � � � ng dans lui�m�me� une inversion est un couple�ai� aj� tel que i � j et ai � aj � Ainsi� la permutation

h�� �� �� ��� �� �� �� �� � iqui correspond � l�ordre des �l�ments de la �gure ���� comporte �� inversions� Chaque�change d��l�ments de la proc�dure TriBulle supprime une et une seule inversion et�une fois le tri termin�� il n�y a plus aucune inversion� Ainsi le nombre total d��changese�ectu�s est �gal au nombre d�inversions dans la permutation� Calculer le nombre moyend��changes dans la proc�dure de tri bulle revient donc � compter le nombre moyend�inversions de l�ensemble des permutations sur N �l�ments� Un moyen de faire ce calculconsiste � compter le nombre d�inversions dans chaque permutation � faire la somme detous ces nombres et � diviser par N �� Ceci est plut)t fastidieux� une remarque simplepermet d�aller plus vite�

L�image miroir de toute permutation � ha�� a� � � � aN i est la permutation �haN � � � � � a�� a�i� Il est clair que �ai� aj� est une inversion de si et seulement si ce n�estpas une inversion de � La somme du nombre d�inversions de et de celles de estN�N � ����� On regroupe alors deux par deux les termes de la somme des nombresd�inversions des permutations sur N �l�ments et on obtient que le nombre moyen d�in�versions sur l�ensemble des permutations est donn� par�

N�N � ��

ce qui est donc le nombre moyen d��changes dans la proc�dure TriBulle� On notetoutefois que le nombre de comparaisons e�ectu�es par TriBulle est le m�me que celuide TriSelection soit N�N � �����

����� Le tri par insertion

Une m�thode compl�tement di��rente est le tri par insertion� C�est la m�thodeutilis�e pour trier un paquet de cartes� On prend une carte� puis � et on les met dansl�ordre si n�cessaire� puis � et on met la �me carte � sa place dans les � premi�res� � � �De mani�re g�n�rale on suppose les i�� premi�res cartes tri�es� On prend la i�me carte�et on essaie de la mettre � sa place dans les i � � cartes d�j� tri�es� Et on continuejusqu�� i � N � Ceci donne le programme suivant

static void triInsertion��

int j� v�

for �int i � �� i � N� ��i�

v � a#i$� j � i�

while �j %% a#j��$ v�

a#j$ � a#j��$�

��j�

a#j$ � v�

Pour classer le i�me �l�ment du tableau a� on regarde successivement en marche arri�re� partir du i � �i�me� On d�cale les �l�ments visit�s vers la droite pour pouvoir mettrea�i� � sa juste place� Le programme pr�c�dent contient une l�g�re erreur� si a�i� estle plus petit �l�ment du tableau� car on va sortir du tableau par la gauche� On peut

Page 29: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� LE TRI ��

� � �� �� � � �� �� ��

ij

� � �� �� � � �� �� ��

ij

� �� � �� � � �� �� ��

i j

� �� � �� � � �� �� ��

ij

� � �� � �� � �� �� ��

ij

� � � �� � �� �� �� ��

ij

� � � �� �� � �� �� ��

ij

� � � �� �� �� � �� ��

ij

� � � �� �� �� � �� ��

ij

� � � �� �� �� � �� ��

Fig� ��� � Exemple de tri par insertion

Page 30: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� TABLEAUX

toujours y rem�dier en supposant qu�on rajoute un �l�ment a��� valant �maxint� Ondit alors que l�on a mis une sentinelle � gauche du tableau a� Ceci n�est pas toujourspossible� et il faudra alors rajouter un test sur l�indice j dans la boucle while� Ainsi�pour le tri par insertion� l�exemple num�rique pr�c�dent est dans la �gure ����

Le nombre de comparaisons pour ins�rer un �l�ment dans la suite tri�e de ceux quile pr�c�dent est �gal au nombre d�inversions qu�il pr�sente avec ceux�ci augment� d�uneunit�� Soit ci ce nombre de comparaisons� On a

ci � � � cardfaj j aj � ai� j � igPour la permutation correspondant � la suite � trier� dont le nombre d�inversions estinv��� le nombre total de comparaisons pour le tri par insertion est

C� �NXi��

ci � N � � � inv��

D�o$ le nombre moyen de comparaisons

CN ��

N �

X�

C� � N � � �N�N � ��

��

N�N � �

�� �

Bien que l�ordre de grandeur soit toujours N�� ce tri est plus e%cace que le tri pars�lection� De plus� il a la bonne propri�t� que le nombre d�op�rations d�pend fortementde l�ordre initial du tableau� Dans le cas o$ le tableau est presque en ordre� il y a peud�inversions et tr�s peu d�op�rations sont n�cessaires� contrairement aux deux m�thodesde tri pr�c�dentes� Le tri par insertion est donc un bon tri si le tableau � trier a de bonneschances d��tre presque ordonn��

Une variante du tri par insertion est un tri d# � D� L� Shell en ����� c�est une m�thodede tri que l�on peut sauter en premi�re lecture� Son principe est d��viter d�avoir � fairede longues cha�nes de d�placements si l��l�ment � ins�rer est tr�s petit� Nous laissonsle lecteur fanatique en comprendre le sens� et le mentionnons � titre anecdotique� Aulieu de comparer les �l�ments adjacents pour l�insertion� on les compare tous les � � � ������ ��� ���� ��� ��� �� et � �l�ments� !On utilise la suite un�� � un ��"� Quand on�nit par comparer des �l�ments cons�cutifs� ils ont de bonnes chances d��tre d�j� dansl�ordre� On peut montrer que le tri Shell ne fait pas plus que O�N���� comparaisons�et se comporte donc bien sur des �chiers de taille raisonnable !���� �l�ments"� Lad�monstration est compliqu�e� et nous la laissons en exercice di%cile� On peut prendretout autre g�n�rateur que � pour g�n�rer les s�quences � explorer� Pratt a montr� quepour des s�quences de la forme �pq� le co#t est O�n log� n� dans le pire cas !mais il estco#teux de mettre cette s�quence des �pq dans l�ordre"� Dans le cas g�n�ral� le co#t!dans le cas le pire" du tri Shell est toujours un probl�me ouvert� Le tri Shell est tr�sfacile � programmer et tr�s e%cace en pratique !c�est le tri utilis� dans le noyau Maple"�

static void triShell��

int h � �� do

h � ��h � ��

while � h �� N ��

do

h � h � ��

for �int i � h� i � N� ��i�

if �a#i$ � a#i�h$�

int v � a#i$� j � i�

do

Page 31: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� RECHERCHE EN TABLE ��

nom tel

paul ���roger ����laure � ��anne � ��pierre ���yves ��

Fig� ��� � Un exemple de table pour la recherche en table

a#j$ � a#j�h$�

j � j � h�

� while �j � h %% a#j�h$ v��

a#j$ � v�

� while � h ���

��� Recherche en table

Avec les tableaux� on peut aussi faire des tables� Une table contient des informationssur certaines cl�s� Par exemple� la table peut �tre un annuaire t�l�phonique� Les cl�s sontles noms des abonn�s� L�information � rechercher est le num�ro de t�l�phone� Une tableest donc un ensemble de paires hnom� num�roi� Il y a plusieurs mani�res d�organisercette table� un tableau d�enregistrement� une liste ou un arbre !comme nous le verronsplus tard"� Pour l�instant� nous supposons la table d�crite par deux tableaux nom et tel�indic�s en parall�le� le num�ro de t�l�phone de nom�i� �tant tel�i��

����� La recherche s�quentielle

La premi�re m�thode pour rechercher un num�ro de t�l�phone consiste � faire unerecherche s�quentielle !ou lin�aire"� On examine successivement tous les �l�ments de latable et on regarde si on trouve un abonn� du nom voulu� Ainsi

static int recherche �String x�

for �int i � � i � N� ��i�

if �x�equals�nom#i$��

return tel#i$�

return ���

qui peut aussi s��crire

static int recherche �String x�

int i � �

while �i � N %% &x�equals�nom#i$��

��i�

if �i � N�

return tel#i$�

else

Page 32: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� TABLEAUX

return ���

Si on a la place� une autre possibilit� est de mettre une sentinelle au bout de la table�

static int recherche �String x�

int i � �

nom#N$ � x� tel#N$ � ���

while �& x�equals�nom#i$��

��i�

return tel#i$�

L��criture de la proc�dure de recherche dans la table des noms est alors plus e%cace� caron peut remarquer que l�on ne fait plus qu�un test l� o$ on en faisait deux� La recherches�quentielle est aussi appel�e recherche lin�aire� car il est facile de montrer que l�on faitN�� op�rations en moyenne� et N op�rations dans le pire cas� Sur une table de ������l�ments� la recherche prend ���� op�rations en moyenne� soit �ms�

Voici un programme complet utilisant la recherche lin�aire en table�

class Table

final static int N � ��

static String nom#$ � new String#N��$�

static int tel#$ � new int#N��$�

static void initialisation��

nom#$ � �paul�� tel#$ � �����

nom#�$ � �roger�� tel#�$ � �!��

nom#�$ � �laure�� tel#�$ � �"��

nom#�$ � �anne�� tel#�$ � �"��

nom#�$ � �pierre�� tel#�$ � ��!�

nom#!$ � �yves�� tel#!$ � ����

static int recherche �String x�

for �int i � � i � N� ��i�

if �x�equals�nom#i$��

return tel#i$�

return ���

public static void main �String args#$�

Initialisation���

if �args�length �� ��

System�out�println �Recherche�args#$���

����� La recherche dichotomique

Une autre technique de recherche en table est la recherche dichotomique� Supposonsque la table des noms soit tri�e en ordre alphab�tique !comme l�annuaire des PTT"� Aulieu de rechercher s�quentiellement� on compare la cl� � chercher au nom qui se trouveau milieu de la table des noms� Si c�est le m�me� on retourne le num�ro de t�l�phone du

Page 33: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� RECHERCHE EN TABLE ��

milieu� sinon on recommence sur la premi�re moiti� !ou la deuxi�me" si le nom recherch�est plus petit !ou plus grand" que le nom rang� au milieu de la table� Ainsi

static void initialisation��

nom#$ � �anne�� tel#$ � �"��

nom#�$ � �laure�� tel#�$ � �"��

nom#�$ � �paul�� tel#�$ � �����

nom#�$ � �pierre�� tel#�$ � ��!�

nom#�$ � �roger�� tel#�$ � �!��

nom#!$ � �yves�� tel#!$ � ����

static int rechercheDichotomique �String x�

int i� g� d� cmp�

g � � d � N���

do

i � �g � d� � ��

cmp � x�compareTo�nom#i$��

if �cmp �� �

return tel#i$�

if �cmp � �

d � i � ��

else

g � i � ��

� while �g �� d��

return ���

Le nombre CN de comparaisons pour une table de taille N est tel que CN � � �CbN��c et C� � �� Donc CN � log��N�� !Dor�navant� log��N� sera simplement �critlogN �" Si la table a ����� �l�ments� on aura CN � ��� C�est donc un gain sensible parrapport aux ���� op�rations n�cessaires pour la recherche lin�aire� Bien s#r� la recherchelin�aire est plus simple � programmer� et sera donc utilis�e pour les petites tables� Pourdes tables plus importantes� la recherche dichotomique est plus int�ressante�

On peut montrer qu�un temps sub�logarithmique est possible si on conna�t la distri�bution des objets� Par exemple� dans l�annuaire du t�l�phone� ou dans un dictionnaire�on sait a priori qu�un nom commen�ant par la lettre V se trouvera plut)t vers la �n� Ensupposant la distribution uniforme� on peut faire une r�gle de trois pour trouver l�indicede l��l�ment de r�f�rence pour la comparaison� au lieu de choisir le milieu� et on suit lereste de l�algorithme de la recherche dichotomique� Cette m�thode est la recherche parinterpolation� Alors le temps de recherche est en O�log logN�� c�est���dire � op�rationspour une table de ����� �l�ments� et � op�rations jusqu�� ��� entr�es dans la table'

����� Insertion dans une table

Dans la recherche lin�aire ou par dichotomie� on ne s�est pas pr�occup� de l�insertiondans la table d��l�ments nouveaux� C�est par exemple tr�s peu souvent le cas pour unannuaire t�l�phonique� Mais cela peut �tre fr�quent dans d�autres utilisations� commela table des usagers d�un syst�me informatique� Essayons de voir comment organiserl�insertion d��l�ments nouveaux dans une table� dans le cas des recherches s�quentielleet dichotomique�

Page 34: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� TABLEAUX

Pour le cas s�quentiel� il su%t de rajouter au bout de la table l��l�ment nouveau�s�il y a la place� S�il n�y a pas de place� on appelle une proc�dure erreur qui imprimerale message d�erreur donn� en param�tre et arr�tera le programme !cf� page ���"� Ainsi

void insertion �String x� int val�

��n�

if �n � N� then

erreur ��De'bordement de la table���

nom#n$ � x�

tel#n$ � val�

L�insertion se fait donc en temps constant� en O���� Dans le cas de la recherche pardichotomie� il faut maintenir la table ordonn�e� Pour ins�rer un nouvel �l�ment dansla table� il faut d�abord trouver son emplacement par une recherche dichotomique !ous�quentielle"� puis pousser tous les �l�ments derri�re lui pour pouvoir ins�rer le nouvel�l�ment au bon endroit� Cela peut donc prendre log n� n op�rations� L�insertion dansune table ordonn�e de n �l�ments prend donc un temps O�n��

����� Hachage

Une autre m�thode de recherche en table est le hachage� On utilise une fonction h del�ensemble des cl�s !souvent des cha�nes de caract�res" dans un intervalle d�entiers� Pourune cl� x� h�x� est l�endroit o$ l�on trouve x dans la table� Tout se passe parfaitementbien si h est une application injective� Pratiquement� on ne peut arriver � atteindre cer�sultat� On tente alors de s�en approcher et on cherche aussi � minimiser le temps decalcul de h�x�� Ainsi un exemple de fonction de hachage est

h�x� � �x ���Bl�� � x ���Bl�� � � � �� x l�� mod N

On prend d�habitude B � ��� ou B � ��� et on suppose que la taille de la table Nest un nombre premier� Pourquoi- D�abord� il faut conna�tre la structure des ordinateurspour comprendre le choix de B comme une puissance de �� En e�et� les multiplicationspar des puissances de � peuvent se faire tr�s facilement par des d�calages� puisque lesnombres sont repr�sent�s en base �� En g�n�ral� dans les machines �modernes � cetteop�ration est nettement plus rapide que la multiplication par un nombre arbitraire�Quant � prendre N premier� c�est pour �viter toute interf�rence entre les multiplicationspar B et la division par N � En e�et� si par exemple B � N � ���� alors h�x� � x l� etla fonction h ne d�pendrait que du dernier caract�re de x� Le but est donc d�avoir unefonction h de hachage simple � calculer et ayant une bonne distribution sur l�intervalle �� N���� !Attention� il sera techniquement plus simple dans cette section sur le hachagede supposer que les indices des tableaux varient sur �� N��� au lieu de �� N �"� Le calculde la fonction h se fait par la fonction h�x l� o$ l est la longueur de la cha�ne x�

static int h �String x�

int r � �

for �int i � � i � x�length��� ��i�

r � ��r � B� � x�charAt�i�� � N�

return r�

Donc la fonction h donne pour toute cl� x une entr�e possible dans la table� Onpeut alors v�ri�er si x � nom h�x��� Si oui� la recherche est termin�e� Si non� cela signi�eque la table contient une autre cl� x� telle que h�x�� � h�x�� On dit alors qu�il y a unecollision� et la table doit pouvoir g�rer les collisions� Une m�thode simple est de lister

Page 35: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� RECHERCHE EN TABLE ��

paul

roger

laure

anne

pierre

yves

laurent

i

������ �����������

nom�i�

pierre

paul

rogerlaure

anneyves

laurent

tel�i�

�����

����

����� ��

���

� ������

col�i�

�������������������������� collisions

Fig� ��� � Hachage par collisions s�par�es

les collisions dans une table col parall�le � la table nom� La table des collisions donneraune autre entr�e i dans la table des noms o$ peut se trouver la cl� recherch�e� Si on netrouve pas la valeur x � cette nouvelle entr�e i� on continuera avec l�entr�e i� donn�epar i� � col i�� Et on continue tant que col i� � ��� La recherche est donn�e par

static int recherche �String x�

for �int i � h�x�� i &� ��� i � col#i$�

if �x�equals�nom#i$��

return tel#i$�

return ���

Ainsi la proc�dure de recherche prend un temps au plus �gal � la longueur moyenne desclasses d��quivalence d��nies sur la table par la valeur de h�x�� c�est���dire � la longueurmoyenne des listes de collisions� Si la fonction de hachage est parfaitement uniforme� iln�y aura pas de collision et on atteindra tout �l�ment en une comparaison� Ce cas est tr�speu probable� Il y a des algorithmes compliqu�s pour trouver une fonction de hachageparfaite sur une table donn�e et �xe� Mais si le nombre moyen d��l�ments ayant m�mevaleur de hachage est k � N�M � o$ M est grosso modo le nombre de classes d��qui�valences d��nies par h� la recherche prendra un temps N�M � Le hachage ne fait doncque r�duire d�un facteur constant le temps pris par la recherche s�quentielle� L�int�r�t

Page 36: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� TABLEAUX

du hachage est qu�il est souvent tr�s e%cace� tout en �tant simple � programmer�L�insertion dans une table avec le hachage pr�c�dent est plus d�licate� En e�et� on

devrait rapidement fusionner des classes d��quivalences de la fonction de hachage� car ilfaut bien mettre les objets � ins�rer � une certaine entr�e dans la table qui correspondelle�m�me � une valeur possible de la fonction de hachage� Une solution simple est desupposer la table de taille n telle que N � n � Nmax� Pour ins�rer un nouvel �l�ment� onregarde si l�entr�e calcul�e par la fonction h est libre� sinon on met le nouvel �l�ment aubout de la table� et on cha�ne les collisions entre elles par un nouveau tableau col� !Lestableaux nom� tel et col sont maintenant de taille Nmax"� On peut choisir de mettrele nouvel �l�ment en t�te ou � la �n de la liste des collisions� ici on le mettra en t�te�Remarque� � la page � tous les outils seront d�velopp�s pour encha�ner les collisions pardes listes� comme nous ne connaissons actuellement que les tableaux comme structurede donn�e� nous utilisons le tableau col� L�insertion d�un nouvel �l�ment dans la tables��crit

static void insertion �String x� int val�

int i � h�x��

if �nom#i$ �� null�

nom#i$ � x�

tel#i$ � val�

� else

if �n � Nmax�

erreur ��D(bordement de la table���

else

nom#n$ � x�

tel#n$ � val�

col#n$ � col#i$� �� On met la nouvelle entre en t�tecol#i$ � n� �� de la liste des collisions de sa��n� �� classe dquivalence�

Au d�but� on suppose n � N� nom i� � �� !cha�ne vide" et col i� � �� pour � � i � N �La proc�dure d�insertion est donc tr�s rapide et prend un temps constant O����

Une autre technique de hachage est de faire un hachage � adressage ouvert� Leprincipe en est tr�s simple� Au lieu de g�rer des collisions� si on voit une entr�e occup�elors de l�insertion� on range la cl� � l�entr�e suivante !modulo la taille de la table"� Onsuppose une valeur interdite dans les cl�s� par exemple la cha�ne vide ��� pour d�signerune entr�e libre dans la table� Les proc�dures d�insertion et de recherche s��crivent tr�ssimplement comme suit

static int recherche �String x�

int i � h�x��

while �nom#i$ &� null�

if �x�equals�nom#i$��

return tel#i$�

i � �i��� � N�

return ���

static void insertion �String x� int val�

int i�

Page 37: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� RECHERCHE EN TABLE �

paul

roger

laure

anne

pierre

yvon

laurent

i

������ �����������

nom�i�

pierre

paul

rogerlaureanne

laurent

yvon

tel�i�

�����

����

����� ��� ����

���

��

Fig� �� � Hachage par adressage ouvert

Page 38: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� TABLEAUX

if �n � N�

erreur ��De'bordement de la table���

��n�

i � h�x��

while ��nom#i$ &� null� %% & x�equals�nom#i$��

i � �i��� � N�

nom#i$ � x�

tel#i$ � val�

Dans le cas o$ la cl� � ins�rer se trouverait d�j� dans la table� l�ancien num�ro det�l�phone est �cras�� ce qui est ce que l�on veut dans le cas pr�sent� Il est int�ressant dereprendre les m�thodes de recherche en table d�j� vues et de se poser ce probl�me� Plusint�ressant� on peut se demander si cette m�thode simple de hachage lin�aire est tr�se%cace� et si on ne risque pas� en fait� d�aboutir � une recherche s�quentielle standard�Notre probl�me est donc de comprendre la contigu.t� de la fonction de hachage� et lachance que l�on peut avoir pour une valeur donn�e de h�x� d�avoir aussi les entr�esh�x� � �� h�x� � �� h�x� � � � � occup�es� On peut d�montrer que� si la fonction dehachage est uniforme et si � n�Nmax est le taux d�occupation de la table� le nombred�op�rations est�

� ��� � ������ � �� pour une recherche avec succ�s�

� ��� � ������ � ��� pour une recherche avec �chec�

Donc si � ��� on fait � ou � op�rations� si � ��� on en fait � ou ��� La conclusionest donc que� si on est pr�t � grossir la table de ���� le temps de recherche est tr�s bon�avec une m�thode de programmation tr�s simple�

Une m�thode plus subtile� que l�on peut ignorer en premi�re lecture� est d�optimiserle hachage � adressage ouvert pr�c�dent en introduisant un deuxi�me niveau de hachage�Ainsi au lieu de consid�rer l��l�ment suivant dans les proc�dures de recherche et d�inser�tion� on changera les instructions

i �� �i��� mod Nmax�

en

i �� �i�u� mod Nmax�

o$ u � h��x� l� est une deuxi�me fonction de hachage� Pour �viter des ph�nom�nes dep�riodicit�� il vaut mieux prendre u et Nmax premiers entre eux� Une m�thode simple�comme Nmax est d�j� suppos� premier� est de faire u � Nmax� Par exemple� h��x� l� ��� �x l� mod �� est une fonction rapide � calculer� et qui tient compte des trois derniersbits de x� On peut se mettre toujours dans le cas de distributions uniformes� et defonctions h et h� �ind�pendantes � Alors on montre que le nombre d�op�rations est enmoyenne�

� ���� � log����� � �� pour une recherche avec succ�s�

� ���� � � pour une recherche avec �chec�

en fonction du taux d�occupation de la table� Num�riquement� pour � ���� on fait� ou � op�rations� pour � �� on fait ou ���� Ce qui est tout � fait raisonnable�

Le hachage est tr�s utilis� pour les correcteurs d�orthographe� McIlroy � a calcul�que� dans un article scienti�que typique� il y a environ �� erreurs d�orthographe !c�est���dire des mots n�apparaissant pas dans un dictionnaire"� et qu�une collision pour ���

�� Doug McIlroy �tait le chef de l��quipe qui a fait le syst�me Unix � Bell laboratories�

Page 39: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� PROGRAMMES EN CAML ��

papiers est acceptable� Il su%t donc de faire un correcteur probabiliste qui ne risque dese tromper qu�un cas sur ����� Au lieu de garder tout le dictionnaire en m�moire� et doncconsommer beaucoup de place� il a utilis� un tableau de n bits� Il calcule k fonctions hide hachage ind�pendantes pour tout mot w� et regarde si les k bits positionn�s en hi�w�valent simultan�ment �� On est alors s#r qu�un mot n�est pas dans le dictionnaire si lar�ponse est n�gative� mais on pense qu�on a de bonnes chances qu�il y soit si la r�ponseest oui� Un calcul simple montre que la probabilit� P pour qu�un mot d�un dictionnairede d entr�es ne positionne pas un bit donn� est P � e�dk�n� La probabilit� pour qu�unecha�ne quelconque soit reconnue comme un mot du dictionnaire est ���P �k� Si on veutque cette derni�re vaille ������� il su%t de prendre P � ��� et k � ��� On a alorsn�d � k� ln � � ��� ��� Pour un dictionnaire de ����� mots� il faut donc ������ bits !��kO"� et� pour un de ������ mots� if faut ������� bits !��� kO"� McIlroy avait un pdp��et �� kO �tait insupportable� Il a compress� la table en ne stockant que les nombres de� entre deux �� ce qui a ramen� la taille � �� kO� Actuellement� la commande spell dusyst�me Unix utilise k � �� et une table de ������ bits� �

��� Programmes en Caml

�� Tri par slection� page � ��

�open �printf���

let nMax � ���

let a � make�vect nMax ��

let initialisation �� �

for i � to nMax � � do

a��i� �� random��int �

done��

let impression �� �

for i � to nMax � � do

printf ���d � a��i�

done�

printf ��n���

let tri�s(lection �� �

let min � ref in

for i � to nMax � � do

min �� i�

for j � i � � to nMax � � do

if a��j� � a��&min� then min �� j

done�

let t � a��&min� in

a��&min� �� a��i�� a��i� �� t

done��

let main �� �

�� On initialise le tableau ��

initialisation ���

�� Paul Zimmermann a remarqu� que les dictionnaires fran�ais sont plus longs que les dictionnairesanglais � cause des conjugaisons des verbes� Il a reprogramm� la commande spell en fran�ais enutilisant des arbres digitaux qui partagent les pr�xes et suxes des mots d�un dictionnaire fran�ais de������ mots Le dictionnaire tient alors dans une m�moire de ��� kO� Son algorithme est aussi rapideet exact non probabiliste��

Page 40: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� TABLEAUX

�� On trie ��

tri�s(lection� ���

�� On imprime le rsultat ��

impression ���

exit ��

�� Style plus Caml ��

let initialisation a �

for i � to vect�length a � � do

a��i� �� random��int �

done��

let impression a �

for i � to vect�length a � � do

print�int a��i�� print�string � ��

done�

print�newline����

let main �� �

let a � make�vect nMax in

initialisation �a��

tri�s(lection �a��

impression �a��

exit ��

�� Tri bulle� voir page �� ��

let tri�bulle a �

let j � ref in

let v � ref in

for i � vect�length a � � downto do

for j � � to i do

if a��j��� a��j� then let t � ref a��j��� in begin

a��j��� �� a��j�� a��j� �� &t

end

done

done��

�� Tri par insertion� voir page �� ��

let tri�insertion a �

let j � ref in

let v � ref in

for i � � to vect�length a � � do

v �� a��i�� j �� i�

while &j %% a��&j � �� &v do

a��&j� �� a��&j � ���

decr j

done�

a��&j� �� &v�

done��

Page 41: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� PROGRAMMES EN CAML ��

�� Tri Shell� voir page �� ��

let tri�shell a �

let h � ref � in

while &h �� vect�length a � � do

h �� � � &h � �

done�

while &h � do

h �� &h � ��

for i � &h to vect�length a � � do

if a��i� � a��i � &h� then begin

let v � a��i� in

let j � ref i in

while &j � &h %% a��&j � &h� v do

a��&j� �� a��&j � &h��

j �� &j � &h

done�

a��&j� �� v

end

done

done��

�� Recherche �� voir page �� ��

exception Found of int��

let recherche s bottin �

try

for i � to vect�length bottin � � do

let nom� tel � bottin��i� in

if nom � s then raise �Found tel�

done�

raise Not�found

with Found tel � tel��

�� Recherche �� voir page �� ��

let recherche s bottin �

nom��vect�length nom � �� �� �s� ��

let i � ref in

while fst �bottin��&i�� � s do

incr i

done�

if &i � vect�length bottin

then raise Not�found

else

let �� tel � bottin��&i� in tel��

exception Found of int��

let bottin �

#� �paul�� �����

�roger�� �!��

�laure�� �"��

Page 42: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� TABLEAUX

�anne�� �"��

�pierre�� ��!�

�yves�� ���

�$��

�� Encore une autre mani�re dcrire la fonction recherche

let recherche s bottin � begin

try

do�vect

�function nom� tel �

if nom � s then raise �Found tel��

bottin�

raise Not�found

with Found t � t

end��

�� Lecture des donnes ��

while true do

printf ��d�n�

�recherche �input�line stdin� bottin�

done��

�� Recherche dichotomique� voir page �� ��

let nom �

#� �anne�� �laure�� �paul��

�pierre�� �roger�� �yves� �$��

let tel �

#� �"�� �"�� �����

��!� �!�� ��� �$��

let recherche�dichotomique x �

let g � ref

and d � ref �vect�length nom � ��

and i � ref in

while x � nom��&i� %% &g �� &d do

i �� �&g � &d� � ��

if x � nom��&i� then d �� &i � �

else g �� &i � ��

done�

if x � nom��&i� then tel��&i� else ������

�� Insertion �� voir page � ��

let n � ref ��

let insertion x val �

if &n � vect�length nom

then failwith �D(bordement de la table��

nom��n� �� x�

tel��n� �� val�

incr n��

�� Fonction de hachage� voir page � ��

Page 43: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� PROGRAMMES EN CAML ��

let N � vect�length nom � �

and B � �����

let h s �

let result � ref in

for i � to string�length s � � do

result ��

�&result � B � �int�of�char �s�#i$��� mod N

done�

&result��

�� Recherche avec hachage� voir page �� ��

let col � make�vect �vect�length nom� ������

let recherche x �

let i � ref �h x� in

while nom��&i� � x %%

col��&i� � ��

do i �� col��&i� done�

if x � nom��&i� then tel��&i� else ����

�� Insertion avec hachage� voir page � ��

let nom � make�vect nMax ����

let tel � make�vect nMax ��

let col � make�vect nMax ������

let n � ref ��

let insertion x val �

let i � h x in

if nom��i� � �� then begin

nom��i� �� x�

tel��i� �� val

end else begin

if &n � nMax

then failwith �D(bordement de la table�

else begin

nom��&n� �� x�

tel��&n� �� val�

col��&n� �� col��i�� �� On met la nouvelle entre en t�te ��

col��i� �� &n� �� de la liste des collisions ��

incr n �� de sa classe dquivalence ��

end�

end��

�� Hachage avec adressage ouvert� voir page �� ��

let recherche x �

let i � ref �h x� in

while nom��&i� � x %% nom��&i� � �� do

i �� �&i � �� mod N

done�

if nom��&i� � x then tel��&i� else ����

Page 44: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� TABLEAUX

let insertion x val �

if &n N

then failwith �D(bordement de la table��

incr n�

let i � ref �h x� in

while nom��&i� � x %% nom��&i� � �� do

i �� �&i � �� mod N

done�

nom��&i� �� x�

tel��&i� �� val��

Page 45: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��

Chapitre �

R�cursivit�

Les d��nitions par r�currence sont assez courantes en math�matiques� Prenons lecas de la suite de Fibonacci� d��nie par

u� � u� � �un � un�� � un�� pour n � �

On obtient donc la suite �� �� �� �� �� � ��� ��� ��� ��� �� ���� ���� � � ��� � ���� � ���� ���� �� ������ � � Nous allons voir que ces d��nitions s�impl�mententtr�s simplement en informatique par les d��nitions r�cursives�

��� Fonctions r�cursives

����� Fonctions num�riques

Pour calculer la suite de Fibonacci� une transcription litt�rale de la formule est lasuivante�

static int fib �int n�

if �n �� ��

return ��

else

return fib �n��� � fib �n����

fib est une fonction qui utilise son propre nom dans la d��nition d�elle�m�me� Ainsi�si l�argument n est plus petit que �� on retourne comme valeur �� Sinon� le r�sultat estfib�n � �� � fib�n � ��� Il est donc possible en Java� comme en beaucoup d�autreslangages !sauf Fortran"� de d��nir de telles fonctions r�cursives� D�ailleurs� toute suitehuni d��nie par r�currence s��crit de cette mani�re en Java� comme le con�rment lesexemples num�riques suivants� factorielle et le triangle de Pascal�

static int fact�int n�

if �n �� ��

return ��

else

return n � fact �n����

static int C�int n� int p�

if ��n �� � �� �p �� n��

Page 46: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� R�CURSIVIT�

Fib���

Fib��

Fib���

Fib��� Fib���

Fib���

Fib���

Fib��� Fib���

Fig� ��� � Appels r�cursifs pour fib���

return ��

else

return C�n��� p��� � C�n��� p��

On peut se demander comment Java s�y prend pour faire le calcul des fonctions r�cursi�ves� Nous allons essayer de le suivre sur le calcul de fib���� Rappelons nous que lesarguments sont transmis par valeur dans le cas pr�sent� et donc qu�un appel de fonctionconsiste � �valuer l�argument� puis � se lancer dans l�ex�cution de la fonction avec lavaleur de l�argument� Donc

fib��� � fib ��� � fib ���

� �fib ��� � fib ���� � fib ���

� ��fib ��� � fib ���� � fib ���� � fib���

� ��� � fib���� � fib ���� � fib���

� ��� � �� � fib ���� � fib���

� �� � fib���� � fib���

� �� � �� � fib���

� � � fib���

� � � �fib ��� � fib ����

� � � �� � fib����

� � � �� � ��

� � � �

� !

Il y a donc un bon nombre d�appels successifs � la fonction fib !� pour fib���"� Comp�tons le nombre d�appels r�cursifs Rn pour cette fonction� Clairement R� � R� � ��et Rn � � � Rn�� � Rn�� pour n � �� En posant R�

n � Rn � �� on en d�duit queR�n � R�

n���R�n�� pour n � �� R�

� � R�� � �� D�o$ R�

n � ��fib�n�� et donc le nombred�appels r�cursifs Rn vaut � � fib�n�� �� c�est � dire �� �� �� �� �� ��� ��� ��� � ����� � � � ��� ��� ����� �� �� ����� �� � ��� ������ ������ � � Le nombre d�appelsr�cursifs est donc tr�s �lev�� d�autant plus qu�il existe une m�thode it�rative simple encalculant simultan�ment fib�n� et fib�n� ��� En e�et� on a un calcul lin�aire simple�

fib�n�fib�n� ��

��

�� �� �

��fib�n� ��fib�n� ��

Ce qui donne le programme it�ratif suivant

Page 47: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� FONCTIONS R�CURSIVES �

static int fib�int n�

int u� v�

int u� v�

int i�

u � �� v � ��

for �i � �� i �� n� ��i�

u � u� v � v�

u � u � v�

v � v�

return u�

Pour r�sumer� une bonne r�gle est de ne pas trop essayer de suivre dans les moindresd�tails les appels r�cursifs pour comprendre le sens d�une fonction r�cursive� Il vautmieux en g�n�ral comprendre synth�tiquement la fonction� La fonction de Fibonacci estun cas particulier car son calcul r�cursif est particuli�rement long� Mais ce n�est pas lecas en g�n�ral� Non seulement� l��criture r�cursive peut se r�v�ler e%cace� mais elle esttoujours plus naturelle et donc plus esth�tique� Elle ne fait que suivre les d��nitionsmath�matiques par r�currence� C�est une m�thode de programmation tr�s puissante�

����� La fonction dAckermann

La suite de Fibonacci avait une croissance exponentielle� Il existe des fonctions r��cursives qui croissent encore plus rapidement� Le prototype est la fonction d�Ackermann�Au lieu de d��nir cette fonction math�matiquement� il est aussi simple d�en donner lad��nition r�cursive en Java

static int ack�int m� int n�

if �m �� �

return n � ��

else

if �n �� �

return ack �m � �� ���

else

return ack �m � �� ack �m� n � ����

On peut v�ri�er que

ack��� n� � n� �ack��� n� � n� �ack��� n� � � nack�� n� � �n

ack��� n� � �������n

Donc ack��� �� � ack��� �� � ������ � ���� c�est � dire le nombre d�atomes de l�univers�

Page 48: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� R�CURSIVIT�

����� R�cursion imbriqu�e

La fonction d�Ackermann contient deux appels r�cursifs imbriqu�s� c�est ce qui lafait cro�tre si rapidement� Un autre exemple est la fonction �� de MacCarthy

static int f�int n�

if �n ��

return n � ��

else

return f�f�n������

Ainsi� le calcul de f��� donne f��� � f�f������ � f��� � � � � f����� � f�f������ �f����� � �� On peut montrer que cette fonction vaut �� si n � ��� et n � �� sin � ���� Cette fonction anecdotique� qui utilise la r�cursivit� imbriqu�e� est int�ressantecar il n�est pas du tout �vident qu�une telle d��nition donne toujours un r�sultat� � Parexemple� la fonction de Morris suivante

static int g�int m� int n�

if �m �� �

return ��

else

return g�m � �� g�m� n���

Que vaut alors g��� ��- En e�et� on a g��� �� � g��� g��� ���� Il faut se souvenir queJava passe les arguments des fonctions par valeur� On calcule donc toujours la valeurde l�argument avant de trouver le r�sultat d�une fonction� Dans le cas pr�sent� le calculde g� � doit recalculer g� �� Et le calcul ne termine pas�

��� Ind�cidabilit� de la terminaison

Les logiciens G/del et Turing ont d�montr� dans les ann�es �� qu�il �tait impossibled�esp�rer trouver un programme sachant tester si une fonction r�cursive termine soncalcul� L�arr�t d�un calcul est en e�et ind�cidable� Dans cette section� nous montronsqu�il n�existe pas de fonction qui permette de tester si une fonction Java termine� Nouspr�sentons cette preuve sous la forme d�une petite histoire�

Le responsable des travaux pratiques d�Informatique en a assez des programmes quicalculent ind��niment �crits par des �l�ves peu exp�riment�s� Cela l�oblige � chaque fois� des manipulations compliqu�es pour stopper ces programmes� Il voit alors dans unjournal sp�cialis� une publicit��

Ne laissez plus boucler vos programmes� Utilisez notre fonction termine�o�Elle prend comme param�tre le nom d�un objet et r�pond true si la proc�duref de cet objet ne boucle pas ind��niment et false sinon� En n�utilisantque les proc�dures pour lesquelles termine r�pond true� vous �vitez tous lesprobl�mes de non terminaison� D�ailleurs� voici quelques exemples�

class Turing

static boolean termine �Object o�

�� Certains syst�mes peuvent donner des r�sultats partiels� par exemple le syst�me SYNTOX deFran�ois Bourdoncle qui arrive � traiter le cas de cette fonction

Page 49: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� IND�CIDABILIT� DE LA TERMINAISON ��

�� dtermine la terminaison de o�f��boolean resultat�

�� contenu brevet par le vendeurreturn resultat�

class Facile

void f ��

class Boucle

void f ��

for �int i � �� i � ��i�

class Test

public static void main �String args#$�

Facile o� � new Facile���

System�out�println �Turing�termine�o����

Boucle o� � new Boucle���

System�out�println �Turing�termine�o����

pour lesquels termine�o r�pond true puis false�

Impressionn� par la publicit�� le responsable des travaux pratiques ach�te � prixd�or cette petite merveille et pense que sa vie d�enseignant va �tre en�n tranquille� Un�l�ve lui fait toutefois remarquer qu�il ne comprend pas l�acquisition faite par le Ma�treavec la classe suivante�

class Absurde

void f ��

while �Turing�termine�this��

class Test

public static void main �String args#$�

Absurde o� � new Absurde���

System�out�println �Turing�termine�o����

Si la proc�dure o��f boucle ind��niment� alors termine�o� � false� Donc la bouclewhile de o��f s�arr�te et o��f termine� Sinon� si la proc�dure o��f ne boucle pasind��niment� alors termine�o� � true� La boucle while pr�c�dente boucle ind��ni�ment� et la proc�dure o��f boucle ind��niment� Il y a donc une contradiction sur lesvaleurs possibles de termine�o�� Cette expression ne peut �tre d��nie� Ayant not� lemauvais esprit de l�El�ve� le Ma�tre conclut qu�on ne peut d�cid�ment pas faire con�ance� la presse sp�cialis�e'

Page 50: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� R�CURSIVIT�

L�histoire est presque vraie� Le Ma�tre s�appelait David Hilbert et voulait montrerla validit� de sa th�se par des moyens automatiques� L�El�ve impertinent �tait KurtG/del� Le tout se passait vers ����� Gr(ce � G/del� on s�est rendu compte que toutesles fonctions math�matiques ne sont pas calculables par programme� Par exemple� il y abeaucoup plus de fonctions de IN !entiers naturels" dans IN que de programmes qui sonten quantit� d�nombrable� G/del� Turing� Church et Kleene sont parmi les fondateursde la th�orie de la calculabilit��

Pour �tre plus pr�cis� on peut remarquer que nous demandons beaucoup � notrefonction termine� puisqu�elle prend en argument un objet !en fait une �adresse m�moi�re "� d�sassemble peut��tre la proc�dure correspondante� et d�cide de sa terminaison�Sinon� elle ne peut que lancer l�ex�cution de son argument et ne peut donc tester saterminaison !quand il ne termine pas"� Un r�sultat plus fort peut �tre montr�� il n�existepas de fonction prenant en argument le source de toute proc�dure !en tant que cha�ne decaract�res" et d�cidant de sa terminaison� C�est ce r�sultat qui est couramment appel�l�ind�cidabilit� de l�arr�t� Mais montrer la contradiction en Java est alors beaucoup plusdur�

��� Proc�dures r�cursives

Les proc�dures� comme les fonctions� peuvent �tre r�cursives� et comporter un appelr�cursif� L�exemple le plus classique est celui des tours de Hanoi� On a � piquets enface de soi� num�rot�s �� � et � de la gauche vers la droite� et n rondelles de taillestoutes di��rentes entourant le piquet �� formant un c)ne avec la plus grosse en bas etla plus petite en haut� On veut amener toutes les rondelles du piquet � au piquet � enne prenant qu�une seule rondelle � la fois� et en s�arrangeant pour qu�� tout moment iln�y ait jamais une rondelle sous une plus grosse� La l�gende dit que les bonzes passaientleur vie � Hanoi � r�soudre ce probl�me pour n � ��� ce qui leur permettait d�attendrel��croulement du temple de Brahma� et donc la �n du monde !cette l�gende fut inven�t�e par le math�maticien fran�ais E� Lucas en ��"� Un raisonnement par r�currencepermet de trouver la solution en quelques lignes� Si n � �� le probl�me est trivial� Sup�posons maintenant le probl�me r�solu pour n � � rondelles pour aller du piquet i aupiquet j� Alors� il y a une solution tr�s facile pour transf�rer n rondelles de i en j�

�� on am�ne les n� � rondelles du haut de i sur le troisi�me piquet k � �� i� j��� on prend la grande rondelle en bas de i et on la met toute seule en j��� on am�ne les n� � rondelles de k en j�

Ceci s��crit

static void hanoi�int n� int i� int j�

if �n �

hanoi �n��� i� ���i�j���

System�out�println �i � � � � � j��

hanoi �n��� ���i�j�� j��

Ces quelques lignes de programme montrent bien comment en g�n�ralisant le probl�me�c�est���dire aller de tout piquet i � tout autre j� un programme r�cursif de quelqueslignes peut r�soudre un probl�me a priori compliqu�� C�est la force de la r�cursion et duraisonnement par r�currence� Il y a bien d�autres exemples de programmation r�cursive�et la puissance de cette m�thode de programmation a �t� �tudi�e dans la th�orie dite dela r�cursivit� qui s�est d�velopp�e bien avant l�apparition de l�informatique !Kleene �����Rogers ����"� Le mot r�cursivit� n�a qu�un lointain rapport avec celui qui est employ�ici� car il s�agissait d��tablir une th�orie abstraite de la calculabilit�� c�est � dire de

Page 51: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� PROC�DURES R�CURSIVES ��

Hanoi(n-1, i, 6-(i+j))

1 2 3

Aller de i vers j

1 2 3

Hanoi (n-1, 6-(i+j), j)

1 2 3

1 2 3

Fig� ��� � Les tours de Hanoi

Page 52: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� R�CURSIVIT�

Fig� ��� � Flocons de von Koch

d��nir math�matiquement les objets qu�on sait calculer� et surtout ceux qu�on ne saitpas calculer� Mais l�id�e initiale de la r�cursivit� est certainement � attribuer � Kleene!����"�

�� Fractales

Consid�rons d�autres exemples de programmes r�cursifs� Des exemples spectaculairessont le cas de fonctions graphiques fractales� Nous utilisons les fonctions graphiques duMacintosh !cf� page ��"� Un premier exemple simple est le �ocon de von Koch ���� quiest d��ni comme suit

Le �ocon d�ordre � est un triangle �quilat�ral�Le �ocon d�ordre � est ce m�me triangle dont les c)t�s sont d�coup�s entrois et sur lequel s�appuie un autre triangle �quilat�ral au milieu�Le �ocon d�ordre n� � consiste � prendre le �ocon d�ordre n en appliquantla m�me op�ration sur chacun de ses c)t�s�

Le r�sultat ressemble e�ectivement � un �ocon de neige id�alis�� L��criture du pro�gramme est laiss� en exercice� On y arrive tr�s simplement en utilisant les fonctionstrigonom�triques sin et cos� Un autre exemple classique est la courbe du Dragon� Lad��nition de cette courbe est la suivante� la courbe du Dragon d�ordre � est un vecteurentre deux points quelconques P et Q� la courbe du Dragon d�ordre n est la courbe duDragon d�ordre n� � entre P et R suivie de la m�me courbe d�ordre n� � entre R et Q!� l�envers"� o$ PRQ est le triangle isoc�le rectangle en R� et R est � droite du vecteurPQ� Donc� si P et Q sont les points de coordonn�es �x� y� et �z� t�� les coordonn�es�u� v� de R sont

u � �x� z��� � �t� y���v � �y � t���� �z � x���

La courbe se programme simplement par

static void dragon�int n� int x� int y� int z� int t�

int u� v�

if �n �� ��

moveTo �x� y��

lineTo �z� t��

Page 53: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� FRACTALES ��

Fig� ��� � La courbe du Dragon

� else

u � �x � z � t � y� � ��

v � �y � t � z � x� � ��

dragon �n��� x� y� u� v��

dragon �n��� z� t� u� v��

Si on calcule dragon ���� ��� ��� ���� ����� on voit appara�tre un petit dragon� Cettecourbe est ce que l�on obtient en pliant �� fois une feuille de papier� puis en la d�pliant�Une autre remarque est que ce trac� l�ve le crayon� et que l�on pr�f�re souvent nepas lever le crayon pour la tracer� Pour ce faire� nous d��nissons une autre proc�duredragonBis qui dessine la courbe � l�envers� La proc�dure dragon sera d��nie r�cursive�ment en fonction de dragon et dragonBis� De m�me� dragonBis est d��nie r�cursive�ment en termes de dragonBis et dragon� On dit alors qu�il y a une r�cursivit� crois�e�

static void dragon �int n� int x� int y� int z� int t�

int u� v�

if �n �� ��

moveTo �x� y��

lineTo �z� t��

� else

u � �x � z � t � y� � ��

v � �y � t � z � x� � ��

dragon �n��� x� y� u� v��

dragonBis �n��� u� v� z� t��

static void dragonBis�int n� int x� int y� int z� int t�

Page 54: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� R�CURSIVIT�

Fig� ��� � Partition de Quicksort

int u� v�

if �n �� ��

moveTo �x� y��

lineTo �z� t��

� else

u � �x � z � t � y� � ��

v � �y � t � z � x� � ��

dragon �n��� x� y� u� v��

dragonBis �n��� u� v� z� t��

Il y a bien d�autres courbes fractales comme la courbe de Hilbert� courbe de Peanoqui recouvre un carr�� les fonctions de Mandelbrot� Ces courbes servent en imagerie pourfaire des parcours �al�atoires de surfaces� et donnent des fonds esth�tiques � certainesimages�

�� Quicksort

Cette m�thode de tri est due � C�A�R Hoare en ���� Son principe est le suivant�On prend un �l�ment au hasard dans le tableau � trier� Soit v sa valeur� On partitionnele reste du tableau en � zones� les �l�ments plus petits ou �gaux � v� et les �l�mentsplus grands ou �gaux � v� Si on arrive � mettre en t�te du tableau les plus petits quev et en �n du tableau les plus grands� on peut mettre v entre les deux zones � sa placed��nitive� On peut recommencer r�cursivement la proc�dure Quicksort sur chacune despartitions tant qu�elles ne sont pas r�duites � un �l�ment� Graphiquement� on choisit vcomme l�un des ai � trier� On partitionne le tableau pour obtenir la position de la �gure��� !c"� Si g et d sont les bornes � gauche et � droite des indices du tableau � trier� lesch�ma du programme r�cursif est

static void qSort�int g� int d�

if �g � d�

v � a#g$�

Partitionner le tableau autour de la valeur vet mettre v � sa bonne position m

qSort �g� m����

qSort �m��� d��

Nous avons pris a�g� au hasard� toute autre valeur du tableau a aurait convenu� Enfait� la prendre vraiment au hasard ne fait pas de mal� car �a �vite les probl�mes pourles distributions particuli�res des valeurs du tableau !par exemple si le tableau est d�j�tri�"� Plus important� il reste � �crire le fragment de programme pour faire la partition�Une m�thode ing�nieuse �� consiste � parcourir le tableau de g � d en g�rant deuxindices i et m tels qu�� tout moment on a aj � v pour g � j � m� et aj � v pourm � j � i� Ainsi

Page 55: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� QUICKSORT ��

m � g�

for �i � g��� i �� d� ��i�

if �a#i$ � v�

��m�

x � a#m$� a#m$ � a#i$� a#i$ � x� �� Echanger am et ai�

ce qui donne la proc�dure suivante de Quicksort

static void qSort�int g� int d�

int i� m� x� v�

if �g � d�

v � a#g$�

m � g�

for �i � g��� i �� d� ��i�

if �a#i$ � v�

��m�

x � a#m$� a#m$ � a#i$� a#i$ � x� �� Echanger am et ai�

x � a#m$� a#m$ � a#g$� a#g$ � x� �� Echanger am et agqSort �g� m����

qSort �m��� d��

Cette solution n�est pas sym�trique� La pr�sentation usuelle de Quicksort consiste �encadrer la position �nale de v par deux indices partant de � et N et qui convergentvers la position �nale de v� En fait� il est tr�s facile de se tromper en �crivant ceprogramme� C�est pourquoi nous avons suivi la m�thode d�crite dans le livre de Bentley��� Une m�thode tr�s e%cace et sym�trique est celle qui suit� de Sedgewick �� ��

static void quickSort�int g� int d�

int v�t�i�j�

if �g � d�

v � a#d$� i� g��� j � d�

do

do

��i�

while �a#i$ � v��

do

��j�

while �a#j$ v��

t � a#i$� a#i$ � a#j$� a#j$ � t�

� while �j i��

a#j$ � a#i$� a#i$ � a#d$� a#d$ � t�

quickSort �g� i����

quickSort �i��� d��

On peut v�ri�er que cette m�thode ne marche que si des sentinelles � gauche et � droitedu tableau existent� en mettant un plus petit �l�ment que v � gauche et un plus grand� droite� En fait� une mani�re de garantir cela est de prendre toujours l��l�ment degauche� de droite et du milieu� de mettre ces trois �l�ments dans l�ordre� en mettant le

Page 56: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� R�CURSIVIT�

plus petit des trois en a�� le plus grand en aN et prendre le m�dian comme valeur v �placer dans le tableau a� On peut remarquer aussi comment le programme pr�c�dentrend bien sym�trique le cas des valeurs �gales � v dans le tableau� Le but recherch� estd�avoir la partition la plus �quilibr�e possible� En e�et� le calcul du nombre moyen CN

de comparaisons emprunt� � �� � donne C� � C� � �� et pour N � ��

CN � N � � ��

N

X��k�N

�Ck�� � CN�k�

D�o$ par sym�trie

CN � N � � ��

N

X��k�N

Ck��

En soustrayant� on obtient apr�s simpli�cation

NCN � �N � ��CN�� � �N

En divisant par N�N � ��

CN

N � ��

CN��

N�

N � ��

C�

X��k�N

k � �

En approximant

CN

N � �� �

X��k�N

k� �

Z N

xdx � � lnN

D�o$ le r�sultat

CN � �� �N log�N

Quicksort est donc tr�s e%cace en moyenne� Bien s#r� ce tri peut �tre en tempsO�N��� si les partitions sont toujours d�g�n�r�es par exemple pour les suites monotonescroissantes ou d�croissantes� C�est un algorithme qui a une tr�s petite constante !���"devant la fonction logarithmique� Une bonne technique consiste � prendre Quicksortpour de gros tableaux� puis revenir au tri par insertion pour les petits tableaux !� ou� �l�ments"�

Le tri par Quicksort est le prototype de la m�thode de programmation Divide andConquer !en fran�ais �diviser pour r�gner "� En e�et� Quicksort divise le probl�me endeux !les � appels r�cursifs" et recombine les r�sultats gr(ce � la partition initialementfaite autour d�un �l�ment pivot� Divide and Conquer sera la m�thode chaque fois qu�unprobl�me peut �tre divis� en morceaux plus petits� et que l�on peut obtenir la solution �partir des r�sultats calcul�s sur chacun des morceaux� Cette m�thode de programmationest tr�s g�n�rale� et reviendra souvent dans le cours� Elle suppose donc souvent plusieursappels r�cursifs et permet souvent de passer d�un nombre d�op�rations lin�aire O�n� �un nombre d�op�rations logarithmique O�log n��

��� Le tri par fusion

Une autre proc�dure r�cursive pour faire le tri est le tri par fusion !ou par interclas�sement"� La m�thode provient du tri sur bande magn�tique !p�riph�rique autrefois fortutile des ordinateurs"� C�est aussi un exemple de la m�thode Divide and Conquer� Onremarque d�abord qu�il est ais� de faire l�interclassement entre deux suites de nombres

Page 57: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� LE TRI PAR FUSION �

tri�s dans l�ordre croissant� En e�et� soient ha�� a�� � � � aM i et hb�� b�� � � � bN i ces deuxsuites� Pour obtenir� la suite interclass�e hc�� c�� � � � cM�N i des ai et bj � il su%t de faire leprogramme suivant� !On suppose que l�on met deux sentinelles aM�� �� et bN�� ��pour ne pas compliquer la structure du programme�"

int#$ a � new int#M��$�

b � new int#N��$�

c � new int#M�N$�

int i � � j � �

a#M��$ � b#N��$ � Integer�MAX�VALUE�

for �int k � � k � M�N� ��k�

if �a#i$ �� b#j$�

c#k$ � a#i$�

��i�

� else

c#k$ � b#j$�

��j�

Successivement� ck devient le minimum de ai et bj en d�calant l�endroit o$ l�on se trouvedans la suite a ou b selon le cas choisi� L�interclassement de M et N �l�ments se fait doncen O�M �N� op�rations� Pour faire le tri fusion� en appliquant Divide and Conquer� ontrie les deux moiti�s de la suite ha�� a�� � � � aN i � trier� et on interclasse les deux moiti�stri�es� Il y a toutefois une di%cult� car on doit copier dans un tableau annexe les �moiti�s � trier� puisqu�on ne sait pas faire l�interclassement en place� Si g et d sont lesbornes � gauche et � droite des indices du tableau � trier� le tri fusion est donc

static void TriFusion�int g� int d�

int i� j� k� m�

if �g � d�

m � �g � d� � ��

TriFusion �g� m��

TriFusion �m � �� d��

for �i � m� i � g� ��i�

b#i$ � a#i$�

for �j � m��� j �� d� ��j�

b#d�m���j$ � a#j$�

i � g� j � d�

for �k � g� k �� d� ��k�

if �b#i$ � b#j$�

a#k$ � b#i$� ��i�

� else

a#k$ � b#j$� ��j�

La recopie pour faire l�interclassement se fait dans un tableau b de m�me taille quea� Il y a une petite astuce en recopiant une des deux moiti�s dans l�ordre inverse� cequi permet de se passer de sentinelles pour l�interclassement� puisque chaque moiti�sert de sentinelle pour l�autre moiti�� Le tri par fusion a une tr�s grande vertu� Sonnombre d�op�rations CN est tel que CN � �N � �CN��� et donc CN � O�N logN��Donc le tri fusion est un tri qui garantit un temps N logN � au prix d�un tableau annexe

Page 58: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� R�CURSIVIT�

de N �l�ments� Ce temps est r�alis� quelle que soit la distribution des donn�es� � ladi��rence de QuickSort� Plusieurs probl�mes se posent imm�diatement� peut on fairemieux- Faut�il utiliser ce tri plut)t que QuickSort-

Nous r�pondrons plus tard �non � la premi�re question� voir section �� Quant � ladeuxi�me question� on peut remarquer que si ce tri garantit un bon temps� la constantepetite devant N logN de QuickSort fait que ce dernier est souvent meilleur� Aussi�QuickSort utilise moins de m�moire annexe� puisque le tri fusion demande un tableauqui est aussi important que celui � trier� En�n� on peut remarquer qu�il existe uneversion it�rative du tri par fusion en commen�ant par trier des sous�suites de longueur�� puis de longueur �� � �� � � � �

��� Programmes en Caml

�� Fibonaci� voir page � ��

let rec fib n �

if n �� � then �

else fib �n � �� � fib � n � ����

�� Factorielle� voir page � ��

let rec fact n �

if n �� � then �

else n � fact �n � ����

�� Triangle de Pascal� voir page � ��

let rec C n p �

if n � �� p � n then �

else C �n � �� �p � �� � C �n � �� p��

�� Fibonaci itratif� voir page � ��

let fib n �

let u � ref � and v � ref � in

for i � � to n do

let u � &u and v � &v in

u �� u � v�

v �� u

done�

&u��

�� Le m�me en style fonctionnel ��

let fib n �

let rec fib�aux k u v �

if k n then u

else fib�aux �k � �� �u � v� u in

fib�aux � � ���

�� La fonction dAckermann� voir page � ��

let rec ack m n �

if m � then n � � else

if n � then ack �m � �� � else

Page 59: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� PROGRAMMES EN CAML ��

ack �m � �� �ack m �n � �����

�� La fonction ��� voir page � ��

let rec f�� n �

if n � then n � �

else f�� �f�� �n � ������

�� La fonction de Morris� voir page � ��

let rec g m n �

if m � then �

else g �m � �� �g m n���

�� Les tours de Hanoi� voir page �� ��

let rec hanoi n i j �

if n then begin

hanoi �n � �� i �� � �i � j���

printf ��d � �d�n� i j�

hanoi �n � �� �� � �i � j�� j�

end��

�open �graphics���

open�graph ����

let rec dragon n x y z t �

if n � � then begin

moveto x y�

lineto z t

end else begin

let u � �x � z � t � y� � �

and v � �y � t � z � x� � � in

dragon �n � �� x y u v�

dragon �n � �� z t u v

end��

�� La courbe du dragon� voir page �� ��

let rec dragon n x y z t �

if n � � then begin

moveto x y�

lineto z t

end else begin

let u � �x � z � t � y� � �

and v � �y � t � z � x� � � in

dragon �n � �� x y u v�

dragon�bis �n � �� u v z t

end

and dragon�bis n x y z t �

if n � � then begin

moveto x y�

Page 60: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� R�CURSIVIT�

lineto z t

end else begin

let u � �x � z � t � y� � �

and v � �y � t � z � x� � � in

dragon �n � �� x y u v�

dragon�bis �n � �� u v z t

end��

clear�graph����

dragon �! �� �� ! !��

�� Quicksort� voir page �� ��

let rec qsort g d �

if g � d then begin

let v � a��g�

and m � ref g in

for i � g � � to d do

if a��i� � v then begin

m �� &m � ��

let x � a��&m� in

a��&m� �� a��i�� a��i� �� x

end

done�

let x � a��&m� in

a��&m� �� a��g�� a��g� �� x�

qsort g �&m � ���

qsort �&m � �� d

end��

�� Quicksort� voir page �� ��

let rec quicksort g d �

if g � d then begin

let v � a��d�

and t � ref

and i � ref �g � ��

and j � ref d in

while j i do

incr i�

while a��&i� � v do incr i done�

decr j�

while a��&j� v do decr j done�

t �� a��&i��

a��&i� �� a��&j��

a��&j� �� &t

done�

a��&j� �� a��&i��

a��&i� �� a��d��

a��d� �� &t�

quicksort g �&i � ���

quicksort �&i � �� d

end��

Page 61: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� PROGRAMMES EN CAML �

�� Tri fusion� voir page �� ��

let b � make�vect n ��

let rec tri�fusion g d �

if g � d then begin

let m � �g � d� � � in

tri�fusion g m�

tri�fusion �m � �� d�

for i � m downto g do

b��i� �� a��i� done�

for i � m � � to d do

b��d � m � � � i� �� a��i� done�

let i � ref g and j � ref d in

for k � g to d do

if b��&i� � b��&j� then begin

a��k� �� b��&i�� incr i

end else begin

a��k� �� b��&j�� decr j

end

done

end��

Page 62: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� R�CURSIVIT�

Page 63: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

Chapitre �

Structures de donn�es �l�mentaires

Dans ce chapitre� nous introduisons quelques structures utilis�es de fa�on tr�s inten�sive en programmation� Leur but est de g�rer un ensemble �ni d��l�ments dont le nombren�est pas �x� a priori� Les �l�ments de cet ensemble peuvent �tre de di��rentes sortes�nombres entiers ou r�els� cha�nes de caract�res� ou des objets informatiques plus com�plexes comme les identi�cateurs de processus ou les expressions de formules en cours decalcul � � � On ne s�int�ressera pas aux �l�ments de l�ensemble en question mais aux op��rations que l�on e�ectue sur cet ensemble� ind�pendamment de la nature de ses �l�ments�Ainsi les ensembles que l�on utilise en programmation� contrairement � ceux consid��r�s en math�matiques qui sont �x�s une fois pour toutes� sont des objets dynamiques�Le nombre de leurs �l�ments varie au cours de l�ex�cution du programme� puisqu�onpeut y ajouter et supprimer des �l�ments en cours de traitement� Plus pr�cis�ment lesop�rations que l�on s�autorise sur les ensembles sont les suivantes �

� tester si l�ensemble E est vide�

� ajouter l��l�ment x � l�ensemble E�

� v�ri�er si l��l�ment x appartient � l�ensemble E�

� supprimer l��l�ment x de l�ensemble E�

Cette gestion des ensembles doit� pour �tre e%cace� r�pondre au mieux � deux cri�t�res parfois contradictoires� un minimum de place m�moire utilis�e et un minimumd�instructions �l�mentaires pour r�aliser une op�ration� La place m�moire utilis�e de�vrait pour bien faire �tre tr�s voisine du nombre d��l�ments de l�ensemble E� multipli�epar leur taille� c�est ce qui se passera pour les trois structures que l�on va �tudier plusloin� En ce qui concerne la minimisation du nombre d�instructions �l�mentaires� on peuttester tr�s simplement si un ensemble est vide et on peut r�aliser l�op�ration d�ajout enquelques instructions� toutefois il est impossible de r�aliser une suppression ou une re�cherche d�un �l�ment quelconque dans un ensemble en utilisant un nombre d�op�rationsind�pendant du cardinal de cet ensemble !� moins d�utiliser une structure demandantune tr�s grande place en m�moire"� Pour am�liorer l�e%cacit�� on consid�re des struc�tures de donn�es dans lesquelles on restreint la port�e des op�rations de recherche etde suppression d�un �l�ment en se limitant � la r�alisation de ces op�rations sur le der�nier ou le premier �l�ment de l�ensemble� ceci donne les structures de pile ou de �le�nous verrons que malgr� ces restrictions les structures en question ont de nombreusesapplications�

Page 64: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� STRUCTURES DE DONN�ES �L�MENTAIRES

e� e� e�

t�te

e� e� e� e�

t�te

Fig� ��� � Ajout d�un �l�ment dans une liste

��� Listes cha�n�es

La liste est une structure de base de la programmation� le langage LISP !LISt Pro�cessing"� con�u par John MacCarthy en ���� ou sa version plus r�cente Scheme ����utilise principalement cette structure qui se r�v�le utile pour le calcul symbolique� Dansce qui suit on utilise la liste pour repr�senter un ensemble d��l�ments� Chaque �l�mentest contenu dans une cellule� celle ci contient en plus de l��l�ment l�adresse de la cellulesuivante� appel�e aussi pointeur� La recherche d�un �l�ment dans la liste s�apparente �un classique �jeu de piste dont le but est de retrouver un objet cach�� on commencepar avoir des informations sur un lieu o$ pourrait se trouver cet objet� en ce lieu ond�couvre des informations sur un autre lieu o$ il risque de se trouver et ainsi de suite�Le langage Java permet cette r�alisation � l�aide de classes et d�objets� les cellules sontdes objets !c�est � dire des instances d�une classe" dont un des champs contient uner�ference vers la cellule suivante� La r�f�rence vers la premi�re cellule est elle contenuedans une variable de t�te de liste� Les d�clarations correspondantes sont les suivantes�o$ l�on suppose ici que les �l�ments stock�s dans chaque cellule dont de type entier��

class Liste

int contenu�

Liste suivant�

Liste �int x� Liste a�

contenu � x�

suivant � a�

L�instruction new Liste �x a construit une nouvelle cellule dont les champs sont xet a� La fonction Liste�xa est un constructeur de la classe Liste !un constructeurest une fonction non statique qui se distingue par le type de son r�sultat qui est celui dela classe courante et par son absence de nom pour l�identi�er"� L�objet null appartient� toute classe� et repr�sentera dans le cas des listes le marqueur de �n de liste� Ainsinew Liste�� new Liste �� new Liste � null repr�sentera la liste �� ����Les op�rations sur les ensembles que nous avons consid�r�es ci�dessus s�expriment alorscomme suit si on g�re ceux�ci par des listes�

static boolean estVide �Liste a�

return a �� null�

La proc�dure ajouter ins�re l��l�ment x en t�te de liste� Ce choix de mettre l��l�menten t�te est indispensable pour que le nombre d�op�rations lors de l�ajout soit ind�pendantde la taille de la liste� il su%t alors de modi�er la valeur de la t�te de liste ce qui estfait simplement par

static Liste ajouter �int x� Liste a�

return new Liste �x� a�� �� Lancienne t�te se retrouve apr�s x

Page 65: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� LISTES CHA N�ES �

e� e� e� e�

t�te

e� e� e� e�

t�te

Fig� ��� � Suppression d�un �l�ment dans une liste

La fonction recherche� qui v�ri�e si l��l�ment x �gure bien dans la liste a� e�ectue unparcours de la liste pour rechercher l��l�ment� La variable a est modi��e it�rativementpar a � a�suivant de fa�on � parcourir tous les �l�ments jusqu�� ce que l�on trouvex ou que l�on arrive � la �n de la liste !a � null"�

static boolean recherche �int x� Liste a�

while �a &� null�

if �a�contenu �� x�

return true�

a � a�suivant�

return false�

La fonction recherche peut aussi �tre �crite de mani�re r�cursive

static boolean recherche �int x� Liste a�

if �a �� null�

return false�

else if �a�contenu �� x�

return true�

else

return recherche �x� a�suivant��

ou encore

static boolean recherche �int x� Liste a�

if �a �� null�

return false�

else

return �a�contenu �� x� �� recherche �x� a�suivant��

ou encore encore !quoique non recommand�"�

static boolean recherche �int x� Liste a�

return a &� null %% �a�contenu �� x �� recherche �x� a�suivant���

Cette �criture r�cursive est syst�matique� pour les fonctions sur les listes� En e�et� letype des listes v�ri�e l��quation suivante�

Liste � fListe�videg � Element � Liste

Page 66: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

CHAPITRE �� STRUCTURES DE DONN�ES �L�MENTAIRES

o$ � est l�union disjointe et � le produit cart�sien� Toute proc�dure ou fonction tra�vaillant sur les listes peut donc s��crire r�cursivement sur la structure de sa liste argu�ment� Par exemple� la longueur d�une liste se calcule par

static int longueur�Liste a�

if �a �� null�

return �

else

return � � longueur �a�suivant��

ce qui est plus �l�gant que l��criture it�rative qui suit

static int longueurI�Liste a�

int longueur � �

while �a &� null�

��longueur�

a � a�suivant�

return longueur�

Choisir entre la mani�re r�cursive ou it�rative est a�aire de go#t� Autrefois� on disaitque l��criture it�rative �tait plus e%cace car utilisant moins de m�moire� Gr(ce auxtechniques nouvelles de compilation !comme l��limination des r�cursions terminales"�c�est de moins en moins vrai� de plus l�occupation m�moire est� dans les ordinateursd�aujourd�hui� une question nettement moins critique�

La suppression de la cellule qui contient x s�e�ectue en modi�ant la valeur desuivant contenue dans le pr�d�cesseur de x� le successeur du pr�d�cesseur de x devientle successeur de x� Un traitement particulier doit �tre fait si l��l�ment � supprimer estle premier �l�ment de la liste� La proc�dure r�cursive de suppression est tr�s compactedans sa d��nition�

static Liste supprimer �int x� Liste a�

if �a &� null�

if �a�contenu �� x�

a � a�suivant�

else

a�suivant � supprimer �x� a�suivant��

return a�

Une proc�dure it�rative demande beaucoup plus d�attention�

static Liste supprimer �int x� Liste a�

if �a &� null�

if �a�contenu �� x�

a � a�suivant�

else

Liste b � a �

while �b�suivant &� null %% b�suivant�contenu &� x�

b � b�suivant�

if �b�suivant &� null�

b�suivant � b�suivant�suivant�

Page 67: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� LISTES CHA N�ES

return a�

Noter que dans les deux fonctions ci�dessus� on a modi�� la liste a� on ne peut doncdisposer de deux listes distinctes l�une qui contient x et l�autre identique � la pr�c�dente�mais ne contenant pas x� Pour ce faire� il faut recopier une partie de la liste a dans unenouvelle liste� comme le fait le programme suivant� o$ il y a une utilisation un peu plusimportante de la m�moire� Mais l�espace m�moire perdu est r�cup�r� par le glaneurde cellules !GC" de Java� si personne n�utilise l�ancienne liste a� Avec les techniquesactuelles de GC � g�n�rations� cette r�cup�ration s�e�ectuera tr�s rapidement� Il fautdonc noter la di��rence avec un langage comme Pascal ou C� o$ on doit se pr�occuperde l�espace m�moire perdu� si on veut pouvoir le r�utiliser�

static Liste supprimer �int x� Liste a�

if �a &� null�

return null�

else if �a�contenu �� x�

return a�suivant�

else

return new Liste �a�contenu� supprimer �x� a�suivant���

Une technique souvent utilis�e permet d��viter quelques tests pour supprimer un�l�ment dans une liste et plus g�n�ralement pour simpli�er la programmation sur leslistes� Elle consiste � utiliser une garde permettant de rendre homog�ne le traitementde la liste vide et des autres listes� En e�et dans la repr�sentation pr�c�dente� la listevide n�a pas la m�me structure que les autres listes� On utilise une cellule plac�e aud�but et n�ayant pas d�information signi�cative dans le champ contenu� l�adresse de lavraie premi�re cellule se trouve dans le champ suivant de cette cellule� On obtientainsi une liste gard�e� l�avantage d�une telle garde est que la liste vide contient au moinsla garde� et que par cons�quent un certain nombre de programmes� qui devaient faireun cas sp�cial dans le cas de la liste vide ou du premier �l�ment de liste� deviennentplus simples� Cette notion est un peu l��quivalent des sentinelles pour les tableaux� Onutilisera cette technique dans les proc�dures sur les �les un peu plus loin !voir page �" �On peut aussi d��nir des listes circulaires gard�es en mettant l�adresse de cette premi�recellule dans le champ suivant de la derni�re cellule de la liste� Les listes peuvent aussi�tre g�r�es par di��rents autres m�canismes que nous ne donnons pas en d�tail ici� Onpeut utiliser� par exemple� des listes doublement cha�n�es dans lesquelles chaque cellulecontient un �l�ment et les adresses � la fois de la cellule qui la pr�c�de et de celle qui lasuit� Des couples de tableaux peuvent aussi �tre utilis�s� le premier contenu contient les�l�ments de l�ensemble� le second adrsuivant contient les adresses de l��l�ment suivantdans le tableau contenu�

Remarque La proc�dure ajouter e�ectue op�rations �l�mentaires� Elle est donc tr�se%cace� En revanche� les proc�dures recherche et supprimer sont plus longues puisqu�onpeut aller jusqu�� parcourir la totalit� d�une liste pour retrouver un �l�ment� On peutestimer� si on ne fait aucune hypoth�se sur la fr�quence respective des recherches� que lenombre d�op�rations est en moyenne �gal � la moiti� du nombre d��l�ments de la liste�Ceci est � comparer � la recherche dichotomique qui e�ectue un nombre logarithmiquede comparaisons et � la recherche par hachage qui est souvent bien plus rapide encore�

Exemple A titre d�exemple d�utilisation des listes� nous consid�rons la constructiond�une liste des nombres premiers inf�rieurs ou �gaux � un entier n donn�� Pour construire

Page 68: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

CHAPITRE �� STRUCTURES DE DONN�ES �L�MENTAIRES

cette liste� on commence� dans une premi�re phase� par y ajouter tous les entiers de �� n en commen�ant par le plus grand et en terminant par le plus petit� Du fait del�algorithme d�ajout d�crit plus haut� la liste contiendra donc les nombres en ordrecroissant� On utilise ensuite la m�thode classique du crible d�Eratosth�ne� on consid�resuccessivement les �l�ments de la liste dans l�ordre croissant et on supprime tous leursmultiples stricts� Ceci se traduit par la proc�dure suivante �

static Liste listePremier �int n�

Liste a � null�

int k�

for �int i � n� i � �� ��i�

a � ajouter �i� a��

k � a�contenu�

for �Liste b � a� k � k �� n � b � b�suivant�

k � b�contenu�

for �int j � k� j �� n�k� ��j�

a � supprimer �j � k� a��

return�a��

Remarque Nous ne pr�tendons pas que cette programmation soit e%cace !loin del�'"� Elle est toutefois simple � �crire� une fois que l�on a � sa disposition les fonctionssur les listes� Elle donne de bons r�sultats pour n inf�rieur � ������ Un bon exerciceconsiste � en am�liorer l�e%cacit��

Exemple Un autre exemple� plus utile� d�application des listes est la gestion des col�lisions dans le hachage dont il a �t� question au chapitre � !voir page �"� Il s�agit pourchaque entier i de l�intervalle � � � � N � �� de construire une liste cha�n�e Li form�e detoutes les cl�s x telles que h�x� � i� Les �l�ments de la liste sont des entiers permet�tant d�acc�der aux tableaux des noms et des num�ros de t�l�phone� Les proc�dures derecherche et d�insertion de x dans une table deviennent des proc�dures de recherche etd�ajout dans une liste� Ainsi� si la fonction h est mal choisie� le nombre de collisionsdevient important� la plus grande des listes devient de taille imposante et le hachagerisque de devenir aussi co#teux que la recherche dans une liste cha�n�e ordinaire� Parcontre� si h est bien choisie� la recherche est rapide�

Liste al#$ � new Liste#N��$�

static void insertion �String x� int val�

int i � h�x��

al#i$ � ajouter �x� al#i$��

static int recherche �String x�

for �int a � al#h�x�$� a &� null� a � a�suivant�

if �x�equals�nom#a�contenu$��

return tel#a�contenu$�

return ���

Page 69: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� FILES �

��� Files

Les �les sont utilis�es en programmation pour g�rer des objets qui sont en attented�un traitement ult�rieur� par exemple des processus en attente d�une ressource dusyst�me� des sommets d�un graphe� des nombres entiers en cours d�examen de certainesde leur propri�t�s� etc � � � Dans une �le les �l�ments sont syst�matiquement ajout�s enqueue et supprim�s en t�te� la valeur d�une �le est par convention celle de l��l�mentde t�te� En anglais� on parle de strat�gie FIFO First In First Out� par opposition �la strat�gie LIFO Last In First Out des piles� De fa�on plus formelle� on se donne unensemble E� l�ensemble des �les dont les �l�ments sont dans E est not� Fil�E�� la �levide !qui ne contient aucun �l�ment" est F�� les op�rations sur les �les sont vide� ajouter�valeur� supprimer �

� estVide est une application de Fil�E� dans !vrai� faux"� estV ide�F � est �gal �vrai si et seulement si la �le F est vide�

� ajouter est une application de E � Fil�E� dans Fil�E�� ajouter�x� F � est la �leobtenue � partir de la �le F en ins�rant l��l�ment x � la �n de celle�ci�

� valeur est une application de Fil�E� nF� dans E qui � une �le F non vide associel��l�ment se trouvant en t�te�

� supprimer est une application de Fil�E� nF� dans Fil�E� qui associe � une �le Fnon vide la �le obtenue � partir de F en supprimant son premier �l�ment�

Les op�rations sur les �les satisfont les relations suivantes

Pour F � F�

supprimer�ajouter�x� F �� � ajouter�x� supprimer�F ��valeur�ajouter�x� F �� � valeur�F �

Pour toute �le F

estV ide�ajouter�x� F �� � faux

Pour la �le F�

supprimer�ajouter�x� F��� � F�valeur�ajouter�x� F��� � xestV ide�F�� � vrai

Une premi�re id�e de r�alisation sous forme de programmes des op�rations sur les�les est emprunt�e � une technique mise en oeuvre dans des lieux o$ des clients font laqueue pour �tre servis� il s�agit par exemple de certains guichets de r�servation dans lesgares� de bureaux de certaines administrations� ou des �tals de certains supermarch�s�Chaque client qui se pr�sente obtient un num�ro et les clients sont ensuite appel�s parles serveurs du guichet en fonction croissante de leur num�ro d�arriv�e� Pour g�rer cesyst�me deux nombres doivent �tre connus par les gestionnaires� le num�ro obtenu parle dernier client arriv� et le num�ro du dernier client servi� On note ces deux nombrespar �n et d�but respectivement et on g�re le syst�me de la fa�on suivante

� la �le d�attente est vide si et seulement si d�but � �n�

� lorsqu�un nouveau client arrive on incr�mente �n et on donne ce num�ro au client�

� lorsque le serveur est libre et peut servir un autre client� si la �le n�est pas vide�il incr�mente d�but et appelle le possesseur de ce num�ro�

Page 70: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� STRUCTURES DE DONN�ES �L�MENTAIRES

�� �� �� �� �� � �� �� ��

d�but �n

La �le contient les nombres f� �� �g�� �� �� �� �� � �� �� �

d�but �n

Ajout de l��l�ment ��

�� �� �� �� �� � �� �� �

d�but �n

Suppressions successives de deux �l�ments

�� �� �� �� �� � �� �� � �

d�but�n

Ajout de l��l�ment �

�� �� �� �� �� � �� �� � �

d�but

�n File vide apr�s � suppressions

Fig� ��� � File g�r�e par un tableau circulaire

Dans la suite� on a repr�sent� toutes ces op�rations en Java en optimisant la placeprise par la �le en utilisant la technique suivante� on r�attribue le num�ro � � un nouveauclient lorsque l�on atteint un certain seuil pour la valeur de �n� On dit qu�on a un tableau!ou tampon" circulaire�

class File

final static int MaxF � ��

int debut�

int fin�

boolean pleine� vide�

int contenu#$�

File ��

debut � � fin � �

pleine � false� vide � true�

contenu � new int#MaxF$�

static File vide ��

return new File���

static void faireVide �File f�

f�debut � � f�fin � �

f�pleine � false� f�vide � true�

static boolean estVide�File f�

Page 71: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� FILES �

return f�vide�

static boolean estPleine�File f�

return f�pleine�

static int valeur �File f�

if �f�vide�

erreur ��File Vide����

return f�contenu#f�debut$�

private static int Successeur�int i�

return �i��� � MaxF�

static void ajouter �int x� File f�

if �f�pleine�

erreur ��File Pleine����

f�contenu#f�fin$ � x�

f�fin � Successeur�f�fin��

f�vide � false�

f�pleine � f�fin �� f�debut�

static void supprimer �File f�

if �f�vide�

erreur ��File Vide����

f�debut � Successeur�f�debut��

f�vide � f�fin �� f�debut�

f�pleine � false�

Une autre fa�on de g�rer des �les consiste � utiliser des listes cha�n�es gard�es !voirpage " dans lesquelles on conna�t � la fois l�adresse du premier et du dernier �l�ment�Cela donne les op�rations suivantes�

class File

Liste debut�

Liste fin�

File �Liste a� Liste b�

debut � a�

fin � b�

static File vide ��

Liste garde � new Liste���

return new File �garde� garde��

static void faireVide �File f�

Liste garde � new Liste���

f�debut � f�fin � garde�

Page 72: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� STRUCTURES DE DONN�ES �L�MENTAIRES

e� e� en n � �

d�but �n

Fig� ��� � File d�attente impl�ment�e par une liste

static boolean estVide �File f�

return f�debut �� f�fin�

static int valeur �File f�

Liste b � f�debut�suivant�

return b�contenu�

static void ajouter �int x� File f�

Liste a � new Liste �x� null��

f�fin�suivant � a�

f�fin � a�

static void supprimer �File f�

if �estVide �f��

erreur ��File Vide����

f�debut � f�debut�suivant�

Nous avons deux r�alisations possibles des �les avec des tableaux ou des listes cha��n�es� L��criture de programmes consiste � faire de tels choix pour repr�senter les struc�tures de donn�es� L�ensemble des fonctions sur les �les peut �tre indistinctement unmodule manipulant des tableaux ou un module manipulant des listes� L�utilisation des�les se fait uniquement � travers les fonctions vide� ajouter� valeur� supprimer� C�est doncl�interface des �les qui importe dans de plus gros programmes� et non leurs r�alisations�Les notions d�interface et de modules seront d�velopp�es au chapitre �

��� Piles

La notion de pile intervient couramment en programmation� son r)le principalconsiste � impl�menter les appels de proc�dures� Nous n�entrerons pas dans ce sujet�plut)t technique� dans ce chapitre� Nous montrerons le fonctionnement d�une pile �l�aide d�exemples choisis dans l��valuation d�expressions Lisp�

On peut imaginer une pile comme une bo�te dans laquelle on place des objets et delaquelle on les retire dans un ordre inverse de celui dans lequel on les a mis� les objetssont les uns sur les autres dans la bo�te et on ne peut acc�der qu�� l�objet situ� au�sommet de la pile � De fa�on plus formelle� on se donne un ensemble E� l�ensemble despiles dont les �l�ments sont dans E est not� Pil�E�� la pile vide !qui ne contient aucun�l�ment" est P�� les op�rations sur les piles sont vide� ajouter� valeur� supprimer commesur les �les� Cette fois� les relations satisfaites sont les suivantes !o$ P� d�note la pilevide"

Page 73: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� PILES �

supprimer�ajouter�x� P �� � PestVide�ajouter�x� P �� � fauxvaleur�ajouter�x� P �� � xestVide�P�� � vrai

A l�aide de ces relations� on peut exprimer toute expression sur les piles faisantintervenir les � op�rations pr�c�dentes � l�aide de la seule op�ration ajouter en partantde la pile P�� Ainsi l�expression suivante concerne les piles sur l�ensemble des nombresentiers�

supprimer �ajouter ���supprimer �ajouter �valeur �ajouter ��� ajouter �� P��"""�

ajouter �� P��"""

Elle peut se simpli�er en�

ajouter�� P��

La r�alisation des op�rations sur les piles peut s�e�ectuer en utilisant un tableau quicontient les �l�ments et un indice qui indiquera la position du sommet de la pile� parr�f�rence�

class Pile

final static int maxP � ��

int hauteur �

Element contenu#$�

Pile ��

hauteur � �

contenu � new Element#maxP$�

static File vide ��

return new Pile���

static void faireVide �Pile p�

p�hauteur � �

static boolean estVide �Pile p�

return p�hauteur �� �

static boolean estPleine �Pile p�

return p�hauteur �� maxP�

static void ajouter �Element x� Pile p�

throws ExceptionPile

if �estPleine �p��

throw new ExceptionPile��pleine���

p�contenu#p�hauteur$ � x�

�� p�hauteur�

Page 74: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� STRUCTURES DE DONN�ES �L�MENTAIRES

static Element valeur �Pile p�

throws ExceptionPile

if �estVide �p��

throw new ExceptionPile��vide���

return p�contenu #p�hauteur � �$�

static void supprimer �Pile p�

throws ExceptionPile

if �estVide �p��

throw new ExceptionPile ��vide���

�� p�hauteur�

o$ on suppose qu�une nouvelle classe d��nit les exceptions ExceptionPile�

class ExceptionPile extends Exception

String nom�

public ExceptionPile �String x�

nom � x�

Remarques Chacune des op�rations sur les piles demande un tr�s petit nombre d�op��rations �l�mentaires et ce nombre est ind�pendant du nombre d��l�ments contenus dansla pile� On peut g�rer aussi une pile avec une liste cha�n�e� les fonctions correspondantessont laiss�es � titre d�exercice� Les piles ont �t� consid�r�es comme des arguments parr�f�rence pour �viter qu�un appel de fonction ne fasse une copie inutile pour passerl�argument par valeur�

�� Evaluation des expressions arithm�tiques pr� x�es

Dans cette section� on illustre l�utilisation des piles par un programme d��valuationd�expressions arithm�tiques �crites de fa�on particuli�re� Rappelons qu�expression arith�m�tique signi�e dans le cadre de la programmation� expression faisant intervenir desnombres� des variables et des op�rations arithm�tiques !par exemple� ���p "� Dansce qui suit� pour simpli�er� nous nous limiterons aux op�rations binaires � et et auxnombres naturels� La g�n�ralisation � des op�rations binaires suppl�mentaires commela division et la soustraction est particuli�rement simple� c�est un peu plus di%cile deconsid�rer aussi des op�rations agissant sur un seul argument comme la racine carr�e�cette g�n�ralisation est laiss�e � titre d�exercice au lecteur� Nous ne consid�rerons aussique les entiers naturels en raison de la confusion qu�il pourrait y avoir entre le symbolede la soustraction et le signe moins�

Sur certaines machines � calculer de poche� les calculs s�e�ectuent en mettant lesymbole d�op�ration apr�s les nombres sur lesquels on e�ectue l�op�ration� On a alorsune notation dite post�x�e� Dans certains langages de programmation� c�est par exemplele cas de Lisp ou de Scheme� on �crit les expressions de fa�on pr��x�e c�est���dire quele symbole d�op�ration pr�c�de cette fois les deux op�randes� on d��nit ces expressionsr�cursivement� Les expressions pr��x�es comprennent�

� des symboles parmi les � suivants� � � �

Page 75: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� EVALUATION DES EXPRESSIONS ARITHM�TIQUES PR�FIX�ES �

� des entiers naturels

Une expression pr��x�e est ou bien un nombre entier naturel ou bien est de l�une desdeux formes�

�� e� e�� �� e� e��

o$ e� et e� sont des expressions pr��x�es�Cette d��nition fait intervenir le nom de l�objet que l�on d��nit dans sa propre

d��nition mais on peut montrer que cela ne pose pas de probl�me logique� En e�et� onpeut comparer cette d��nition � celle des nombres entiers� �tout entier naturel est oubien l�entier � ou bien le successeur d�un entier naturel � On v�ri�e facilement que lessuites de symboles suivantes sont des expressions pr��x�es�

�"

�� � ��

�� �� ��

�� �� � �� �� �� ���

�� �� �� �! ��� �� ! "�� �� �� � �� �� �! �����

Leur �valuation donne respectivement � � � ��� � et ����Pour repr�senter une expression pr��x�e en Java� on utilise ici un tableau dont

chaque �l�ment repr�sente une entit� de l�expression� Ainsi les expressions ci�dessusseront repr�sent�es par des tableaux de tailles respectives �� �� �� ��� ��� Les �l�mentsdu tableau sont des objets � trois champs� le premier indique la nature de l�entit��!symbole ou nombre"� le second champ est rempli par la valeur de l�entit� dans le caso$ celle ci est un nombre� en�n le dernier champ est un caract�re rempli dans les caso$ l�entit� est un symbole�

class Element

boolean estOperateur�

int valeur�

char valsymb�

On utilise les fonctions donn�es ci�dessus pour les piles et on y ajoute les proc�duressuivantes �

static int calculer �char a� int x� int y�

switch �a�

case '�'� return x � y�

case '�'� return x � y�

return ���

La proc�dure d��valuation consiste � empiler les r�sultats interm�diaires� la pile contien�dra des op�rateurs et des nombres� mais jamais deux nombres cons�cutivement� Onexamine successivement les entit�s de l�expression si l�entit� est un op�rateur ou si c�estun nombre et que le sommet de la pile est un op�rateur� alors on empile cette entit�� Enrevanche� si c�est un nombre et qu�en sommet de pile il y a aussi un nombre� on fait agirl�op�rateur qui pr�c�de le sommet de pile sur les deux nombres et on r�p�te l�op�rationsur le r�sultat trouv��

static void inserer �Element x� Pile p�

throws ExceptionPile

Element y� op�

Page 76: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

CHAPITRE �� STRUCTURES DE DONN�ES �L�MENTAIRES

��

��

���

��

� ��

�� ��

���

���

���

���

���

���

���

Fig� ��� � Pile d��valuation de l�expression dont le r�sultat est ����

while �&�Pile�estVide�p� �� x�estOperateur ��

Pile�valeur�p��estOperateur��

y � Pile�valeur�p��

Pile�supprimer�p��

op � Pile�valeur�p��

Pile�supprimer�p��

x�valeur � calculer �op�valsymb� x�valeur� y�valeur��

Pile�ajouter�x�p��

static int evaluer �Element u#$�

throws ExceptionPile

Pile p � new Pile���

for �int i � � i � u�length � ��i�

inserer �u#i$� p��

return Pile�valeur�p��valeur�

Dans ce cas� il peut �tre utile de donner un exemple de programme principal pilotantces diverses fonctions� Remarquer qu�on se sert des arguments sur la ligne de commandepour s�parer les di��rents nombres ou op�rateurs�

public static void main �String args#$�

Element exp#$ � new Element #args�length$�

for �int i � � i � args�length� ��i�

String s � args#i$�

if �s�equals ����� �� s�equals ������

exp#i$ � new Element �true� � s�charAt����

else

exp#i$ � new Element �false� Integer�parseInt�s�� ' '��

try

System�out�println �evaluer �exp���

� catch �ExceptionPile x�

System�err�println ��Pile � � x�nom��

Page 77: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� OP�RATIONS COURANTES SUR LES LISTES

e� e� e� e�

a Tail�a�

Fig� �� � Queue d�une liste

�� Op�rations courantes sur les listes

Nous donnons dans ce paragraphe quelques algorithmes de manipulation de listes�Ceux�ci sont utilis�s dans les langages o$ la liste constitue une structure de base� Lafonction Tail est une primitive classique� elle supprime le premier �l�ment d�une liste

class Liste

Object contenu�

Liste suivant�

Liste �Object x� Liste a�

contenu � x�

suivant � a�

static Liste cons �Object x� Liste a�

return new Liste �x� a��

static Object head �Liste a�

if �a �� null�

erreur ��Head d'une liste vide����

return a�contenu�

static Liste tail �Liste a�

if �a �� null�

erreur ��Tail d'une liste vide����

return a�suivant�

Des proc�dures sur les listes construisent une liste � partir de deux autres� il s�agitde mettre deux listes bout � bout pour en construire une dont la longueur est �gale �la somme des longueurs des deux autres� Dans la premi�re proc�dure append� les deuxlistes ne sont pas modi��es� dans la seconde nConc� la premi�re liste est transform�epour donner le r�sultat� Toutefois� on remarquera que� si append copie son premierargument� il partage la �n de liste de son r�sultat avec son deuxi�me argument�

static Liste append �Liste a� Liste b�

if �a �� null�

return b�

else

return ajouter �a�contenu� append �a�suivant� b�� �

static Liste nConc �Liste a� Liste b�

if �a �� null�

return b�

else

Page 78: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

CHAPITRE �� STRUCTURES DE DONN�ES �L�MENTAIRES

e� e� e�

a

e�� e�� e�� e��

b

e� e� e�

Append�a� b�

Fig� �� � Concat�nation de deux listes par Append

e� e� e�

a

e�� e�� e�� e��

b

Fig� �� � Concat�nation de deux listes par Nconc

Liste c � a�

while �c�suivant &� null�

c � c�suivant�

c�suivant � b�

return a�

Cette derni�re proc�dure peut aussi s��crire r�cursivement�

static Liste nConc �Liste a� Liste b�

if �a �� null�

return b�

else

a�suivant � nConc �a�suivant� c��

return a�

La proc�dure de calcul de l�image miroir d�une liste a consiste � construire une listedans laquelle les �l�ments de a sont rencontr�s dans l�ordre inverse de ceux de a� Lar�alisation de cette proc�dure est un exercice classique de la programmation sur leslistes� On en donne ici deux solutions l�une it�rative� l�autre r�cursive� la complexit� esten O�n�� donc quadratique� mais classique� A nouveau� nReverse modi�e son argument�alors que Reverse ne le modi�e pas et construit une nouvelle liste pour son r�sultat�

static Liste nReverse �Liste a�

Liste b � null�

while �a &� null�

Liste c � a�suivant�

a�suivant � b�

b � a�

a � c�

Page 79: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� OP�RATIONS COURANTES SUR LES LISTES �

return b�

static Liste reverse �Liste a�

if �a �� null�

return a�

else

return append �reverse �a�suivant��

ajouter �a�contenu� null���

On peut aussi avoir une version lin�aire de la version r�cursive� gr(ce � une fonctionauxiliaire accumulant le r�sultat dans un de ses arguments�

static Liste nReverse �Liste a�

return nReverse� �null� a��

static Liste nReverse� �Liste b� Liste a�

if �a �� null�

return b�

else

return nReverse� �ajouter �a�contenu� b�� a�suivant��

Un autre exercice formateur consiste � g�rer des listes dans lesquelles les �l�mentssont rang�s en ordre croissant� La proc�dure d�ajout devient plus complexe puisqu�ondoit retrouver la position de la cellule o$ il faut ajouter apr�s avoir parcouru une partiede la liste�

Nous ne traiterons cet exercice que dans le cas des listes circulaires gard�es� voirpage � Dans une telle liste� la valeur du champ contenu de la premi�re cellule n�aaucune importance� On peut y mettre le nombre d��l�ments de la liste si l�on veut� Lechamp suivant de la derni�re cellule contient lui l�adresse de la premi�re�

static Liste inserer �int v� Liste a�

Liste b � a�

while �b�suivant &� a %% v head�b�suivant��

b � b�suivant�

b�suivant � ajouter �v� b�suivant��

a�contenu � head�a� � ��

return a�

e� e� e�

b

e� e� e� e

c

a

Fig� ��� � Transformation d�une liste au cours de nReverse

Page 80: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� STRUCTURES DE DONN�ES �L�MENTAIRES

e� e� e� e�

a

Fig� ���� � Liste circulaire gard�e

��� Programmes en Caml

�� Dclaration des listes� voir page � ��

type element �� int��

type liste � Nil � Cons of cellule

and cellule �

mutable contenu � element�

mutable suivant � liste ���

Remarque� en Caml� les listes sont pr�d��nies� et la majorit� des fonctions suivantespr�existent� Nous nous amusons donc � les red��nir� Toutefois� nos nouvelles listes sontmodi�ables�

�� Liste vide� voir page � ��

let estVide a �

a � Nil��

�� Ajouter� voir page � ��

let ajouter x a �

Cons contenu � x� suivant � a���

�� Recherche� voir page �� ��

let recherche x a �

let l � ref a in

let result � ref false in

while &l � Nil do

match &l with

� Cons contenu � y� suivant � s� �

if x � y then result �� true

else l �� s

� � � ��

done�

&result��

�� Recherche rcursive� voir page �� ��

let recherche x a �

match a with

Nil � false

� Cons contenu � y� suivant � s� �

if x � y then true

else recherche x s��

Page 81: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� PROGRAMMES EN CAML �

let recherche x a �

match a with

Nil � false

� Cons contenu � y� suivant � s� �

x � y �� recherche x s��

�� Longueur dune liste� voir page �� ��

let rec longueur � function

Nil �

� Cons suivant � reste� �� �

� � longueur reste��

�� Longueur dune liste� voir page �� ��

let longueur a �

let r � ref

and accu � ref a in

while &accu � Nil do

incr r�

match &l with

� Cons suivant � reste� �� �

accu �� reste

� � � ��

done�

&r��

�� Supprimer� voir page �� ��

let rec supprimer x a �

match a with

Nil � a

� Cons � contenu � c� suivant � s� as cellule� �

if c � x then s

else begin

cellule�suivant �� supprimer x s�

a

end��

let rec supprimer x a �

match a with

Nil � Nil

� Cons contenu � c� suivant � s� �

if c � x then s

else Cons contenu � c� suivant � s���

�� Liste des nombres premiers� voir page �� ��

let liste�premier n �

let a � ref Nil in

for i � n downto � do ajouter i a done�

Page 82: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� STRUCTURES DE DONN�ES �L�MENTAIRES

let k � ref � in

let b � ref &a in

while &k � &k �� n do

match &b with

Nil � failwith �liste�premier�

� Cons contenu � c� suivant � s� �

k �� c�

for j � c to n � c do

supprimer �j � &k� a done�

b �� s

done�

a��

�� Les �les avec des vecteurs� voir page �� ��

let maxF � ���

type 'a file �

mutable debut� int�

mutable fin� int�

mutable pleine� bool�

mutable vide� bool�

contenu� 'a vect ���

let vide �� � debut � � fin � �

pleine � false� vide � true�

contenu � make�vect maxF ���

let faireVide f � begin

f�debut � � f�fin � �

f�pleine � false� f�vide � true�

end��

let estVide f � f�vide��

let estPleine f � f�pleine��

let valeur f � begin

if f�vide then failwith �Pile vide���

f�contenu��f�debut�

end��

let successeur x � �x � �� mod maxF ��

let ajouter x f � begin

if f�pleine then failwith �Pile pleine���

f�contenu��f�fin� �� x�

f�fin �� successeur �f�fin��

f�vide �� false�

f�pleine �� f�fin � f�debut�

end��

let supprimer f � begin

if f�vide then failwith �File vide���

f�debut �� successeur �f�debut��

f�vide �� f�fin � f�debut�

f�pleine �� false�

end��

Page 83: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� PROGRAMMES EN CAML �

�� Les �les avec des listes� voir page �� ��

type 'a liste � Nil � Cons of 'a cellule

and 'a cellule �

contenu� 'a� mutable suivant� 'a liste���

type 'a file �

mutable debut� 'a cellule�

mutable fin� 'a cellule ���

let vide �� �

let b � contenu � � suivant � Nil� in

debut � b� fin � b���

let faireVide f �

let b � contenu � � suivant � Nil� in

f�debut �� b� f�fin �� b��

let estVide f � f�fin �� f�debut��

let valeur f �

match f�debut�suivant with

Nil � failwith �Pile vide�

� Cons cell � cell�contenu��

let ajouter x f �

let b � contenu � x� suivant � Nil� in

f�fin�suivant �� Cons b�

f�fin �� b��

let supprimer f �

match f�debut�suivant with

Nil � ��

� Cons cell � f�debut �� cell��

�� Dclarations et oprations sur les piles� voir page �� ��

exception ExceptionPile of string��

let maxP � ���

type 'a pile �

mutable hauteur� int�

mutable contenu� 'a vect���

let vide �� �

hauteur � � contenu � make�vect maxP ���

let faireVide p � p�hauteur �� ��

let estVide p � p�hauteur � ��

let estPleine p � p�hauteur � maxP��

let ajouter x p �

if estPleine p then

raise �ExceptionPile �pleine���

p�contenu��p�hauteur� �� x�

p�hauteur �� p�hauteur � ���

Page 84: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� STRUCTURES DE DONN�ES �L�MENTAIRES

let pvaleur p �

if estVide p then

raise �ExceptionPile �vide���

p�contenu��p�hauteur � ����

let psupprimer p �

if estVide p then

raise �ExceptionPile �vide���

p�hauteur �� p�hauteur � ���

�� Oprations sur les piles� version plus traditionelle ��

type 'a pile �� 'a list ref��

let vide �� � ref #$��

let faireVide �p� � p �� #$��

let estVide p � �&p � #$���

let ajouter x p � p �� x �� &p��

let valeur p � match &p with

#$ � failwith �Pile Vide��

� x �� p' � x��

let supprimer p � p �� match &p with

#$ � failwith �Pile Vide��

� x �� p' � p'��

�� Evaluation des expressions pr(fix(es�

voir page �� ��

type expression �� element vect

and element �

Symbole of char

� Nombre of int��

let calculer a x y �

match a with

)�) � x � y

� )�) � x � y

� � � failwith �unknown operator���

let rec inserer x p �

match x with

Symbole c � ajouter x p

� Nombre n �

if pvide p then ajouter x p else

match valeur p with

Symbole c as y � ajouter x p

� Nombre m �

supprimer p�

match valeur p with

Symbole c �

supprimer p�

Page 85: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� PROGRAMMES EN CAML �

let res � Nombre �calculer c n m� in

inserer res p

� � � failwith �pile mal construite���

let evaluer u �

let p �

hauteur � �

contenu � make�vect � �Nombre �� in

for i � to vect�length u � � do

inserer u��i� p

done�

match valeur p with

Symbole c � failwith �pile mal construite�

� Nombre n � n��

let pile�of�string s �

let u � make�vect �string�length s� �Symbole ) )� in

let l � ref in

for i � to string�length s � � do

let element �

match s�#i$ with

)) �� )�) as c �

let n �

int�of�char c � int�of�char )) in

begin match u��&l� with

Symbole c � Nombre n

� Nombre m �

decr l� Nombre �� � m � n�

end

� c � Symbole c in

incr l�

u��&l� �� element

done�

sub�vect u &l��

evaluer

�pile�of�string

��� �� � �� � ��� �� �� � �� �� � ��������

� � int � ����

�� Tail et cons� voir page �� ��

let tail a �

match a with

Nil � failwith �tail�

� Cons cell � cell�contenu��

let cons x l �

Cons contenu � x� suivant � l���

�� Append et nconc� voir page �� ��

let rec append a b �

match a with

Nil � b

Page 86: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

CHAPITRE �� STRUCTURES DE DONN�ES �L�MENTAIRES

� Cons cell �

cons �cell�contenu�

�append cell�suivant b���

let nconc ap b �

match &ap with

Nil � ap �� b

� � �

let c � ref &ap in

while

match &c with

Cons suivant � �Cons cell as l�� �� �

c �� l� true

� � � false

do �� done�

match &c with

Cons cell � cell�suivant �� b

� � � ����

�� Version plus conforme au style Caml� avec une fonction rcursive locale� on faitlopration physique sur la liste ��

let rec nconc a b �

let rec nconc� c �

match c with

Nil � b

� Cons � suivant � Nil� �� as cell� �

cell�suivant �� b� a

� Cons suivant � l� �� � nconc� l in

nconc�aux a��

�� Nreverse et reverse� voir page �� ��

let nreverse ap �

let a � ref &ap in

let b � ref Nil in

let c � ref Nil in

while

match &a with

� Nil � false

� Cons � suivant � s� �� as cell� �

c �� s�

cell�suivant �� &b�

b �� &a�

a �� &c�

true

do �� done�

ap �� &b��

�� Version plus conforme � Caml� on renverse la liste en place et lon rend la nouvellet�te de liste ��

let nreverse l �

let rec nreverse� a b �

match a with

Page 87: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� PROGRAMMES EN CAML

� Nil � b

� Cons � suivant � s� �� as cell� �

cell�suivant �� b�

nreverse� s a in

nreverse�aux l Nil��

let rec reverse a �

match a with

� Nil � a

� Cons cell �

append �reverse cell�suivant�

�cons �cell�contenu� Nil���

�� Insert� voir page �� ��

let insert v l �

match l with

Nil � failwith �insert�

� Cons c �

let rec insert�aux a �

match a with

� Nil � failwith �insert�

� Cons cell �

if v cell�contenu %% cell &� c

then insert�aux cell�suivant

else cell�suivant ��

cons v cell�suivant in

insert�aux c�suivant�

c�contenu �� l�contenu � ���

Page 88: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

CHAPITRE �� STRUCTURES DE DONN�ES �L�MENTAIRES

Page 89: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

Chapitre �

Arbres

Nous avons d�j� vu la notion de fonction r�cursive dans le chapitre �� Consid�rons� pr�sent son �quivalent dans les structures de donn�es� la notion d�arbre� Un arbreest soit un arbre atomique !une feuille"� soit un noeud et une suite de sous�arbres�Graphiquement� un arbre est repr�sent� comme suit

n�

n�

n�

n�

n� n�

n

n

n� n�� n��

Fig� ��� � Un exemple d�arbre

Le noeud n� est la racine de l�arbre� n�� n�� n� n�� n��� n�� sont les feuilles� n�� n�� n��n�� n les noeuds internes� Plus g�n�ralement� l�ensemble des noeuds est constitu� desnoeuds internes et des feuilles� Contrairement � la botanique� on dessine les arbres avecla racine en haut et les feuilles vers le bas en informatique� Il y a bien des d��nitionsplus math�matiques des arbres� que nous �viterons ici� Si une branche relie un noeud ni� un noeud nj plus bas� on dira que ni est un anc�tre de nj� Une propri�t� fondamentaled�un arbre est qu�un noeud n�a qu�un seul p�re� En�n� un noeud peut contenir une ouplusieurs valeurs� et on parlera alors d�arbres �tiquet�s et de la valeur !ou des valeurs"d�un noeud� Les arbres binaires sont des arbres tels que les noeuds ont au plus � �ls� Lahauteur� on dit aussi la profondeur d�un noeud est la longueur du chemin qui le joint �la racine� ainsi la racine est elle m�me de hauteur �� ses �ls de hauteur � et les autresnoeuds de hauteur sup�rieure � ��

Un exemple d�arbre tr�s utilis� en informatique est la repr�sentation des expressionsarithm�tiques et plus g�n�ralement des termes dans la programmation symbolique� Nous

Page 90: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE � ARBRES

� �

� �

�� ��

� �

Fig� ��� � Repr�sentation d�une expression arithm�tique par un arbre

traiterons ce cas dans le chapitre sur l�analyse syntaxique� et nous nous restreindronspour l�instant au cas des arbres de recherche ou des arbres de tri� Toutefois� pour montrerl�aspect fondamental de la structure d�arbre� on peut tout de suite voir que les expres�sions arithm�tiques calcul�es dans la section ��� se repr�sentent simplement par desarbres comme dans la �gure ��� pour �� �� � �� � � �� �� � � �� � ��Cette repr�sentation contient l�essence de la structure d�expression arithm�tique et faitdonc abstraction de toute notation pr��x�e ou post�x�e�

�� Files de priorit�

Un premier exemple de structure arborescente est la structure de tas !heap �"utilis�epour repr�senter des �les de priorit�� Donnons d�abord une vision intuitive d�une �le depriorit��

On suppose� comme au paragraphe ���� que des gens se pr�sentent au guichet d�unebanque avec un num�ro �crit sur un bout de papier repr�sentant leur degr� de priorit��Plus ce nombre est �lev�� plus ils sont importants et doivent passer rapidement� Bien s#r�il n�y a qu�un seul guichet ouvert� et l�employ�!e" de la banque doit traiter rapidementtous ses clients pour que tout le monde garde le sourire� La �le des personnes en attentes�appelle une �le de priorit�� L�employ� de banque doit donc savoir faire rapidement les �op�rations suivantes� trouver un maximum dans la �le de priorit�� retirer cet �l�ment dela �le� savoir ajouter un nouvel �l�ment � la �le� Plusieurs solutions sont envisageables�

La premi�re consiste � mettre la �le dans un tableau et � trier la �le de priorit�dans l�ordre croissant des priorit�s� Trouver un maximum et le retirer de la �le est alorssimple� il su%t de prendre l��l�ment de droite� et de d�placer vers la gauche la bornedroite de la �le� Mais l�insertion consiste � faire une passe du tri par insertion pourmettre le nouvel �l�ment � sa place� ce qui peut prendre un temps O�n� o$ n est lalongueur de la �le�

Une autre m�thode consiste � g�rer la �le comme une simple �le du chapitre pr�c��dent� et � rechercher le maximum � chaque fois� L�insertion est rapide� mais la recherchedu maximum peut prendre un temps O�n�� de m�me que la suppression�

Une m�thode �l�gante consiste � g�rer une structure d�ordre partiel gr(ce � un arbre�La �le de n �l�ments est repr�sent�e par un arbre binaire contenant en chaque noeudun �l�ment de la �le !comme illustr� dans la �gure ���"� L�arbre v�ri�e deux propri�t�s

�� Le mot heap a malheureusement un autre sens en Pascal� c�est l�espace dans lequel sont allou�esles variables dynamiques r�f�renc�es par un pointeur apr�s l�instruction new� Il sera bien clair d�apr�s lecontexte si nous parlons de tas au sens des les de priorit� ou du tas de Pascal pour allouer les variablesdynamiques�

Page 91: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� FILES DE PRIORIT� ��

��

��

��

��

Fig� ��� � Repr�sentation en arbre d�un tas

a i�

i

��

���

���

���

��

��

Fig� ��� � Repr�sentation en tableau d�un tas

importantes� d�une part la valeur de chaque noeud est sup�rieure ou �gale � celle de ses�ls� d�autre part l�arbre est quasi complet� propri�t� que nous allons d�crire bri�vement�Si l�on divise l�ensemble des noeuds en lignes suivant leur hauteur� on obtient en g�n�raldans un arbre binaire une ligne � compos�e simplement de la racine� puis une ligne �contenant au plus deux noeuds� et ainsi de suite !la ligne i contenant au plus �i noeuds"�Dans un arbre quasi complet les lignes� except�e peut �tre la derni�re� contiennenttoutes un nombre maximal de noeuds !soit �i"� De plus les feuilles de la derni�re lignese trouvent toutes � gauche� ainsi tous les noeuds internes sont binaires� except� le plus� droite de l�avant derni�re ligne qui peut ne pas avoir de �ls droit� Les feuilles sonttoutes sur la derni�re et �ventuellement l�avant derni�re ligne�

On peut num�roter cet arbre en largeur d�abord� c�est � dire dans l�ordre donn� parles petits num�ros �gurant au dessus de la �gure ���� Dans cette num�rotation on v�ri�eque tout noeud i a son p�re en position bi��c� le �ls gauche du noeud i est �i� le �lsdroit �i� �� Formellement� on peut dire qu�un tas est un tableau a contenant n entiers!ou des �l�ments d�un ensemble totalement ordonn�" satisfaisant les conditions�

� � �i � n � a �i� � a i� � �i� � � n � a �i � �� � a i�

Ceci permet d�impl�menter cet arbre dans un tableau a !voir �gure ���" o$ le num�rode chaque noeud donne l�indice de l��l�ment du tableau contenant sa valeur�

L�ajout d�un nouvel �l�ment v � la �le consiste � incr�menter n puis � poser a n� � v�Ceci ne repr�sente plus un tas car la relation a n��� � v n�est pas n�cessairementsatisfaite� Pour obtenir un tas� il faut �changer la valeur contenue au noeud n et cellecontenue par son p�re� remonter au p�re et r�it�rer jusqu�� ce que la condition des tassoit v�ri��e� Ceci se programme par une simple it�ration !cf� la �gure ���"�

static void ajouter �int v�

��nTas�

int i � nTas � ��

Page 92: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE � ARBRES

while �i %% a #�i � ����$ �� v�

a#i$ � a#�i � ����$�

i � �i � �����

a#i$ � v�

On v�ri�e que� si le tas a n �l�ments� le nombre d�op�rations n�exc�dera pas la hauteurde l�arbre correspondant� Or la hauteur d�un arbre binaire complet de n noeuds estlog n� Donc Ajouter ne prend pas plus de O�log n� op�rations�

On peut remarquer que l�op�ration de recherche du maximum est maintenant imm��diate dans les tas� Elle prend un temps constant O����

static int maximum ��

return a#$�

Consid�rons l�op�ration de suppression du premier �l�ment de la �le� Il faut alorsretirer la racine de l�arbre repr�sentant la �le� ce qui donne deux arbres' Le plus simplepour reformer un seul arbre est d�appliquer l�algorithme suivant� on met l��l�ment leplus � droite de la derni�re ligne � la place de la racine� on compare sa valeur avec cellede ses �ls� on �change cette valeur avec celle du vainqueur de ce tournoi� et on r�it�recette op�ration jusqu�� ce que la condition des tas soit v�ri��e� Bien s#r� il faut faireattention� quand un noeud n�a qu�un �ls� et ne faire alors qu�un petit tournoi � deux�Le placement de la racine en bonne position est illustr� dans la �gure ���

static void supprimer ��

int i� j�

int v�

a#$ � a#nTas � �$�

��nTas�

i � � v � a#$�

while ���i � � � nTas�

j � ��i � ��

if �j � � � nTas�

if �a#j � �$ a#j$�

��j�

if �v � a#j$�

break�

a#i$ � a#j$� i � j�

a#i$ � v�

A nouveau� la suppression du premier �l�ment de la �le ne prend pas un temps sup��rieur � la hauteur de l�arbre repr�sentant la �le� Donc� pour une �le de n �l�ments� lasuppression prend O�logn� op�rations� La repr�sentation des �les de priorit�s par destas permet donc de faire les trois op�rations demand�es� ajout� retrait� chercher le plusgrand en log n op�rations� Ces op�rations sur les tas permettent de faire le tri HeapSort�Ce tri peut �tre consid�r� comme alambiqu�� mais il a la bonne propri�t� d��tre toujoursen temps n log n !comme le Tri fusion� cf page � "�

HeapSort se divise en deux phases� la premi�re consiste � construire un tas dansle tableau � trier� la seconde � r�p�ter l�op�ration de prendre l��l�ment maximal� leretirer du tas en le mettant � droite du tableau� Il reste � comprendre comment on peut

Page 93: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� FILES DE PRIORIT� ��

��

��

��

��

��

��

��

��

��

��

��

��

��

��

��

��

��

��

��

��

��

��

Fig� ��� � Ajout dans un tas

��

��

��

��

��

��

��

��

��

��

��

��

��

��

��

��

��

��

��

��

��

Fig� �� � Suppression dans un tas

Page 94: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE � ARBRES

construire un tas � partir d� un tableau quelconque� Il y a une m�thode peu e%cace�mais syst�matique� On remarque d�abord que l��l�ment de gauche du tableau est � luiseul un tas� Puis on ajoute � ce tas le deuxi�me �l�ment avec la proc�dure Ajouterque nous venons de voir� puis le troisi�me� � � � � A la �n� on obtient bien un tas de N�l�ments dans le tableau a � trier� Le programme est

static void heapSort ��

int i�

int v�

nTas � �

for �i � � i � N� ��i�

ajouter �a#i$��

for �i � N � �� i � � ��i�

v � maximum���

supprimer���

a#i$ � v�

Si on fait un d�compte grossier des op�rations� on remarque qu�on ne fait pas plus deN logN op�rations pour construire le tas� puisqu�il y a N appels � la proc�dure Ajouter�Une m�thode plus e%cace� que nous ne d�crirons pas ici� qui peut �tre trait�e � titred�exercice� permet de construire le tas en O�N� op�rations� De m�me� dans la deuxi�mephase� on ne fait pas plus de N logN op�rations pour d�faire les tas� puisqu�on appelleN fois la proc�dure Supprimer� Au total� on fait O�N logN� op�rations quelle quesoit la distribution initiale du tableau a� comme dans le tri fusion� On peut n�anmoinsremarquer que la constante qui se trouve devant N logN est grande� car on appelle desproc�dures relativement complexes pour faire et d�faire les tas� Ce tri a donc un int�r�tth�orique� mais il est en pratique bien moins bon que Quicksort ou le tri Shell�

�� Borne inf�rieure sur le tri

Il a �t� beaucoup question du tri� On peut se demander s�il est possible de trier untableau de N �l�ments en moins de N logN op�rations� Un r�sultat ancien de la th�oriede l�information montre que c�est impossible si on n�utilise que des comparaisons�

En e�et� il faut pr�ciser le mod�le de calcul que l�on consid�re� On peut repr�sentertous les tris que nous avons rencontr�s par des arbres de d�cision� La �gure �� repr�senteun tel arbre pour le tri par insertion sur un tableau de � �l�ments� Chaque noeud internepose une question sur la comparaison entre � �l�ments� Le �ls de gauche correspond �la r�ponse n�gative� le �ls droit � l�a%rmatif� Les feuilles repr�sentent la permutation �e�ectuer pour obtenir le tableau tri��

Th�or�me � Le tri de N �l�ments� fond� uniquement sur les comparaisons des �l��ments deux � deux� fait au moins O�N logN� comparaisons�

D�monstration Tout arbre de d�cision pour trier N �l�ments a N � feuilles repr�sen�tant toutes les permutations possibles� Un arbre binaire de N � feuilles a une hauteur del�ordre de logN � � N logN par la formule de Stirling� �

Corollaire � HeapSort et le tri fusion sont optimaux asymptotiquement��

Page 95: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� IMPL�MENTATION D UN ARBRE ��

a� � a�

a� � a�

!�����" a� � a�

!�����" !�����"

a� � a�

!�����" a� � a�

!�����" !�����"

Fig� �� � Exemple d�arbre de d�cision pour le tri

En e�et� ils accomplissent le nombre de comparaisons donn� comme borne inf�rieuredans le th�or�me pr�c�dent� Mais� nous r�p�tons qu�un tri comme Quicksort est aussitr�s bon en moyenne� Le mod�le de calcul par comparaisons donne une borne inf�rieure�mais peut�on faire mieux dans un autre mod�le- La r�ponse est oui� si on disposed�informations annexes comme les valeurs possibles des �l�ments ai � trier� Par exemple�si les valeurs sont comprises dans l�intervalle �� k�� on peut alors prendre un tableau bannexe de k �l�ments qui contiendra en bj le nombre de ai ayant la valeur j� En unepasse sur a� on peut remplir le tableau k� puis g�n�rer le tableau a tri� en une deuxi�mepasse en ne tenant compte que de l�information rang�e dans b� Ce tri prend O�k� �N�op�rations� ce qui est tr�s bon si k est petit�

�� Impl�mentation d�un arbre

Jusqu�� pr�sent� les arbres sont apparus comme des entit�s abstraites ou n�ont �t�impl�ment�s que par des tableaux en utilisant une propri�t� bien particuli�re des arbrescomplets� On peut bien s#r manipuler les arbres comme les listes avec des enregistre�ments et des pointeurs� Tout noeud sera repr�sent� par un enregistrement contenantune valeur et des pointeurs vers ses �ls� Une feuille ne contient qu�une valeur� On peutdonc utiliser des enregistrements avec variante pour signaler si le noeud est interneou une feuille� Pour les arbres binaires� les deux �ls seront repr�sent�s par les champsfilsG filsD et il sera plus simple de supposer qu�une feuille est un noeud dont les �lsgauche et droit ont une valeur vide�

class Arbre

int contenu�

Arbre filsG�

Arbre filsD�

Arbre �int v� Arbre a� Arbre b�

contenu � v�

filsG � a�

filsD � b�

Pour les arbres quelconques� on peut gagner plus d�espace m�moire en consid�rant desenregistrements variables� Toutefois� en Pascal� il y a une di%cult� de typage � consid�rer

Page 96: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE � ARBRES

des noeuds n�aires !ayant n �ls"� On doit consid�rer des types di��rents pour les noeudsbinaires� ternaires� � � � ou un gigantesque enregistrement avec variante� Deux solutionssyst�matiques sont aussi possibles� la premi�re consiste � consid�rer le cas n maximum!comme pour les arbres binaires"

class Arbre

int contenu�

Arbre#$ fils�

Arbre �int v� int n�

contenu � v�

fils � new Arbre#n$�

la deuxi�me consiste � encha�ner les �ls dans une liste

class Arbre

int contenu�

ListeArbres fils�

class ListeArbres

Arbre contenu�

ListeArbres suivant�

Avec les tailles m�moire des ordinateurs actuels� on se contente souvent de la pre�mi�re solution� Mais� si les contraintes de m�moire sont fortes� il faut se rabattre sur ladeuxi�me� Dans une bonne partie de la suite� il ne sera question que d�arbres binaires�et nous choisirons donc la premi�re repr�sentation avec les champs filsG et filsD�

Consid�rons � pr�sent la construction d�un nouvel arbre binaire c � partir de deuxarbres a et b� Un noeud sera ajout� � la racine de l�arbre et les arbres a et b seront les�ls gauche et droit respectivement de cette racine� La fonction correspondante prend lavaleur du nouveau noeud� les �ls gauche et droit du nouveau noeud� Le r�sultat seraun pointeur vers ce noeud nouveau� Voici donc comment cr�er l�arbre de gauche de la�gure ���

class Arbre

int contenu�

Arbre filsG�

Arbre filsD�

Arbre �int v� Arbre a� Arbre b�

contenu � v�

filsG � a�

filsD � b�

public static void main�String args#$�

Arbre a!� a"�

a! � new Arbre ���� new Arbre ��� new Arbre ��� null� null�� null��

new Arbre ���� null� null���

a" � new Arbre ��� new Arbre ��� new Arbre ��� null� null�� a!��

new Arbre ��!� new Arbre ���� null� null��

Page 97: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� IMPL�MENTATION D UN ARBRE �

new Arbre ���� null� null����

imprimer �a"��

Une fois un arbre cr��� il est souhaitable de pouvoir l�imprimer� Plusieurs m�thodes sontpossibles� La plus �l�gante utilise les fonctions graphiques du Macintosh drawString�moveTo� lineTo� Une autre consiste � utiliser une notation lin�aire avec des parenth�ses�C�est la notation in�xe utilis�e couramment si les noeuds internes sont des op�rateursd�expressions arithm�tique� L�arbre pr�c�dent s��crit alors

��� � ��� � nil� �� ���� � ��� �! ����

Utilisons une m�thode plus rustique en imprimant en alphanum�rique sur plusieurslignes� Ainsi� en penchant un peu la t�te vers la gauche� on peut imprimer l�arbrepr�c�dent comme suit

� �! ��

��

� �� ��

La proc�dure d�impression prend comme argument l�arbre � imprimer et la tabulation� faire avant l�impression� c�est � dire le nombre d�espaces� On remarquera que toute ladi%cult� de la proc�dure est de bien situer l�endroit o$ on e�ectue un retour � la ligne�Le reste est un simple parcours r�cursif de l�arbre en se plongeant d�abord dans l�arbrede droite�

static void imprimer �Arbre a�

imprimer �a� ��

System�out�println ���

static void imprimer� �Arbre a� int tab�

if �a &� null�

System�out�print �leftAligned ��� a�contenu � ��� � � ���

imprimer� �a�filsD� tab � ���

if �a�filsG &� null�

System�out�println ���

for �int i � �� i �� tab� ��i�

System�out�print �� ���

imprimer� �a�filsG� tab��

static String leftAligned �int size� String s�

StringBuffer t � new StringBuffer �s��

for �int i � s�length��� i � size� ��i�

t � t�append�� ���

return new String �t��

Nous avons donc vu comment repr�senter un arbre dans un programme� comment leconstruire� et comment l�imprimer� Cette derni�re op�ration est typique� pour explorerune structure de donn�e r�cursive !les arbres"� il est naturel d�utiliser des proc�dures

Page 98: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE � ARBRES

r�cursives� C�est � nouveau une mani�re non seulement naturelle� mais aussi tr�s e%cacedans le cas pr�sent�

Comme pour les listes !cf� page �"� la structure r�cursive des programmes manipu�lant des arbres d�coule de la d��nition des arbres� puisque le type des arbres binairesv�ri�e l��quation�

Arbre � fArbre�videg � Arbre � Element � Arbre

Comme pour l�impression� on peut calculer le nombre de noeuds d�un arbre en suivantla d��nition r�cursive du type des arbres�

static int taille �Arbre a�

if �a �� null� �� a � Arbre�vide ��

return �

else �� a � Arbre� Element� Arbre ��

return � � taille �a�filsG� � taille �a�filsD��

L��criture it�rative dans le cas des arbres est en g�n�ral impossible sans utiliser une pile�On v�ri�e que� pour les arbres binaires qui ne contiennent pas de noeuds unaires� la taillet� le nombre de feuilles Nf et le nombre de noeuds internes Nn v�ri�ent t � Nn � Nf

et Nn � � �Nf �

� Arbres de recherche

La recherche en table et le tri peuvent �tre aussi trait�s avec des arbres� Nousl�avons vu implicitement dans le cas de Quicksort� En e�et� si on dessine les partitionssuccessives obtenues par les appels r�cursifs de Quicksort� on obtient un arbre� Onintroduit pour les algorithmes de recherche d�un �l�ment dans un ensemble ordonn�la notion d�arbre binaire de recherche celui�ci aura la propri�t� fondamentale suivante�tous les noeuds du sous�arbre gauche d�un noeud ont une valeur inf�rieure !ou �gale" �la sienne et tous les noeuds du sous�arbre droit ont une valeur sup�rieure !ou �gale" �la valeur du noeud lui�m�me !comme dans la �gure ��"� Pour la recherche en table� lesarbres de recherche ont un int�r�t quand la table �volue tr�s rapidement� quoique lesm�thodes avec hachage sont souvent aussi bonnes� mais peuvent exiger des contraintesde m�moire impossibles � satisfaire� !En e�et� il faut conna�tre la taille maximale apriori d�une table de hachage"� Nous allons voir que le temps d�insertion d�un nouvel�l�ment dans un arbre de recherche prend un temps comparable au temps de recherchesi cet arbre est bien agenc�� Pour le moment� �crivons les proc�dures �l�mentaires derecherche et d�ajout d�un �l�ment�

static Arbre recherche �int v� Arbre a�

if �a �� null �� v �� a�contenu�

return a�

else if �v � a�contenu�

return recherche �v� a�filsG��

else

return recherche �v� a�filsD��

static Arbre ajouter �int v� Arbre a�

if �a �� null�

a � new Arbre �v� null� null��

Page 99: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ARBRES DE RECHERCHE ��

��

��

��

��

��

��

� ��

��

��

��

��

��

��

Fig� �� � Ajout dans un arbre de recherche

else if �v �� a�contenu�

a�filsG � ajouter �v� a�filsG��

else

a�filsD � ajouter �v� a�filsD��

return a�

A nouveau� des programmes r�cursifs correspondent � la structure r�cursive des arbres�La proc�dure de recherche renvoie un pointeur vers le noeud contenant la valeur recher�ch�e� null si �chec� Il n�y a pas ici d�information associ�e � la cl� recherch�e comme auchapitre �� On peut bien s#r associer une information � la cl� recherch�e en ajoutantun champ dans l�enregistrement d�crivant chaque noeud� Dans le cas du bottin de t�l��phone� le champ contenu contiendrait les noms et serait du type String� l�informationserait le num�ro de t�l�phone�

La recherche teste d�abord si le contenu de la racine est �gal � la valeur recherch�e�sinon on recommence r�cursivement la recherche dans l�arbre de gauche si la valeur estplus petite que le contenu de la racine� ou dans l�arbre de droite dans le cas contraire�La proc�dure d�insertion d�une nouvelle valeur suit le m�me sch�ma� Toutefois dans lecas de l��galit� des valeurs� nous la rangeons ici par convention dans le sous arbre degauche� La proc�dure ajouter modi�e l�arbre de recherche� Si nous ne voulons pas lemodi�er� nous pouvons adopter comme dans le cas des listes la proc�dure suivante� quiconsomme l�g�rement plus de place� laquelle place peut �tre r�cup�r�e tr�s rapidementpar le glaneur de cellules�

static Arbre ajouter �int v� Arbre a�

if �a �� null�

return new Arbre �v� null� null��

else if �v �� a�contenu�

return new Arbre �v� ajouter �v� a�filsG�� a�filsD��

else

return new Arbre �v� a�filsG� ajouter �v� a�filsG���

Le nombre d�op�rations de la recherche ou de l�insertion d�pend de la hauteur del�arbre� Si l�arbre est bien �quilibr�� pour un arbre de recherche contenant N noeuds� one�ectuera O�logN� op�rations pour chacune des proc�dures� Si l�arbre est un peigne�c�est � dire compl�tement �liforme � gauche ou � droite� la hauteur vaudra N et lenombre d�op�rations sera O�N� pour la recherche et l�ajout� Il appara�t donc souhaitable

Page 100: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� CHAPITRE � ARBRES

d��quilibrer les arbres au fur et � mesure de l�ajout de nouveaux �l�ments� ce que nousallons voir dans la section suivante�

En�n� l�ordre dans lequel sont rang�s les noeuds dans un arbre de recherche estappel� ordre in�xe� Il correspond au petit num�ro qui se trouve au dessus de chaquenoeud dans la �gure ��� Nous avons d�j� vu dans le cas de l��valuation des expressionsarithm�tiques !cf page �" l�ordre pr��xe� dans lequel tout noeud re�oit un num�rod�ordre inf�rieur � celui de tous les noeuds de son sous�arbre de gauche� qui eux�m�mesont des num�ros inf�rieurs aux noeuds du sous�arbre de droite� Finalement� on peutconsid�rer l�ordre post�xe qui ordonne d�abord le sous�arbre de gauche� puis le sous�arbrede droite� et en�n le noeud� C�est un bon exercice d��crire un programme d�impressioncorrespondant � chacun de ces ordres� et de comparer l�emplacement des di��rentsappels r�cursifs�

� Arbres �quilibr�s

La notion d�arbre �quilibr� a �t� introduite en ��� par deux russes Adel�son�Vel�skiiet Landis� et depuis ces arbres sont connus sous le nom d�arbres AVL� Il y a maintenantbeaucoup de variantes plus ou moins faciles � manipuler� Au risque de para�tre classiqueset vieillots� nous parlerons principalement des arbres AVL� Un arbre AVL v�ri�e lapropri�t� fondamentale suivante� la di��rence entre les hauteurs des �ls gauche et des�ls droit de tout noeud ne peut exc�der �� Ainsi l�arbre de gauche de la �gure �� n�estpas �quilibr�� Il viole la propri�t� aux noeuds num�rot�s � et � tous les autres noeudsvalidant la propri�t�� Les arbres repr�sentant des tas� voir �gure ��� sont trivialement�quilibr�s�

On peut montrer que la hauteur d�un arbre AVL de N noeuds est de l�ordre delogN � ainsi les temps mis par la proc�dure Recherche vue page � seront en O�logN��

Il faut donc maintenir l��quilibre de tous les noeuds au fur et � mesure des op�rationsd�insertion ou de suppression d�un noeud dans un arbre AVL� Pour y arriver� on supposeque tout noeud contient un champ annexe bal contenant la di��rence de hauteur entrele �ls droit et le �ls gauche� Ce champ repr�sente donc la balance ou l��quilibre entreles hauteurs des �ls du noeud� et on s�arrange donc pour maintenir �� � a�bal � �pour tout noeud point� par a�

L�insertion se fait comme dans un arbre de recherche standard� sauf qu�il faut main�tenir l��quilibre� Pour cela� il est commode que la fonction d�insertion retourne unevaleur repr�sentant la di��rence entre la nouvelle hauteur !apr�s l�insertion" et l�an�cienne hauteur !avant l�insertion"� Quand il peut y avoir un d�s�quilibre trop importantentre les deux �ls du noeud o$ l�on ins�re un nouvel �l�ment� il faut recr�er un �qui�libre par une rotation simple !�gure ���" ou une rotation double !�gure ����"� Dansces �gures� les rotations sont prises dans le cas d�un r��quilibrage de la gauche vers ladroite� Il existe bien s#r les � rotations sym�triques de la droite vers la gauche� On peutaussi remarquer que la double rotation peut se r�aliser par une suite de deux rotationssimples� Dans la �gure ����� il su%t de faire une rotation simple de la droite vers lagauche du noeud A� suivie d�une rotation simple vers la droite du noeud B� Ainsi ensupposant d�j� �crites les proc�dures de rotation rotD vers la droite et rotG vers lagauche� la proc�dure d�insertion s��crit

static Arbre ajouter �int v� Arbre a�

return ajouter� �v� a��p��

static Paire ajouter� �int v� Arbre a�

int incr� r�

Paire p�

Page 101: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ARBRES �QUILIBR�S ���

B

A

a b

c�

A

a

B

b c

Fig� ��� � Rotation dans un arbre AVL

r � �

if �a �� null�

a � new Arbre �v� null� null��

a�bal � �

r � ��

� else

if �v �� a�contenu�

p � ajouter� �v� a�filsG��

incr � �p�p��

a�filsG � p�p��

� else

p � ajouter� �v� a�filsD��

incr � p�p��

a�filsD � p�p��

a�bal � a�bal � incr�

if �incr &� %% a�bal &� �

if �a�bal � ���

�� La gauche est trop grande ��

if �a�filsG�bal � �

a � rotD �a��

else

a�filsG � rotG �a�filsG��

a � rotD �a��

else

if �a�bal ��

�� La droite est trop grande ��

if �a�filsD�bal �

a � rotG �a��

else

a�filsD � rotD �a�filsD��

a � rotG �a��

else

r � ��

return new Paire �r� a��

Page 102: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� CHAPITRE � ARBRES

C

A

aB

b� b�

c �

B

A

a b�

C

b� c

Fig� ���� � Double rotation dans un arbre AVL

static class Paire

int p��

Arbre p��

Paire �int r� Arbre a�

p� � r�

p� � a�

Clairement cette proc�dure prend un temps O�logN�� On v�ri�e ais�ment qu�au plusune seule rotation !�ventuellement double" est n�cessaire lors de l�insertion d�un nouvel�l�ment� Il reste � r�aliser les proc�dures de rotation� Nous ne consid�rons que le cas dela rotation vers la droite� l�autre cas s�obtenant par sym�trie�

static Arbre rotD �Arbre a�

Arbre b�

int bA� bB� bAnew� bBnew�

b � a�

a � a�filsG�

bA � a�bal� bB � b�bal�

b�filsG � a�filsD�

a�filsD � b�

�� Recalculer le champ a�bal

bBnew � � � bB � Math�min�� bA��

bAnew � � � bA � Math�max�� bBnew��

a�bal � bAnew�

b�bal � bBnew�

return a�

Il y a un petit calcul savant pour retrouver le champ repr�sentant l��quilibre apr�srotation� Il pourrait �tre simpli�� si nous conservions toute la hauteur du noeud dansun champ� La pr�sentation avec les champs bal permet de garder les valeurs possiblesentre �� et �� de tenir donc sur � bits� et d�avoir le reste d�un mot machine pour lechamp contenu� Avec la taille des m�moires actuelles� ce calcul peut se r�v�ler surper�u�Toutefois� soient h�a�� h�b� et h�c� les hauteurs des arbres a� b et c de la �gure ���� Enappliquant la d��nition du champ bal� les nouvelles valeurs b��A� et b��B� de ces champsaux noeuds A et B se calculent en fonction des anciennes valeurs b�A� et b�B� par

Page 103: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� PROGRAMMES EN CAML ���

b��B� � h�c�� h�b�� h�c�� �� dh�a�� h�b�e � � � dh�a�� h�b�e � h�b�� b�B� � � � dh�a� � h�b�� �e� � � b�B�� b�� b�A�c

b��A� � � � dh�b�� h�c�e � h�a�� � � h�b�� h�a� � d�� h�c� � h�b�e� � � b�A� � d�� b��B�e

Les formules pour la rotation vers la gauche s�obtiennent par sym�trie� On peutm�me remarquer que le champ bal peut tenir sur � bit pour signaler si le sous�arbre aune hauteur �gale ou non � celle de son sous�arbre �fr�re � La suppression d�un �l�mentdans un arbre AVL est plus dure � programmer� et nous la laissons en exercice� Ellepeut demander jusqu�� O�logN� rotations�

Les arbres AVL sont d�licats � programmer � cause des op�rations de rotation� Onpeut montrer que les rotations deviennent inutiles si on donne un peu de �exibilit�dans le nombre de �ls des noeuds� Il existe des arbres de recherche ��� avec � ou � �ls�L�exemple le plus simple est celui des arbres ����� amplement d�crits dans le livre deSedgewick �� �� Un exemple d�arbre ����� est d�crit dans la �gure ����� La propri�t�fondamentale d�un tel arbre de recherche est la m�me que pour les noeuds binaires�tout noeud doit avoir une valeur sup�rieure ou �gale � celles contenues dans ses sous�arbres gauches� et une valeur inf�rieure !ou �gale" � celles de ses sous�arbres droits� Lesnoeuds ternaires contiennent � valeurs� la premi�re doit �tre comprise entre les valeursdes sous�arbres gauches et du centre� la deuxi�me entre celles des sous�arbres du centreet de droite� On peut deviner ais�ment la condition pour les noeuds � � �ls�

L�insertion d�un nouvel �l�ment dans un arbre ����� se fait en �clatant tout noeudquaternaire que l�on rencontre comme d�crit dans la �gure ����� Ces op�rations sontlocales et ne font intervenir que le nombre de �ls des noeuds� Ainsi� on garantit quel�endroit o$ on ins�re la nouvelle valeur n�est pas un noeud quaternaire� et il su%t demettre la valeur dans ce noeud � l�endroit d�sir�� !Si la racine est quaternaire� on l��clateen � noeuds binaires"� Le nombre d��clatements maximum peut �tre logN pour un arbrede N noeuds� Il a �t� mesur� qu�en moyenne tr�s peu d��clatements sont n�cessaires�

Les arbres ����� peuvent �tre programm�s en utilisant des arbres binaires bicolores�On s�arrange pour que chaque branche puisse avoir la couleur rouge ou noire !en traitgras sur notre �gure ����"� Il su%t d�un indicateur bool�en dans chaque noeud pour diresi la branche le reliant � son p�re est rouge ou noire� Les noeuds quaternaires sont repr��sent�s par � noeuds reli�s en noir� Les noeuds ternaires ont une double repr�sentationpossible comme d�crit sur la �gure ����� Les op�rations d��clatement se programmentalors facilement� et c�est un bon exercice d��crire la proc�dure d�insertion dans un arbrebicolore�

�� Programmes en Caml

�� Ajouter � un tas� avec une structure enregistrement ��

type 'a tas �

mutable cardinal� int�

tas� 'a vect ���

let ajouter v t �

t�cardinal �� t�cardinal � ��

Page 104: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� CHAPITRE � ARBRES

��

�� ��

� � � ��

� ��

�� �� �� �� �

Fig� ���� � Exemple d�arbre ���

let a � t�tas in

let nTas � t�cardinal in

let i � ref �nTas � �� in

if &i � vect�length a

then failwith �tas plein� else

while &i %% a���&i � �� � �� �� v do

a��&i� �� a���&i � �� � ���

i �� �&i � �� � �

done�

a��&i� �� v��

�� Ajouter � un tas� voir page �� ��

let nTas � ref ��

let ajouter v a �

incr nTas�

let i � ref �&nTas � �� in

while &i %% a���&i � �� � �� �� v do

a��&i� �� a���&i � �� � ���

i �� �&i � �� � �

done�

a��&i� �� v��

�� Maximum dun tas� voir page �� ��

let maximum t � t�tas�����

�� Supprimer dans un tas� voir page �� ��

let supprimer t �

t�cardinal �� t�cardinal � ��

let a � t�tas in

let nTas � t�cardinal in

a��� �� a��nTas��

let i � ref

and v � a���

and j � ref in

begin

try

while � � &i � � � nTas do

j �� � � &i � ��

if &j � � � nTas %% a��&j � �� a��&j�

Page 105: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� PROGRAMMES EN CAML ���

then j �� &j � ��

if v � a��&j� then raise Exit�

a��&i� �� a��&j��

i �� &j

done

with Exit � ��

end�

a��&i� �� v��

�� HeapSort� voir page � ��

let heapsort a �

let n � vect�length a � � in

let t � cardinal � � tas � a� in

for i � to n do ajouter a��i� t done�

for i � n downto do

let v � maximum t in

supprimer t�

a��i� �� v

done��

�� Dclaration dun arbre binaire� voir page �� ��

type 'a arbre � Vide � Noeud of 'a noeud

and 'a noeud �

contenu� 'a� filsG� 'a arbre� filsD� 'a arbre���

�� Dclaration dun arbre n�aire� voir page �� ��

type 'a arbre � Vide � Noeud of 'a noeud

and 'a noeud � contenu� 'a� fils� 'a arbre vect���

�� Cas n�aire� les �ls sont implments par une liste darbres� ��

type 'a arbre � Vide � Noeud of 'a noeud

and 'a noeud � contenu� 'a� fils� 'a arbre list���

�� Ajouter dans un arbre ��

let nouvel�arbre v a b �

Noeud contenu � v� filsG � a� filsD � b���

let main �� �

let a! �

nouvel�arbre ��

�nouvel�arbre � �nouvel�arbre � Vide Vide� Vide�

�nouvel�arbre �� Vide Vide� in

nouvel�arbre �

�nouvel�arbre � �nouvel�arbre � Vide Vide� a!�

�nouvel�arbre �!

�nouvel�arbre �� Vide Vide�

�nouvel�arbre �� Vide Vide����

�� Impression dun arbre� voir page �� ��

�open �printf���

Page 106: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE � ARBRES

let imprimer�arbre a �

let rec imprimer� a tab �

match a with

Vide � ��

� Noeud contenu � c� filsG � fg� filsD � fd� �

printf ���d � c� imprimer� fd �tab � ���

if fg � Vide then

printf ��n�s� �make�string tab ) )��

imprimer� fg tab��

in

imprimer� a � print�newline����

�� Taille dun arbre� voir page �� ��

let rec taille � function

Vide �

� Noeud filsG � fg� filsD � fd� �� �

� � taille fg � taille fd��

�� Arbre de recherche� voir page �� ��

let rec recherche v a �

match a with

Vide � Vide

� Noeud

contenu � c� filsG � fg� filsD � fd� �

if c � v then a else

if c � v then recherche v fg

else recherche v fd��

�� Ajouter� purement fonctionnel� voir page �� ��

let rec ajouter v a �

match a with

Vide � nouvel�arbre v Vide Vide

� Noeud

contenu � c� filsG � fg� filsD � fd� �

if v �� c

then nouvel�arbre c �ajouter v fg� fd

else nouvel�arbre c �ajouter v fd� fg��

�� Ajouter avec effet de bord�

voir page �pageref prog�recherche�arb�ajouter�fonctionnel�� ��

type 'a arbre � Vide � Noeud of 'a noeud

and 'a noeud �

mutable contenu� 'a�

mutable filsG� 'a arbre�

mutable filsD� 'a arbre���

let nouvel�arbre v a b �

Noeud contenu � v� filsG � a� filsD � b���

Page 107: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� PROGRAMMES EN CAML ��

let rec ajouter v a �

match a with

Vide � nouvel�arbre v Vide Vide

� Noeud

� contenu � c� filsG � fg� filsD � fd�

as n� �

if v �� c

then n�filsG �� ajouter v fg

else n�filsD �� ajouter v fd�

a��

�� Ajouter� purement fonctionnel avec un autre type darbres ��

type 'a arbre � Vide � Noeud of 'a arbre � 'a � 'a arbre��

let nouvel�arbre v a b �

Noeud �a� v� b���

let rec ajouter v a �

match a with

Vide � nouvel�arbre v Vide Vide

� Noeud �fg� c� fd� �

if v �� c

then nouvel�arbre c �ajouter v fg� fd

else nouvel�arbre c �ajouter v fd� fg��

�� Arbres AVL� voir page ��� ��

type 'a avl � Vide � Noeud of 'a noeud

and 'a noeud �

mutable balance� int�

mutable contenu� 'a�

mutable filsG� 'a avl�

mutable filsD� 'a avl ���

let nouvel�arbre bal v a b �

Noeud

balance � bal� contenu � v�

filsG � a� filsD � b���

�open �format���

let rec print�avl � function

Vide � ��

� Noeud

balance � bal� contenu � v�

filsG � a� filsD � b� �

open�box �� print�string ����

print�int bal� print�string �� ��

print�int v� print�space���

print�avl a� print�space��� print�avl b�

print�cut��� print�string ����

close�box����

Page 108: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE � ARBRES

install�printer �print�avl���

�� Rotation dans un AVL� voir page ��� ��

let rotD a �

match a with

Vide � failwith �rotD�

� Noeud

� balance � bB� contenu � v�

filsG � A� filsD � c� as nB� as B �

match A with

Vide � failwith �rotD�

� Noeud

� balance � bA� contenu � v�

filsG � a� filsD � b� as nA� �

nA�filsD �� B�

nB�filsG �� b�

let bBnew � bB � � � min bA in

let bAnew � bA � � � max bBnew in

nA�balance �� bAnew�

nB�balance �� bBnew�

A��

�� Rotation dans un AVL� voir page ��� ��

let rotG a �

match a with

Vide � failwith �rotG�

� Noeud

� balance � bA� contenu � v�

filsG � c� filsD � B� as nA� as A �

match B with

� Vide � failwith �rotG�

� Noeud

� balance � bB� contenu � v�

filsG � a� filsD � b� as nB� �

nA�filsD �� a�

nB�filsG �� A�

let bAnew � bA � � � max bB in

let bBnew � bB � � � min bAnew in

nA�balance �� bAnew�

nB�balance �� bBnew�

B��

�� Ajout dans un AVL� voir page ��� ��

let rec ajouter v a �

match a with

Vide � �nouvel�arbre v Vide Vide� ��

� Noeud

� balance � bal� contenu � c�

filsG � fg� filsD � fd� as noeud� �

let diff �

Page 109: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� PROGRAMMES EN CAML ���

if v �� c then begin

let �a� incr� � ajouter v fg

in

noeud�balance �� noeud�balance � incr�

noeud�filsG �� a�

incr

end else begin

let �a� incr� � ajouter v fd

in

noeud�balance �� noeud�balance � incr�

noeud�filsD �� a�

incr

end in

if diff � %% noeud�balance � then

if noeud�balance � �� then begin

match fg with

Vide � failwith �Vide�

� Noeud balance � b� �� �

if b � then �rotD a� �

else begin

noeud�filsG �� rotG fg� �rotD a� �

end

end else

if noeud�balance � then begin

match fd with

Vide � failwith �Vide�

� Noeud balance � b� �� �

if b then �rotG a� �

else begin

noeud�filsD �� rotD fd� �rotG a� �

end

end

else �a� ��

else �a� ���

Page 110: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� CHAPITRE � ARBRES

A

a DC E

b c d e

A D

a C

b c

E

d e

A B

a b DC E

c d e f

BA D

a b C

c d

E

e f

Fig� ���� � Eclatement d�arbres ���

BA C

a b c d

B

A

a b

C

c d

A B

a b c

B

A

a b

c ou

A

aB

b c

Fig� ���� � Arbres bicolores

Page 111: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���

Chapitre �

Graphes

La notion de graphe est une structure combinatoire permettant de repr�senter denombreuses situations rencontr�es dans des applications faisant intervenir des math�mati�ques discr�tes et n�cessitant une solution informatique� Circuits �lectriques� r�seaux detransport !ferr�s� routiers� a�riens"� r�seaux d�ordinateurs� ordonnancement d�un en�semble de t(ches sont les principaux domaines d�application o$ la structure de grapheintervient� D�un point de vue formel� il s�agit d�un ensemble de points !sommets" etd�un ensemble d�arcs reliants des couples de sommets� Une des premi�res questions quel�on se pose est de d�terminer� �tant donn� un graphe et deux de ses sommets� s�il existeun chemin !suite d�arcs" qui les relie� cette question tr�s simple d�un point de vue ma�th�matique pose des probl�mes d�e%cacit� d�s que l�on souhaite la traiter � l�aide del�ordinateur pour des graphes comportant un tr�s grand nombre de sommets et d�arcs�Pour se convaincre de la di%cult� du probl�me il su%t de consid�rer le jeu d��checs et re�pr�senter chaque con�guration de pi�ces sur l��chiquier comme un sommet d�un graphe�les arcs joignent chaque con�guration � celles obtenues par un mouvement d�une seulepi�ce� la r�solution d�un probl�me d��checs revient ainsi � trouver un ensemble de che�mins menant d�un sommet � des con�gurations de �mat�� La di%cult� du jeu d��checsprovient donc de la quantit� importante de sommets du graphe que l�on doit parcourir�Des graphes plus simples comme celui des stations du M�tro Parisien donnent lieu � desprobl�mes de parcours beaucoup plus facilement solubles� Il est courant� lorsque l�on�tudie les graphes� de distinguer entre les graphes orient�s dans lesquels les arcs doivent�tre parcourus dans un sens d�termin� !de x vers y mais pas de y vers x" et les graphessym�triques !ou non orient�s" dans lesquels les arcs !appel�s alors ar�tes" peuvent �treparcourus dans les deux sens� Nous nous limitons dans ce chapitre aux graphes orient�s�car les algorithmes de parcours pour les graphes orient�s s�appliquent en particulier auxgraphes sym�triques � il su%t de construire � partir d�un graphe sym�trique G le grapheorient� G� comportant pour chaque ar�te x� y de G deux arcs oppos�s� l�un de x vers yet l�autre de y vers x�

�� D� nitions

Dans ce paragraphe nous donnons quelques d��nitions sur les graphes orient�s etquelques exemples� nous nous limitons ici aux d��nitions les plus utiles de fa�on � passertr�s vite aux algorithmes�

D��nition � Un graphe G � �X�A� est donn� par un ensemble X de sommets et parun sous�ensemble A du produit cart�sien X �X appel� ensemble des arcs de G�

Page 112: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� CHAPITRE � GRAPHES

�� �

�� �

�� �

�� �

�� �

�� �

�� �

�� �

Fig� ��� � Le graphe de De Bruijn pour k �

Un arc a � �x� y� a pour origine le sommet x et pour extr�mit� le sommet y� Onnote

or�a� � x� ext�a� � y

Dans la suite on suppose que tous les graphes consid�r�s sont �nis� ainsi X et parcons�quent A sont des ensembles �nis� On dit que le sommet y est un successeur de xsi �x� y� � A � x est alors un pr�d�cesseur de y�

D��nition � Un chemin f du graphe G � �X�A� est une suite �nie d�arcs a�� a�� � � � � aptelle que�

�i� � � i � p or�ai��� � ext�ai��

L�origine d�un chemin f � not�e or�f� est celle de son premier arc a� et son extr�mit��not�e ext�f� est celle de son dernier arc ap� la longueur du chemin est �gale au nombred�arcs qui le composent� c�est���dire p� Un chemin f tel que or�f� � ext�f� est appel�un circuit�

Exemple � Graphes de De Bruijn

Les sommets d�un tel graphe sont les suites de longueur k form�es de symboles � ou ��un arc joint la suite f � la suite g si

f � xh� g � hy

o$ x et y sont des symboles !� ou � " et o$ h est une suite quelconque de k�� symboles�

Exemple � Graphes des diviseurs

Les sommets sont les nombres f�� � � � � � ng� un arc joint p � q si p divise q�

Page 113: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� MATRICES D ADJACENCE ���

�� �

��

� ��

Fig� ��� � Le graphe des diviseurs� n � ��

�� Matrices d�adjacence

Une structure de donn�es simple pour repr�senter un graphe est la matrice d�adja�cence M � Pour obtenir M � on num�rote les sommets du graphe de fa�on quelconque�

X � fx�� x� � � � xngM est une matrice carr�e n� n dont les coe%cients sont � et � telle que�

Mi�j � � si �xi� xj� � A� Mi�j � � si �xi� xj� �� A

Ceci donne alors les d�clarations de type et de variables suivantes�

class GrapheMat

int m#$#$� �� la matrice M dadjacence� ��int nb� �� n est le nombre de sommets ��

GrapheMat �int n�

nb � n�

m � new int#n$#n$�

Un int�r�t de cette repr�sentation est que la d�termination de chemins dansG revientau calcul des puissances successives de la matrice M � comme le montre le th�or�mesuivant�

Th�or�me � Soit Mp la puissance p�i�me de la matrice M � le coe�cient Mpi�j est

�gal au nombre de chemins de longueur p de G dont l�origine est le sommet xi et dontl�extr�mit� est le sommet xj�

Preuve On e�ectue une r�currence sur p� Pour p � � le r�sultat est imm�diat car unchemin de longueur � est un arc du graphe� Le calcul de Mp� pour p � � donne�

Mpi�j �

nXk��

Mp��i�k Mk�j

Page 114: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� CHAPITRE � GRAPHES

��

�BBBBBBB�

� � � � � �� � � � � �� � � � � �� � � � � �� � � � � �� � � � � �

�CCCCCCCA

Fig� ��� � Un exemple de graphe et sa matrice d�adjacence

Or tout chemin de longueur p entre xi et xj se d�compose en un chemin de longueurp�� entre xi et un certain xk suivi d�un arc reliant xk et xj� Le r�sultat d�coule alors del� hypoth�se de r�currence suivant laquelle Mp��

i�k est le nombre de chemins de longueurp� � joignant xi � xk� �

De ce th�or�me on d�duit l�algorithme suivant permettant de tester l�existence d�unchemin entre deux sommets�

static boolean existeChemin �int i� int j� GrapheMat g�

int n � g�nb�

int m#$#$ � g�m�

int u#$#$ � copy�m��

int v#$#$ � copy�m��

for �int k � �� u#i$#j$ �� %% k � n� ��k�

multiplier �v� v� m��

additionner �u� u� v��

return u#i$#j$ &� �

Dans cet algorithme� les proc�dures multiplier�c a b et additonner�c a bsont respectivement des proc�dures qui multiplient et ajoutent les deux matrices n� na et b pour obtenir la matrice c�

Remarques

�� L�algorithme utilise le fait� facile � d�montrer� que l�existence d�un chemin d�ori�gine x et d�extr�mit� y implique celle d�un tel chemin ayant une longueur inf�rieureau nombre total de sommets du graphe�

�� Le nombre d�op�rations e�ectu�es par l�algorithme est de l�ordre de n� car le pro�duit de deux matrices carr�es n�n demande n� op�rations et l�on peut �tre amen�� e�ectuer n produits de matrices� La recherche du meilleur algorithme possible

Page 115: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� FERMETURE TRANSITIVE ���

� �

� �

Fig� ��� � Un graphe et sa fermeture transitive

pour le calcul du produit de deux matrices a �t� tr�s intense ces derni�res ann�eset plusieurs am�liorations de l�algorithme �l�mentaire demandant n� multiplica�tions ont �t� successivement trouv�es� et il est rare qu�une ann�e se passe sansque quelqu�un n�am�liore la borne� Coppersmith et Winograd ont ainsi propos�un algorithme en O�n����� mais ceci est un r�sultat de nature th�orique car laprogrammation de l�algorithme de Coppersmith et Winograd est loin d��tre ais�eet l�e%cacit� esp�r�e n�est atteinte que pour des valeurs tr�s grandes de n� Il estdonc n�cessaire de construire d�autres algorithmes� faisant intervenir des notionsdi��rentes�

�� Cet algorithme construit une matrice !not�e ici u" qui peut �tre utilis�e chaquefois que l�on veut tester s�il existe un chemin entre deux sommets !xi et yi"� Dansle cas o$ on se limite � la recherche de l�existence d�un chemin entre deux sommetsdonn�s !et si ceci ne sera fait qu�une seule fois" on peut ne calculer qu�une lignede la matrice� ce qui diminue notablement la complexit��

�� Fermeture transitive

La fermeture transitive d�un graphe G � �X�A� est la relation transitive minimalecontenant la relation �X�A�� il s�agit d�un graphe G� � �X�A�� tel que �x� y� � A� siet seulement s� il existe un chemin f dans G d�origine x et d�extr�mit� y�

Le calcul de la fermeture transitive permet de r�pondre aux questions concernantl�existence de chemins entre x et y dans G et ceci pour tout couple de sommets x� y� Cecalcul complet n�est pas vraiment utile s�il s�agit de r�pondre un petit nombre de fois �des questions sur l�existence de chemins entre des couples de sommets� on utilise alorsdes algorithmes qui seront d�crits dans les paragraphes suivants� Par contre lorsque l�ons�attend � avoir � r�pondre de nombreuses fois � ce type de question il est pr�f�rablede calculer au pr�alable �X�A��� la r�ponse � chaque question est alors imm�diatepar simple consultation d�un des coe%cients de la matrice d�adjacence de G�� On ditque l�on e�ectue un pr�traitement� op�ration courante en programmation dans maintesapplications� ainsi le tri des �l�ments d�un �chier peut aussi �tre consid�r� comme unpr�traitement en vue d�une s�rie de consultations du �chier� le temps mis pour trier le�chier est r�cup�r� ensuite dans la rapidit� de la consultation� Le calcul de la fermeturetransitive d�un graphe se r�v�le tr�s utile par exemple� dans certains compilateurs�optimiseurs� un graphe est associ� � chaque proc�dure d�un programme� les sommets dece graphe repr�sentent les variables de la proc�dure et un arc entre la variable a et lavariable b indique qu�une instruction de calcul de a fait appara�tre b dans son membredroit� On l�appelle souvent graphe de d�pendance� La fermeture transitive de ce graphedonne ainsi toutes les variables n�cessaires directement ou indirectement au calcul de a�cette information est utile lorsque l�on veut minimiser la quantit� de calculs � e�ectuer

Page 116: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE � GRAPHES

y�

z�

x

z�

z�y�

y�

z�

x

z�

z�y�

Fig� ��� � L�e�et de l�op�ration �x� les arcs ajout�s sont en pointill�

en machine pour l�ex�cution du programme�Le calcul de �X�A�� s�e�ectue par it�ration de l�op�ration de base �x�A� qui ajoute

� A les arcs �y� z� tels que y est un pr�d�cesseur de x et z un de ses successeurs� Plusformellement on pose �

�x�A� � A � f�y� z� j �y� x�� �x� z� � AgCette op�ration satisfait les deux propri�t�s suivantes�

Proposition � Pour tout sommet x on a

�x��x�A�� � �x�A�

et pour tout couple de sommets �x� y� �

�x��y�A�� � �y��x�A��

Preuve La premi�re partie est tr�s simple� on l�obtient en remarquant que �u� x� ��x�A� implique �u� x� � A et que �x� v� � �x�A� implique �x� v� � A �

Pour la seconde partie� il su%t de v�ri�er que si �u� v� appartient � �x��y�A�� ilappartient aussi � �y��x�A��� le r�sultat s�obtient ensuite par raison de sym�trie� Si�u� v� � �x��y�A�� alors ou bien �u� v� � �y�A� ou bien �u� x� et �x� v� � �y�A�� Dansle premier cas �y�A

�� � �y�A� pour tout A� � A implique �u� v� � �y��x�A��� Dansle second cas il y a plusieurs situations � consid�rer suivant que �u� x� ou �x� v� appar�tiennent ou non � A� l�examen de chacune d�entre elles permet d�obtenir le r�sultat�Examinons en une � titre d�exemple� supposons que �u� x� � A et �x� v� �� A� comme�x� v� � �y�A� on a �x� y�� �y� v� � A� ceci implique �u� y� � �x�A� et �u� v� � �y��x�A���

Proposition � La fermeture transitive A� est donn�e par �

A� � �x���x��� � ��xn�A� � � ���

Preuve On se convainc facilement que A� contient l�it�r�e de l�action des �xi sur A�la partie la plus complexe � prouver est que �x���x��� � ��xn�A� � � ��� contient A�� Pourcela on consid�re un chemin joignant deux sommets x et y de G alors ce chemin s��crit

�x� y���y�� y�� � � � �yp� y�

Page 117: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� LISTES DE SUCCESSEURS ��

ainsi �x� y� � �y���y��� � ��yp�A� � � ��� les propri�t�s d�montr�es ci�dessus permettentd�ordonner les y suivant leurs num�ros croissants� le fait que �y�A

�� � A�� pour tout A�

permet ensuite de conclure� �

De ces deux r�sultats on obtient l�algorithme suivant pour le calcul de la fermeturetransitive d�un graphe� il est en g�n�ral attribu� � Roy et Warshall�

static void phi �GrapheMat g� int x�

for �int i � � i � g�nb� ��i�

if �g�m#i$#x$ �� ��

for �int j � � j � g�nb� ��j�

if �g�m#x$#j$ �� ��

g�m#i$#j$ � ��

static public void fermetureTransitive �GrapheMat g�

for �int k � � k � g�nb� ��k�

phi�g� k��

Remarque L�algorithme ci�dessus e�ectue un nombre d�op�rations que l�on peut ma�jorer par n�� chaque ex�cution de la proc�dure phi pouvant n�cessiter n� op�rations�cet algorithme est donc meilleur que le calcul des puissances successives de la matriced�adjacence�

� Listes de successeurs

Une fa�on plus compacte de repr�senter un graphe consiste � associer � chaquesommet x la liste de ses successeurs� Ceci peut se faire� par exemple� � l�aide d�un tableau� double indice que l�on notera Succ� On suppose que les sommets sont num�rot�s de �� n� alors pour un sommet x et un entier i� Succ x� i� est le i�me successeur de x� Cetterepr�sentation est utile pour obtenir tous les successeurs d�un sommet x� Elle permet d�yacc�der en un nombre d�op�rations �gal au nombre d��l�ments de cet ensemble et nonpas� comme c�est le cas dans la matrice d�adjacence� au nombre total de sommets� Ainsisi dans un graphe de ����� sommets chaque sommet n�a que � successeurs l�obtentionde tous les successeurs de x se fait en consultant � ou � valeurs au lieu des ����� tests� e�ectuer dans le cas des matrices� L�utilisation d�un symbole suppl�mentaire not� ��signi�ant �ind��ni et n�appartenant pas � X permet une gestion plus facile de la �n deliste� On le place � la suite de tous les successeurs de x pour indiquer que l�on a termin�la liste� AinsiSucc x� i� � y � X signi�e que y est le i�me successeur de xSucc x� i� � � signi�e que x a i� � successeurs�

Le graphe donn� �gure ��� plus haut admet alors la repr�sentation par liste desuccesseurs suivante�

� � � �� � � � � � � �� � � �� � � �� � � �

Page 118: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE � GRAPHES

Les d�clarations Java correspondantes peuvent �tre alors les suivantes�

class GrapheSucc

int succ#$#$�

int nb�

final static int Omega � ���

GrapheSucc �int n�

nb � n�

succ � new int#n$#n$�

Le parcours de la liste des successeurs y d�un sommet x s�e�ectue alors � l�aide de lasuite d�instructions suivantes� et on retrouvera cette suite d�instructions comme briquede base de beaucoup de constructions d�algorithmes sur les graphes �

for �k � � succ#x�k$ &� Omega� ��k�

int y � succ#x�k$�

�� Traiter y�

On peut transformer la matrice d�adjacence d�un graphe en une structure de listede successeurs par l�algorithme suivant �

GrapheSucc �GrapheMat g�

int nbMaxSucc�

nb � g�nb�

for �int i � � i � nb � ��i�

nbMaxSucc � �

for �int j � � j � nb � ��j�

if �g�m#i$#j$ &� �

nbMaxSucc � Math�max �nbMaxSucc� j��

succ � new int#nb$#nbMaxSucc � �$�

for �int i � � i � nb � ��i�

int k � �

for �int j � � j � nb � ��j�

if �g�m#i$#j$ &� �

succ#i$#k��$ � j�

succ#i$#k$ � Omega�

Remarque La structure de liste de successeurs peut �tre remplac�e par une structurede liste cha�n�e� Cette programmation permet de gagner en place m�moire en �vitantde d�clarer un nombre de successeurs maximum pour chacun des sommets� Elle permetaussi de diminuer le nombre d�op�rations chaque fois que l�on e�ectue des op�rationsd�ajout et de suppression de successeurs� Cette notion peut �tre omise en premi�re lec�ture� en particulier par ceux qui ne se sentent pas tr�s � l�aise dans le maniement despointeurs� Dans toute la suite� les algorithmes sont �crits avec la structure matriciellesucc�xi�� Un simple jeu de traduction permettrait de les transformer en programma�tion par pointeurs� on utilise les structures de donn�es suivantes �

class GrapheListe

Liste listeSucc#$�

int nb�

Page 119: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ARBORESCENCES ���

GrapheListe �GrapheSucc g�

nb � g�nb�

listeSucc � new Liste#g�nb$�

for �int x � � x � g�nb � ��x�

listeSucc#x$ � null�

for �int k � � g�succ#x$#k$ &� GrapheSucc�Omega� ��k�

int y � g�succ#x$#k$�

listeSucc#x$ � Liste�ajouter�y� listeSucc#x$��

La transformation de la forme matricielle Succ en une structure de liste cha�n�e parle constructeur de la classe donn� ci dessus� on peut noter que celui�ci inverse l�ordredans lequel sont rang�s les successeurs d�un sommet� ceci n�a pas d�importance dans laplupart des cas�

� Arborescences

D��nition � Une arborescence �X�A� r� de racine r est un graphe �X�A� o r est un�l�ment de X tel que pour tout sommet x il existe un unique chemin d�origine r etd�extr�mit� x� Soit�

�x �� y�� y�� � � � � yp

tels que�

y� � r� yp � x� �i� � � i � p �yi� yi��� � A

L�entier p est appel� la profondeur du sommet x dans l�arborescence� On montre faci�lement que dans une arborescence la racine r n�admet pas de pr�d�cesseur et que toutsommet y di��rent de r admet un pr�d�cesseur et un seul� ceci implique�

jAj � jXj � �

La di��rence entre une arborescence et un arbre !voir chapitre �" est mineure� Dansun arbre� les �ls d�un sommet sont ordonn�s !on distingue le �ls gauche du �ls droit"�tel n�est pas le cas dans une arborescence� On se sert depuis fort longtemps des arbo�rescences pour repr�senter des arbres g�n�alogiques aussi le vocabulaire utilis� pourles arborescences emprunte beaucoup de termes relevant des relations familiales�L�unique pr�d�cesseur d�un sommet !di��rent de r" est appel� son p�re� l�ensembley�� y�� � � � yp��� yp� o$ p � �� formant le chemin de r � x � yp est appel� ensemble desanc�tres de x� les successeurs de x sont aussi appel�s ses �ls� L�ensemble des sommetsextr�mit�s d�un chemin d�origine x est l�ensemble des descendants de x� il constitueune arborescence de racine x� celle�ci est l�union de fxg et des arborescences form�esdes descendants des �ls de x� Pour des raisons de commodit� d��criture qui appara��tront dans la suite� nous adoptons la convention que tout sommet x est � la fois anc�treet descendant de lui�m�me� Une arborescence est avantageusement repr�sent�e par levecteur pere qui � chaque sommet di��rent de la racine associe son p�re� Il est souventcommode dans la programmation des algorithmes sur les arborescences de consid�rerque la racine de l�arborescence est elle�m�me son p�re� c�est la convention que nousadopterons dans la suite�

Page 120: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� CHAPITRE � GRAPHES

� �

pere�i� �i �

��

��

��

��

��

Fig� �� � Une arborescence et son vecteur pere

La transformation des listes de successeurs d�crivant une arborescence en le vecteurpere s�exprime tr�s simplement�

class Arbo

int pere#$�

final static int Omega � ���

Arbo �GrapheSucc g� int r�

pere � new int#g�nb$�

pere#r$ � r�

for �int x � � x � g�nb � ��x�

for �int k � � g�succ#x$#k$ &� GrapheSucc�Omega� ��k�

pere#g�succ#x$#k$$ � x�

Dans la suite� on suppose que l�ensemble des sommets X est l�ensemble des entierscompris entre � et n� une arborescence est dite pr��xe si� pour tout sommet i� l�ensembledes descendants de i est un intervalle de l�ensemble des entiers dont le plus petit �l�mentest i�

Dans une arborescence pr��xe� les intervalles de descendants s�embo�tent les unsdans les autres comme des syst�mes de parenth�ses� ainsi� si y n�est pas un descendantde x� ni x un descendant de y� les descendants de x et de y forment des intervallesdisjoints� En revanche� si x est un anc�tre de y� l�intervalle des descendants de y estinclus dans celui des descendants de x�

Proposition � Pour toute arborescence �X�A� r� il existe une re�num�rotation des �l��ments de X qui la rend pr��xe�

Preuve Pour trouver cette num�rotation on applique l�algorithme r�cursif suivant�

� La racine est num�rot�e ��

� Un des �ls x� de la racine est num�rot� ��

Page 121: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ARBORESCENCES ���

� ��

�� �� ��

Fig� �� � Une arborescence pr��xe

� � � � ��

� � � � �� � � � � ��

�� � � � �� � �� � � � � ��

�� �� � � ��

Fig� �� � Emboitement des descendants dans une arborescence pr��xe

Page 122: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� CHAPITRE � GRAPHES

� L�arborescence des descendants de x� est num�rot�e par appels r�cursifs de l�algo�rithme on obtient ainsi des sommets num�rot�s de � � p��

� Un autre �ls de la racine est num�rot� p� � �� les descendants de ce �ls sontnum�rot�s r�cursivement de p� � � � p��

� On proc�de de m�me et successivement pour tous les autres �ls de la racine�

La preuve de ce que la num�rotation obtenue est pr��xe se fait par r�currence surle nombre de sommets de l�arborescence et utilise le caract�re r�cursif de l�algorithme��

L�algorithme qui est d�crit dans la preuve ci�dessus peut s��crire� on suppose quel�arborescence est repr�sent�e par une matrice Succ de successeurs la re�num�rotationse fait par un vecteur numero et r est la racine de l�arborescence�

static int#$ numPrefixe �int r� GrapheSucc g�

int numero#$ � new int#g�nb$�

numPrefixe� �r� g� numero� ��

return numero�

static void numPrefixe� �int x� GrapheSucc g� int numero#$� int num�

numero#x$ � num���

for �int k � � g�succ#x$#k$ &� GrapheSucc�Omega� ��k�

numPrefixe� �g�succ#x$#k$� g� numero� num��

�� Arborescence des plus courts chemins�

Le parcours d�un graphe G � �X�A�� c�est � dire la recherche de chemins entre deuxsommets revient au calcul de certaines arborescences dont l�ensemble des sommets etdes arcs sont inclus dans X et A respectivement� Nous commen�ons par d�crire celledes plus courts chemins�

D��nition Dans un graphe G � �X�A�� pour chaque sommet x� une arborescencedes plus courts chemins �Y�B� de racine x est une arborescence telle que�

! Un sommet y appartient � Y si et seulement si il existe un chemin d�origine x etd�extr�mit� y�

! La longueur du plus court chemin de x � y dans G est �gale � la profondeur de ydans l�arborescence �Y�B��

L�existence de l�arborescence des plus courts chemins est une cons�quence de la re�marque suivante�

Remarque Si a�� a�� � � � � ap est un plus court chemin entre x � or�a�� et y � ext�ap�alors� pour tout i tel que � � i � p� a�� a�� � � � � ai est un plus court chemin entre x etext�ai��

Th�or�me � Pour tout graphe G � �X�A� et tout sommet x de G il existe une arbo�rescence des plus courts chemins de racine x�

Page 123: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ARBORESCENCE DES PLUS COURTS CHEMINS� ���

� �

��

� ��

Fig� ��� � Une arborescence des plus courts chemins de racine ��

Preuve On consid�re la suite d�ensembles de sommets construite de la fa�on suivante�

� Y� � fxg�� Y� est l�ensemble des successeurs de x� duquel il faut �liminer x si le graphe poss�de

un arc ayant x pour origine et pour extr�mit��

� Yi�� est l�ensemble des successeurs d��l�ments de Yi qui n�appartiennent pas �Sk���i Yi�

D�autre part pour chaque Yi� i � �� on construit l�ensemble d�arcs Bi contenantpour chaque y � Yi un arc ayant comme extr�mit� y et dont l�origine est dans Yi��� Onpose ensuite� Y �

SYi� B �

SBi� Le graphe �Y�B� est alors une arborescence de par

sa construction m�me� le fait qu�il s�agisse de l�arborescence des plus courts cheminsr�sulte de la remarque ci�dessus� �

La �gure ��� donne un exemple de graphe et une arborescence des plus courts cheminsde racine �� � celle�ci est repr�sent�e en traits gras� les ensembles Yi et Bi sont lessuivants�

Y� � f��gY� � f�� ��g� B� � f���� ��� ���� ���gY� � f� � �g� B� � f��� �� ��� �� ���� ��gY� � f�� �g� B� � f�� ��� ��� ��gLa preuve de ce th�or�me� comme c�est souvent le cas en math�matiques discr�tes se

transforme tr�s simplement en un algorithme de construction de l�arborescence �Y�B��Cet algorithme est souvent appel� algorithme de parcours en largeur ou breadth��rstsearch� en anglais� Nous le d�crivons ci dessous� il utilise une �le avec les primitivesassoci�es� ajout� suppression� valeur du premier� test pour savoir si la �le est vide� La�le g�re les ensembles Yi� On ajoute les �l�ments des Yi successivement dans la �le quicontiendra donc les Yi les uns � la suite des autres� La v�ri�cation de ce qu�un sommetn�appartient pas �

Sk���i Yi se fait � l�aide du pr�dicat �pere�y� � omega�

static Arbo arbPlusCourt �GrapheSucc g� int x�

Page 124: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� CHAPITRE � GRAPHES

Arbo a � new Arbo�g�nb� x��

File f � new File�vide���

File�ajouter�x� f��

while �&File�estVide�f��

int x � File�valeur�f��

File�supprimer�f��

for �int k � � g�succ#x$#k$ &� GrapheSucc�Omega� ��k�

int y � g�succ#x$#k$�

if �a�pere#y$ �� Omega�

a�pere#y$ � x�

File�ajouter�y� f��

return a�

�� Arborescence de Tr�maux

Un autre algorithme tr�s ancien de parcours dans un graphe a �t� mis au point parun ing�nieur du si�cle dernier� Tr�maux� dont les travaux sont cit�s dans un des premierslivres sur les graphes d# � Sainte Lag0e� Son but �tant de r�soudre le probl�me de lasortie d�un labyrinthe� Depuis l�av�nement de l�informatique� nombreux sont ceux quiont red�couvert l�algorithme de Tr�maux� Certains en ont donn� une version bien pluspr�cise et ont montr� qu�il pouvait servir � r�soudre de fa�on tr�s astucieuse beaucoupde probl�mes algorithmiques sur les graphes� Il est maintenant connu sous l�appella�tion de Depth��rst search nom que lui a donn� un de ses brillants promoteurs� R� E�Tarjan� Ce dernier a d�couvert� entre autres� le tr�s e%cace algorithme de recherchedes composantes fortement connexes que nous d�crirons dans le paragraphe suivant�L�algorithme consiste � d�marrer d�un sommet et � avancer dans le graphe en ne re�

passant pas deux fois par le m�me sommet� Lorsque l�on est bloqu�� on �revient sur sespas jusqu�� pouvoir repartir vers un sommet non visit�� Cette op�ration de �retour surses pas est tr�s �l�gamment prise en charge par l��criture d�une proc�dure r�cursive�Tr�maux qui n�avait pas cette possibilit� � l��poque utilisait un ��l d�Ariane lui per�mettant de se souvenir par o$ il �tait arriv� � cet endroit dans le labyrinthe� On peuten programmation repr�senter ce �l d�Ariane par une pile�

Ceci donne deux versions de l�algorithme que nous donnons ci�dessous�

static void tremauxRec �int x� GrapheSucc g� Arbo a�

for �int k � � g�succ#x$#k$ &� Omega� ��k�

int y � g�succ#x$#k$�

if �a�pere#y$ �� Omega�

a�pere#y$ � x�

tremauxRec�y� g� a��

Le calcul e�ectif de l�arborescence de Tr�maux de racine x s�e�ectue en initialisant levecteur pere par le constructeur de la classe des arborescences�

static Arbo tremaux �int x� GrapheSucc g�

Arbo a � new Arbo �g�nb� x��

Page 125: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ARBORESCENCE DE TR�MAUX ���

� �

Dpart du sommet �

� �

Passage au sommet �

� �

On na pas pu avancerRetour au sommet �

� �

Dpart vers le sommet �

� �

Dpart vers le sommet

� �

On na pas pu avancerRetour au sommet �

� �

Dpart vers le sommet �

� �

On na pas pu avancerRetour au sommet �

� �

On na pas pu avancerRetour au sommet �

� �

Dpart vers le sommet �

� �

On na pas pu avancerRetour au sommet �

� �

Larbre de Trmaux estmaintenant construit

Fig� ���� � Ex�cution de l�algorithme de Tr�maux

Page 126: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE � GRAPHES

tremauxRec�x� g� a��

return a�

La �gure ���� explique l�ex�cution de l�algorithme sur un exemple� les appels de laproc�dure sont dans l�ordre�

tremauxRec���

tremauxRec���

tremauxRec���

tremauxRec���

tremauxRec�!�

tremauxRec���

La proc�dure non r�cursive ressemble fortement � celle du calcul de l�arborescence desplus courts chemins � cela pr�s que l�on utilise une pile et non une �le et que l�on enl�vele sommet courant de la pile une fois que l�on a visit� tous ses successeurs�

static void tremauxPile �int x� GrapheSucc g� Arbo a�

int y� z�

Pile p � new Pile���

Pile�ajouter �x� p��

a�pere#x$ � x�

boucle�

while � &Pile�estVide�p� �

y � Pile�valeur �p��

for �int k � � g�succ#y$#k$ &� Omega� ��k�

z � g�succ#y$#k$�

if �a�pere#z$ �� Omega�

a�pere#z$ � y�

Pile�ajouter �z� p��

continue boucle�

Pile�supprimer �p��

Remarques� L�ensemble des sommets atteignables � partir du sommet x est form� des sommets

tels que Pere�y� � Omega � la �n de l�algorithme� on a donc un algorithme qui r�pond� la question existeChemin�xy examin�e plus haut avec un nombre d�op�rations quiest de l�ordre du nombre d�arcs du graphe !lequel est inf�rieur � n�"� ce qui est bienmeilleur que l�utilisation des matrices�

� L�algorithme non r�cursif tel qu�il est �crit n�est pas e%cace car il lui arrive deparcourir plusieurs fois les successeurs d�un m�me sommet� pour �viter cette recherchesuper�ue� il faudrait empiler en m�me temps qu�un sommet le rang du successeur quel�on est en train de visiter et incr�menter ce rang au moment du d�pilement� Dans cecas� on a une bien meilleure e%cacit�� mais la programmation devient in�l�gante et leprogramme di%cile � lire� nous pr�f�rons de loin la version r�cursive�

L�ensemble des arcs du graphe G � �X�A� qui ne sont pas dans l�arborescence deTr�maux �Y� T � de racine x est divis� en quatre sous�ensembles�

�� Les arcs dont l�origine n�est pas dans Y � ce sont les arcs issus d�un sommet quin�est pas atteignable � partir de x�

Page 127: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� COMPOSANTES FORTEMENT CONNEXES ��

� �Tr

�� ��

Tr

��

��

����

R R

Tr Tr

Fig� ���� � Les arcs obtenus par Tr�maux

�� Les arcs de descente� il s�agit des arcs de la forme �y� z� o$ z est un descendantde y dans �Y� T �� mais n�est pas un de ses successeurs dans cette arborescence�

�� Les arcs de retour� il s�agit des arcs de la forme �y� z� o$ z est un anc�tre de ydans �Y� T ��

�� Les arcs transverses� il s�agit des arcs de la forme �y� z� o$ z n�est pas un anc�tre�ni un descendant de y dans �Y� T ��

On remarquera que� si �y� z� est un arc transverse� on aura rencontr� z avant y dansl�algorithme de Tr�maux�

Sur la �gure ����� on a dessin� un graphe et les di��rentes sortes d�arcs y sontrepr�sent�s par des lignes particuli�res� Les arcs de l�arborescence sont en traits gras�les arcs de descente en traits normaux !sur cet exemple� il y en a deux"� les arcs dontl�origine n�est pas dans Y sont dessin�s en pointill�s� de m�me que les arcs de retour outransverses qui sont munis d�une �tiquette permettant de les reconna�tre� celle ci est R

pour les arcs de retour et Tr pour les arcs transverses� Les sommets ont �t� num�rot�ssuivant l�ordre dans lequel on les rencontre par l�algorithme de Tr�maux� ainsi les arcsde l�arborescence et les arcs de descente vont d�un sommet � un sommet d��tiquetteplus �lev�e et c�est l�inverse pour les arcs de retour ou transverses�

�� Composantes fortement connexes

Dans ce paragraphe� nous donnons une application du calcul de l�arbre de Tr�maux�l�exemple a �t� choisi pour montrer l�utilit� de certaines constructions ing�nieuses d�al�gorithmes sur les graphes� La premi�re sous�section expose le probl�me et donne unesolution simple mais peu e%cace� les autres sous�sections d�crivent l�algorithme ing��nieux de Tarjan� Il s�agit l� de constructions combinatoires qui doivent �tre consid�r�escomme un compl�ment de lecture pour amateurs�

���� D��nitions et algorithme simple

D��nition Soit G � �X�A� un graphe� on note G la relation suivante entre som�mets� x G y si x � y ou s�il existe un chemin joignant x � y et un chemin joignant y

Page 128: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE � GRAPHES

� � �

�� ��

��

��

����

Fig� ���� � Composantes fortement connexes du graphe de la �gure ����

� x�

Celle�ci est une relation d��quivalence� Sa d��nition m�me entra�ne la sym�trie etla r��exivit�� La transitivit� r�sulte de ce que l�on peut concat�ner un chemin entrex et y et un chemin entre y et z pour obtenir un chemin entre x et z� Les classes decette relation d��quivalence sont appel�es les composantes fortement connexes de G� Lacomposante fortement connexe contenant le sommet u sera not�e C�u� dans la suite�

Le graphe de la �gure ���� comporte � composantes fortement connexes� trois necontiennent qu�un seul sommet� une est constitu�e d�un triangle et la derni�re comporte sommets�

Lorsque la relation G n�a qu�une seule classe� le graphe est dit fortement connexe�Savoir si un graphe est fortement connexe est particuli�rement important par exempledans le choix de sens uniques pour les voies de circulation d�un quartier�

Un algorithme de recherche des composantes fortement connexes d�bute n�cessaire�ment par un parcours � partir d�un sommet x� les sommets qui n�appartiennent pas �l�arborescence ainsi construite ne sont certainement pas dans la composante fortementconnexe de x mais la r�ciproque n�est pas vraie� un sommet y qui est dans l�arborescenceissue de x n�est pas n�cessairement dans sa composante fortement connexe car il se peutqu�il n�y ait pas de chemin allant de y � x�

Une mani�re simple de proc�der pour le calcul de ces composantes consiste � it�rerl�algorithme suivant pour chaque sommet x dont la composante n�a pas encore �t�construite�

� D�terminer les sommets extr�mit�s de chemins d�origine x� par exemple en utili�sant l�algorithme de Tr�maux � partir de x�

� Retenir parmi ceux ci les sommets qui sont l�origine d�un chemin d�extr�mit� x�On peut� pour ce faire� construire le graphe oppos� de G obtenu en renversant lesens de tous les arcs de G et appliquer l�algorithme de Tr�maux sur ce graphe �partir de x�

Page 129: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� COMPOSANTES FORTEMENT CONNEXES ���

Cette mani�re de proc�der est peu e%cace lorsque le graphe poss�de de nombreusescomposantes fortement connexes� car on peut �tre amen� � parcourir tout le grapheautant de fois qu�il y a de composantes� Nous allons voir dans les sections suivantes� quela construction de l�arborescence de Tr�maux issue de x va permettre de calculer toutesles composantes connexes des sommets descendants de x en un nombre d�op�rationsproportionnel au nombre d�arcs du graphe�

���� Utilisation de larborescence de Tr�maux

On �tudie tout d�abord la num�rotation des sommets d�un graphe que l�on obtientpar l�algorithme de Tr�maux� On la rappelle ici en y ajoutant une instruction de num��rotation�

static int num � �

static void tremauxRec �int x� GrapheSucc g� Arbo a�

numero #x$ � num���

for �int k � � g�succ#x$#k$ &� Omega� ��k�

int y � g�succ#x$#k$�

if �a�pere#y$ �� Omega�

a�pere#y$ � x�

tremauxRec�y� g� a��

Proposition Si on num�rote les sommets au fur et � mesure de leur rencontre aucours de l�algorithme de Tr�maux� on obtient une arborescence pr��xe �Y� T �� un arc�u� v� qui n�est pas dans T mais dont l�origine u et l�extr�mit� v sont dans Y est un arcde descente si num�u� � num�v� et un arc de retour ou un arc transverse si num�u� �num�v��

On supposera dans la suite que les sommets sont num�rot�s de cette fa�on� ainsilorsqu�on parlera du sommet i� cela voudra dire le i�me sommet rencontr� lors duparcours de Tr�maux et cela �vitera certaines lourdeurs d��criture� La proposition ci�dessus se traduit alors par le fait suivant�

Si v est un descendant de u dans �Y� T � et si un sommet w satisfait �

u � w � v

w est aussi un descendant de u dans cette arborescence�Les liens entre arborescence de Tr�maux �Y� T � de racine x et les composantes fortementconnexes sont dus � la proposition suivante� que l�on �noncera apr�s avoir donn� uned��nition�

D��nition � Une sous�arborescence �Y �� T �� de racine r� d�une arborescence �Y� T � deracine r est constitu�e par des sous�ensembles Y � de Y et T � de T formant une arbores�cence de racine r��

Ainsi tout �l�ment de Y � est extr�mit� d�un chemin d�origine r� et ne contenant quedes arcs de T ��

Proposition Soit G � �X�A� un graphe� x � X� et �Y� T � une arborescence deTr�maux de racine x� Pour tout sommet u de Y � la composante fortement connexeC�u� de G contenant u est une sous�arborescence de �Y� T ��

Page 130: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� CHAPITRE � GRAPHES

�� �

�� ��

�� �� ��

� ��

��

Fig� ���� � Un exemple de sous�arborescence

Preuve Cette proposition contient en fait deux conclusions� d�une part elle assurel�existence d�un sommet u� de C�u� tel que tous les �l�ments de C�u� sont des des�cendants de u� dans �Y� T �� d�autre part elle a%rme que pour tout v de C�u� tous lessommets du chemin de �Y� T � joignant u� � v sont dans C�u��

La deuxi�me a%rmation est simple � obtenir car dans un graphe tout sommet situ�sur un chemin joignant deux sommets appartenant � la m�me composante fortementconnexe est aussi dans cette composante� Pour prouver la premi�re assertion choisissonspour u� le sommet de plus petit num�ro de C�u� et montrons que tout v de C�u� est undescendant de u� dans �Y� T �� Supposons le contraire� v �tant dans la m�me composanteque u�� il existe un chemin f d�origine u� et d�extr�mit� v� Soit w le premier sommetde f qui n�est pas un descendant de u� dans �Y� T � et soit w� le sommet qui pr�c�de wdans f � L�arc �w�� w� n�est pas un arc de T � ni un arc de descente� c�est donc un arc deretour ou un arc transverse et on a �

u� � w � w�

L�arborescence �Y� T � �tant pr��xe on en d�duit que w est descendant de u� d�o$ lacontradiction cherch�e��

���� Points dattache

Une notion utile pour le calcul des composantes fortement connexe est la notion depoint d�attache dont la d��nition est donn�e ci�dessous� Rappelons que l�on suppose lessommets num�rot�s dans l�ordre o$ on les rencontre par la proc�dure de Tr�maux�

D��nition � Etant donn� un graphe G � �X�A�� un sommet x de G et l�arborescencede Tr�maux �Y� T � de racine x� le point d�attache at�y� d�un sommet y de Y est lesommet de plus petit num�ro extr�mit� d�un chemin de G � �X�A�� d�origine y etcontenant au plus un arc �u� v� tel que u � v c�est � dire un arc de retour ou un arctransverse�� On suppose que le chemin vide d�origine et extr�mit� �gale � y est un telchemin ainsi�

at�y� � y

On remarquera qu�un chemin qui conduit d�un sommet y � son point d�attache estou bien vide !le point d�attache est alors y lui m�me"� ou bien contient une suite d�arcsde T suivis par un arc de retour ou un arc transverse� En e�et� une succession d�arcsde T partant de y conduit � un sommet de num�ro plus grand que y� d�autre part les

Page 131: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� COMPOSANTES FORTEMENT CONNEXES ���

��

� �

��

� �

��

��

��

���

���

���

��

�� ��

���

�� �

�� ��

Fig� ���� � Les points d�attaches des sommets d�un graphe

arcs de descente ne sont pas utiles dans la recherche du point d�attache� ils peuvent �treremplac�s par des chemins form�s d�arcs de T �

Dans la �gure ����� on a calcul� les points d�attaches des sommets d�un graphe� ceux�ci ont �t� num�rot�s dans l�ordre o$ on les rencontre dans l�algorithme de Tr�maux� lepoint d�attache est indiqu� en petit caract�re � cot� du sommet en question�

Le calcul des points d�attache se fait � l�aide d�un algorithme r�cursif qui est bas�sur la proposition suivante� dont la preuve est imm�diate�

Proposition � Le point d�attache at�y� du sommet y est le plus petit parmi les sommetssuivants�

! Le sommet y�

! Les points d�attaches des �ls de y dans �Y� T ��

! Les extr�mit�s des arcs transverses ou de retour dont l�origine est y�

L�algorithme est ainsi une adaptation de l�algorithme de Tr�maux� il calcule at�u�en utilisant la valeur des at�v� pour tous les successeurs v de u�

static int pointAttache� �int x� GrapheSucc g� int#$ at�

int y� z�

int m � x�

at#x$ � x�

for �int k � � g�succ#x$#k$ &� Omega� ��k�

y � g�succ#x$#k$�

if �at#y$ �� Omega�

z � pointAttache��y� g� at��

else

z � y�

m � Math�min�m� z��

Page 132: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� CHAPITRE � GRAPHES

at#x$ � mi�

return mi�

static int pointAttache �int x� GrapheSucc g� int#$ at�

for �x � � x � g�nb� ��x�

at#x$ � Omega�

at#x$ � PointAttache� �x� g� at��

Le calcul des composantes fortement connexes � l�aide des at�u� est une cons�quencedu th�or�me suivant�

Th�or�me Si u est un sommet de Y satisfaisant�

! i� u � at�u�

! ii� Pour tout descendant v de u dans �Y� T � on a at�v� � v

Alors� l�ensemble desc�u� des descendants de u dans �Y� T � forme une composante for�tement connexe de G�

Preuve Montrons d�abord que tout sommet de desc�u� appartient � C�u�� Soit v unsommet de desc�u�� il est extr�mit� d�un chemin d�origine u� prouvons que u est aussiextr�mit� d�un chemin d�origine v� Si tel n�est pas le cas� on peut supposer que v est leplus petit sommet de desc�u� � partir duquel on ne peut atteindre u� soit f le cheminjoignant v � at�v�� le chemin obtenu en concat�nant f � un chemin de �Y� T � d�origineu et d�extr�mit� v contient au plus un arc de retour ou transverse ainsi�

u � at�u� � at�v� � v

Comme �Y� T � est pr��xe� at�v� appartient � desc�u� et d�apr�s l�hypoth�se de mini�malit� il existe un chemin d�origine at�v� et d�extr�mit� u qui concat�n� � f fournit lacontradiction cherch�e�

Il reste � montrer que tout sommet w de C�u� appartient aussi � desc�u�� Un telsommet est extr�mit� d�un chemin g d�origine u� nous allons voir que tout arc dontl�origine est dans desc�u� a aussi son extr�mit� dans desc�u�� ainsi tous les sommets deg sont dans desc�u� et en particulier w� Soit �v�� v�� � A un arc tel que v� � desc�u��si v� � v�� v� est un descendant de v� il appartient donc � desc�v�� si v� � v� alors lechemin menant de u � v� en passant par v� contient exactement un arc de retour outransverse� ainsi �

u � at�u� � v� � v�

et la pr��xit� de �Y� T � implique v� � desc�u�� �

Remarques

�� Il existe toujours un sommet du graphe satisfaisant les conditions de la propositionci�dessus� En e�et� si x est la racine de �Y� T � on a at�x� � x� Si x satisfait ii��alors l�ensemble Y en entier constitue une composante fortement connexe� Sinon ilexiste un descendant y de x tel que y � at�y�� En r�p�tant cet argument plusieursfois et puisque le graphe est �ni� on �nit par obtenir un sommet satisfaisant lesdeux conditions�

Page 133: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� COMPOSANTES FORTEMENT CONNEXES ���

�� La recherche des composantes fortement connexes est alors e�ectu�e par la d�ter�mination d�un sommet u tel que u � at�u�� obtention d�une composante �gale �desc�u�� suppression de tous les sommets de desc�u� et it�ration des op�rationspr�c�dentes jusqu�� obtenir tout le graphe�

�� Sur la �gure ����� on peut se rendre compte du proc�d� de calcul� Il y a � compo�santes fortement connexes� les sommets u satisfaisant u � at�u� sont au nombrede � il s�agit de �� �� �� La premi�re composante trouv�e se compose du sommet �uniquement� il est supprim� et le sommet � devient alors tel que u � at�u�� Tousses descendants forment une composante fortement connexe f�� �� g� Apr�s leursuppression� le sommet � satisfait u � at�u� et il n�a plus de descendant satisfai�sant la m�me relation� On trouve ainsi une nouvelle composante f�� � �� �g� Unefois celle�ci supprim�e � est le seul sommet qui satisfait la relation u � at�u� d�o$la composante f�� ��� ��� ��� �� ��� ��� ��� ��g� Dans ce cas particulier du sommet�� on peut atteindre tous les sommets du graphe et le calcul s�arr�te donc l�� eng�n�ral il faut reconstruire une arborescence de Tr�maux � partir d�un sommetnon encore atteint�

L�algorithme ci�dessous calcule en m�me temps at�u� pour tous les descendants ude x et obtient successivement toutes les composantes fortement connexes de desc�x��Il utilise le fait� techniquement long � prouver mais gu�re di%cile que la suppressiondes descendants de u lorsque u � at�u� ne modi�e pas les calculs des at�v� en cours�La programmation donn�e ici suppose que les sommets ont d�j� �t� num�rot�s parl�algorithme de Tr�maux � partir de x�

static int#$ compCon �GrapheSucc g�

int num � �

int numComp#$ � new int#g�nb$�

int at#$ � new int#g�nb$�

for �int x � � x � g�nb� ��x�

numComp#x$ � �

at#x$ � Omega�

for �int x � � x � g�nb � ��x�

if �numComp#x$ �� %% at#x$ �� Omega�

num � pointAttache� �x� g� at� numComp� num��

return numComp�

static int pointAttache� �int x� GrapheSucc g�

int at#$� int numComp#$� int num�

int res � num�

at#x$ � x�

for �int k � � g�succ#x$#k$ &� Omega� k���

int y � g�succ#x$#k$�

if �at#y$ �� Omega�

res � pointAttache� �y� g� at� numComp� res��

if �at#x$ at#y$�

at#x$� at#y$�

� else

if �numComp#y$ �� �

at#x$ � Math�min �at#x$� y� �

if �x �� at#x$�

Page 134: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� CHAPITRE � GRAPHES

��res�

supprimerComp�x� res� numComp� g��

return res�

static void supprimerComp �int x� int num� int#$ numComp�

GrapheSucc g�

numComp#x$ � num�

for �int k � � g�succ#x$#k$ &� Omega� ��k�

int y � g�succ#x$#k$�

if �y x %% numComp#y$ �� �

supprimerComp �y� num� numComp� g��

�� Programmes en Caml

let m �

#� #� ��� �� � �$�

#� �� ��� � �$�

#� �� �� �� �$ �$��

let g �

#� #� � �� �� � � �$�

#� � � �� �� � � �$�

#� � � � � � � �$�

#� � � � � �� �$�

#� � �� � � � �$�

#� � � � �� � �$ �$��

let nb�lignes m � vect�length m

and nb�colonnes m �

if vect�length m � then failwith �nb�colonnes�

else vect�length m�����

�� Calcule le produit des matrices a et b ��

let multiplier a b �

if nb�colonnes a � nb�lignes b

then failwith �multiplier� else

let c �

make�matrix �nb�lignes a� �nb�colonnes b� in

for i � to nb�lignes a � � do

for j � to nb�colonnes b � � do

let cij � ref in

for k � to nb�colonnes a � � do

cij �� a��i���k� � b��k���j� � &cij�

done�

c��i���j� �� &cij

done

done�

c��

Page 135: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� PROGRAMMES EN CAML ���

�� Calcule la somme des matrices a et b ��

let ajouter a b �

if nb�colonnes a � nb�lignes b

then failwith �ajouter� else

let c �

make�matrix �nb�lignes a� �nb�colonnes b� in

for i � to nb�lignes a � � do

for j � to nb�colonnes b � � do

c��i���j� �� a��i���j� � b��i���j�

done

done�

c��

�� �l�ve la matrice m � la puissance i ��let rec puissance m i �

match i with

� � failwith �puissance�

� � � m

� n � multiplier m �puissance m �i � �����

let nombre�de�chemin�de�longueur n i j m �

�puissance m n���i���j���

let sigma i m �

let rec pow i mp �

match i with

� � � mp

� n � ajouter mp �pow �i � �� �multiplier m mp�� in

pow i m��

let existe�chemin i j m �

�sigma �nb�colonnes m� m���i���j� � ��

let phi m x �

for u � to nb�colonnes m � � do

if m��u���x� � � then

for v � to nb�colonnes m � � do

if m��x���v� � � then m��u���v� �� �

done

done��

let fermeture�transitive m �

let r(sultat �

make�matrix �nb�lignes m� �nb�colonnes m� in

for i � to nb�lignes m � � do

for j � to nb�colonnes m � � do

r(sultat��i���j� �� m��i���j�

done

done�

for x � to nb�colonnes m � � do

phi r(sultat x done�

r(sultat��

Page 136: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE � GRAPHES

�� Tableaux de successeurs ��

type graphe�point �� �int list� vect��

let omega � ����

let succ�of�mat m �

let nb�max�succ � ref in

for i � to nb�lignes m � � do

nb�max�succ �� �

for j � to nb�colonnes m � � do

if m��i���j� � � then

nb�max�succ �� max j &nb�max�succ

done�

done�

let succ �

make�matrix �nb�lignes m� �&nb�max�succ � �� in

let k � ref in

for i � to nb�lignes m � � do

k �� �

for j � to nb�colonnes m � � do

if m��i���j� � � then begin

succ��i���&k� �� j�

incr k

end

done�

succ��i���&k� �� omega

done�

succ��

�� Listes de successeurs ��

let liste�succ�of�mat m �

let gpoint � make�vect �nb�colonnes m� #$ in

for i � to nb�lignes m � � do

for j � to nb�colonnes m � � do

if m��i���j� � �

then gpoint��i� �� j �� gpoint��i�

done

done�

gpoint��

let num(ro � make�vect �vect�length succ� ������

let num � ref ������

let rec num�prefixe k � begin

incr num�

num(ro��k� �� &num�

do�list

�function x � if num(ro��x� � �� then

num�prefixe �x��

succ��k�

end��

Page 137: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� PROGRAMMES EN CAML ��

let numPrefixe�� � begin

do�vect

�function x � if num(ro��x� � �� then

num�prefixe �x��

num(ro

end��

let num�largeur k �

let f � file�vide�� in begin

fajouter k f�

while not �fvide q� do

let k � fvaleur�f� in begin

fsupprimer f�

incr num�

num(ro��k� �� &num�

do�list

�function x � if num(ro��x� � �� then

begin

fajouter x f�

num(ro��x� ��

end�

succ��k�

end

done

end��

let numLargeur�� � begin

do�vect

�function x � if num(ro��x� � �� then

num�largeur �x��

num(ro

end��

�� calcule la composante connexe de k et retourne son point dattache ��

let rec comp�connexe k � begin

incr num� num(ro��k� �� &num�

pajouter k p�

let min � ref &num in begin

do�list

�function x �

let m � if num(ro��x� � �� then

comp�connexe �x�

else

num(ro��x�

in if m � &min then

min �� m�

succ��k��

if &min � num(ro��k� then

�try while true do

printf ��d � �pvaleur�p���

num(ro��pvaleur�p�� �� max�int�

psupprimer�p��

Page 138: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE � GRAPHES

if pvaleur�p� � k then raise Exit

done

with Exit � printf ��n���

&min

end

end��

let compConnexe�� � begin

do�vect

�function x � if num(ro��x� � �� then

comp�connexe �x��

num(ro

end��

Page 139: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���

Chapitre �

Analyse Syntaxique

Un compilateur transforme un programme �crit en langage �volu� en une suited�instructions �l�mentaires ex�cutables par une machine� La construction de compi�lateurs a longtemps �t� consid�r�e comme une des activit�s fondamentale en program�mation� elle a suscit� le d�veloppement de tr�s nombreuses techniques qui ont aussidonn� lieu � des th�ories maintenant classiques� La compilation d�un programme estr�alis�e en trois phases� la premi�re !analyse lexicale" consiste � d�couper le programmeen petites entit�s� op�rateurs� mots r�serv�s� variables� constantes num�riques� alpha�b�tiques� etc� La deuxi�me phase !analyse syntaxique" consiste � expliciter la structuredu programme sous forme d�un arbre� appel� arbre de syntaxe� chaque noeud de cetarbre correspond � un op�rateur et ses �ls aux op�randes sur lesquels il agit� La troi�si�me phase !g�n�ration de code" construit la suite d�instructions du micro�processeur� partir de l�arbre de syntaxe�

Nous nous limitons dans ce chapitre � l��tude de l�analyse syntaxique� L��tude dela g�n�ration de code� qui est la partie la plus importante de la compilation� nousconduirait � des d�veloppements trop longs� En revanche� le choix aurait pu se portersur l�analyse lexicale� et nous aurait fait introduire la notion d�automate� Nous pr�f��rons illustrer la notion d�arbre� �tudi�e au chapitre �� et montrer des exemples d�arbresrepr�sentant une formule symbolique� La structure d�arbre est fondamentale en infor�matique� Elle permet de repr�senter de fa�on structur�e et tr�s e%cace des notions quise pr�sentent sous forme d�une cha�ne de caract�res� Ainsi� l�analyse syntaxique faitpartie des nombreuses situations o$ l�on transforme une entit�� qui se pr�sente sous uneforme plate et di%cile � manipuler� en une forme structur�e adapt�e � un traitemente%cace� Le calcul symbolique ou formel� le traitement automatique du langage naturelconstituent d�autres exemples de cette importante probl�matique� Notre but n�est pasde donner ici toutes les techniques permettant d��crire un analyseur syntaxique� maisde sugg�rer � l�aide d�exemples simples comment il faudrait faire� L�ouvrage de basepour l��tude de la compilation est celui de A� Aho� R� Sethi� J� Ullman ���� Les premierschapitres de l�ouvrage ���� constituent une int�ressante introduction � divers aspect del�informatique th�orique qui doivent leur d�veloppement � des probl�mes rencontr�s encompilation�

��� D� nitions et notations

���� Mots

Un programme peut �tre consid�r� comme une tr�s longue cha�ne de caract�res�dont chaque �l�ment est un des symboles le composant� Un minimum de terminologiesur les cha�nes de caract�res ou mots est n�cessaire pour d�crire les algorithmes d�analyse

Page 140: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� CHAPITRE �� ANALYSE SYNTAXIQUE

syntaxique� Pour plus de pr�cisions sur les propri�t�s alg�briques et combinatoires desmots� on pourra se reporter � �����

On utilise un ensemble �ni appel� alphabet A dont les �l�ments sont appel�s deslettres� Un mot est une suite �nie f � a�a� � � � an de lettres� l�entier n s�appelle salongueur� On note par � le mot vide� c�est le seul mot de longueur �� Le produit de deuxmots f et g est obtenu en �crivant f puis g � la suite� celui ci est not� fg� On peutnoter que la longueur de fg est �gale � la somme des longueurs de f et de g� En g�n�ralfg est di��rent de gf � Un mot f est un facteur de g s�il existe deux mots g� et g�� telsque g � g�fg��� f est facteur gauche de g si g � fg�� c�est un facteur droit si g � g�f �L�ensemble des mots sur l�alphabet A est not� A��

Exemples

�� Mots sans carr�

Soit l�alphabet A � fa� b� cg� On construit la suite de mots suivante f� � a� pourn � �� on obtient r�cursivement fn�� � partir de fn en rempla�ant a par abc� bpar ac et c par b� Ainsi�

f� � abc f� � abcacb f� � abcacbabcbac

Il est assez facile de voir que fn est un facteur gauche de fn�� pour n � �� et quela longueur de fn est � �n�� pour n � �� On peut aussi montrer que pour toutn� aucun facteur de fn n�est un carr�� c�est � dire que si gg est un facteur de fnalors g � �� On peut noter � ce propos que� si A est un alphabet compos� des deuxlettres a et b� les seuls mots sans carr� sont a� b� ab� ba� aba� bab� La constructionci�dessus� montre l�existence de mots sans carr� de longueur arbitrairement grandesur un alphabet de trois lettres�

�� Expressions pr��x�es

Les expressions pr��x�es� consid�r�es au chapitre � peuvent �tre transform�es endes mots sur l�alphabet A � f�� � �� �� ag� on remplace tous les nombres par lalettre a pour en simpli�er l��criture� En voici deux exemples�

f � �aa� g � ���a�aa�����aa��aa����� Un exemple proche de la compilation

Consid�rons l�alphabet A suivant� o$ les �lettres sont des mots sur un autrealphabet� A � fbegin� end� if� then� else� while� do� �� p� q� x� y� zgAlors f � while p do begin if q then x else y � z endest un mot de longueur �� qui peut se d�composer en

f � while p do begin g � z end

o$ g � if q then x else y�

���� Grammaires

Pour construire des ensembles de mots� on utilise la notion de grammaire� Une gram�maire G comporte deux alphabets A et �� un axiome S� qui est une lettre appartenant� � et un ensemble R de r�gles�

� L�alphabet A est dit alphabet terminal� tous les mots construits par la grammairesont constitu�s de lettres de A�

Page 141: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� D�FINITIONS ET NOTATIONS ���

� L�alphabet � est dit alphabet auxiliaire� ses lettres servent de variables interm��diaires servant � engendrer des mots� Une lettre S� de �� appel�e axiome� joue unr)le particulier�

� Les r�gles sont toutes de la forme�

S � u

o$ S est une lettre de � et u un mot comportant des lettres dans A � ��

Exemple A � fa� bg� � � fS� T� Ug� l�axiome est S�Les r�gles sont donn�es par �

S � aTbS S � bUaS S � �T � aTbT T � �U � bUaU U � �

Pour engendrer des mots � l�aide d�une grammaire� on applique le proc�d� suivant�

On part de l�axiome S� et on choisit une r�gle de la forme S� � u� Si u necontient aucune lettre auxiliaire� on a termin�� Sinon� on �crit u � u�Tu��On choisit une r�gle de la forme T � v� On remplace u par u� � u�vu��On r�p�te l�op�ration sur u� et ainsi de suite jusqu�� obtenir un mot qui necontient que des lettres de A�

Dans la mesure o$ il y a plusieurs choix possibles � chaque �tape on voit que le nombrede mots engendr�s par une grammaire est souvent in�ni� Mais certaines grammairespeuvent n�engendrer aucun mot� C�est le cas par exemple des grammaires dans lesquellestous les membres droits des r�gles contiennent un lettre de �� On peut formaliser le pro�c�d� qui engendre les mots d�une grammaire de fa�on un peu plus pr�cise en d��nissantla notion de d�rivation� Etant donn�s deux mots u et v contenant des lettres de A� ��on dit que u d�rive directement de v pour la grammaire G� et on note v � u� s�il existedeux mots w� et w� et une r�gle de grammaire S � w de G tels que v � w�Sw� etu � w�ww�� On dit aussi que v se d�rive directement en u� On dit que u d�rive de v�ou que v se d�rive en u� si u s�obtient � partir de v par une suite �nie de d�rivationsdirectes� On note alors�

v�� u

Ce qui signi�e l�existence de w�� w�� � � � wn� n � � tels que w� � v� wn � u et pour touti � �� � � � n� on a wi�� � wi�

Un mot est engendr� par une grammaire G� s�il d�rive de l�axiome et ne contientque des lettres de A� l�ensemble de tous les mots engendr�s par la grammaire G� est lelangage engendr� par G� il est not� L�G��

Exemple Reprenons l�exemple de grammaire G donn� plus haut et e�ectuons quelquesd�rivations en partant de S� Choisissons S � aTbS� puis appliquons la r�gle T � ��On obtient�

S � aTbS � abS

On choisit alors d�appliquer S � bUaS� Puis� en poursuivant� on construit la suite

Page 142: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� CHAPITRE �� ANALYSE SYNTAXIQUE

S � aTbS � abS � abbUaS � abbbUaUaS � abbbaUaS � abbbaaS � abbbaa

D�autres exemples de mots L�G� sont bbaa et abbaba que l�on obtient � l�aide de calculssimilaires�

S � bUaS � bbUaUaS � bbaUaS � bbaaS � bbaa

S � aTbS � abS � abbUaS � abbaS � abbabUaS � abbabaS � abbaba

Plus g�n�ralement� on peut montrer que� pour cet exemple� L�G� est constitu� de tousles mots qui contiennent autant de lettres a que de lettres b�

Notations Dans la suite� on adoptera des conventions strictes de notations� ceci fa�cilitera la lecture du chapitre� Les �l�ments de A sont not�s par des lettres minusculesdu d�but de l�alphabet a� b� c� � � � �ventuellement index�es si n�cessaire a�� a�� b�� b� � � ��ou bien des symboles appartenant � des langages de programmation� Les �l�ments de �sont choisis parmi les lettres majuscules S� T� U par exemple� En�n les mots de A� sontnot�s par f� g� h et ceux de �A � ��� par u� v� w� index�s si besoin est�

��� Exemples de Grammaires

���� Les syst�mes de parenth�ses

Le langage des syst�mes de parenth�ses joue un r)le important tant du point devue de la th�orie des langages que de la programmation� Dans les langages � structurede blocs� les begin end ou les � � se comportent comme des parenth�ses ouvranteset fermantes� Dans des langages comme Lisp� le d�compte correct des parenth�ses faitpartie de l�habilet� du programmeur� Dans ce qui suit� pour simpli�er l��criture� onnote a une parenth�se ouvrante et b une parenth�se fermante� Un mot de fa� bg� estun syst�me de parenth�ses s�il contient autant de a que de b et si tous ses facteursgauches contiennent un nombre de a sup�rieur ou �gal au nombre de b� Une autred��nition possible est r�cursive� un syst�me de parenth�ses f est ou bien le mot vide�f � �� ou bien form� par deux syst�mes de parenth�ses f� et f� encadr�s par a et b!f � af�bf�"� Cette nouvelle d��nition se traduit imm�diatement sous la forme de lagrammaire suivante�

A � fa� bg� � � fSg� l�axiome est S et les r�gles sont donn�es par�

S � aSbS S � �

On notera la simplicit� de cette grammaire� la d��nition r�cursive rappelle celle desarbres binaires� un tel arbre est construit � partir de deux autres comme un syst�mede parenth�ses f l�est � partir de f� et f�� La grammaire pr�c�dente a la particularit��qui est parfois un inconv�nient� de contenir une r�gle dont le membre droit est le motvide� On peut alors utiliser une autre grammaire d�duite de la premi�re qui engendrel�ensemble des syst�mes de parenth�ses non r�duits au mot vide� dont les r�gles sont�

S � aSbS S � aSb S � abS S � ab

Cette transformation peut se g�n�raliser et on peut ainsi pour toute grammaire Gtrouver une grammaire qui engendre le m�me langage� au mot vide pr�s� et qui necontient pas de r�gle de la forme S � ��

Page 143: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� EXEMPLES DE GRAMMAIRES ���

���� Les expressions arithm�tiques pr��x�es

Ces expressions ont �t� d��nies dans le chapitre � et la structure de pile a �t� utilis�epour leur �valuation� L� encore� la d��nition r�cursive se traduit imm�diatement parune grammaire�

A � f�� � �� �� ag� � � fSg� l�axiome est S� les r�gles sont donn�es par�

S � �� S S� S � � S S� S � a

Les mots donn�s en exemple plus haut sont engendr�s de la fa�on suivante�

S � �T S S��� � a a�

S � �T S S��� �T �T S S��T S S��

���T �T S�T S S���T �T S S��T S S���

�� ��� a� a a����� a a�� a a���Cette grammaire peut �tre g�n�ralis�e pour traiter des expressions faisant intervenird�autres op�rateurs d�arit� quelconque� Ainsi� pour ajouter les symboles p �� et �� Ilsu%t de consid�rer deux nouveaux �l�ments T� et T� dans � et prendre comme nouvellesr�gles�

S � �T�S� S � �T�SS� S � aT� �p

T� � � T� � � T� � T� � � T� � �

On peut aussi augmenter la grammaire de fa�on � engendrer les nombres en notationd�cimale� la lettre a devrait alors �tre remplac�e par un �l�ment U de � et des r�glessont ajout�es pour que U engendre une suite de chi�res ne d�butant pas par un ��

U � V�U� U � V U� � V U� U� � VV� � i pour � � i � V � � V � V�

���� Les expressions arithm�tiques

C�est un des langages que l�on choisit souvent comme exemple en analyse syntaxique�car il contient la plupart des di%cult�s d�analyse que l�on rencontre dans les langages deprogrammation� Les mots engendr�s par la grammaire suivante sont toutes les expres�sions arithm�tiques que l�on peut �crire avec les op�rateurs � et on les appelle parfoisexpressions arithm�tiques in�xes� On les interpr�te en disant que est prioritaire vis �vis de ��

A � f�� � �� �� ag� � � fE� T� Fg� l�axiome est E� les r�gles de grammaire sontdonn�es par�

E � T T � F F � aE � E � T T � T F F � �E�

Un mot engendr� par cette grammaire est par exemple�

�a� a a� �a a� a a�Il repr�sente l�expression

�� � � � ��� �� � �dans laquelle tous les nombres ont �t� remplac�s par le symbole a�

Les lettres de l�alphabet auxiliaire ont �t� choisies pour rappeler la signi�cation s��mantique des mots qu�elles engendrent� Ainsi E� T et F repr�sentent respectivement les

Page 144: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� CHAPITRE �� ANALYSE SYNTAXIQUE

expressions� termes et facteurs� Dans cette terminologie� on constate que toute expres�sion est somme de termes et que tout terme est produit de facteurs� Chaque facteur estou bien r�duit � la variable a ou bien form� d�une expression entour�e de parenth�ses�Ceci traduit les d�rivations suivantes de la grammaire�

E � E � T � E � T � T � � � � � ��� T � T � T � � �� T

T � T F � T F F � � � � � ��� F F F � � � F

La convention usuelle de priorit� de l�op�ration sur l�op�ration � explique quel�on commence par engendrer des sommes de termes avant de d�composer les termesen produits de facteurs� en r�gle g�n�rale pour des op�rateurs de priorit�s quelconqueson commence par engendrer les symboles d�op�rations ayant la plus faible priorit� pourterminer par ceux correspondant aux plus fortes�

On peut g�n�raliser la grammaire pour faire intervenir beaucoup plus d�op�rateurs�Il su%t d�introduire de nouvelles r�gles comme par exemple

E � E � T T � T � F

si l�on souhaite introduire des soustractions et des divisions� Comme ces deux op�rateursont la m�me priorit� que l�addition et la multiplication respectivement� il n�a pas �t�n�cessaire d�introduire de nouveaux �l�ments dans �� Il faudrait faire intervenir denouvelles variables auxiliaires si l�on introduit de nouvelles priorit�s�

La grammaire donn�e ci�dessous engendre aussi le langage des expressions in�xes�On verra que cette derni�re permet de faire plus facilement l�analyse syntaxique� Ellen�est pas utilis�e en g�n�ral en raison de questions li�es � la non�associativit� de certainsop�rateurs comme par exemple la soustraction et la division� Ceci pose des probl�meslorsqu�on d�sire g�n�raliser la grammaire et utiliser le r�sultat de l�analyse syntaxiquepour e�ectuer la g�n�ration d�instructions machine�

E � T T � F F � aE � T �E T � F T F � �E�

���� Grammaires sous forme BNF

La grammaire d�un langage de programmation est tr�s souvent pr�sent�e sous laforme dite grammaire BNF qui n�est autre qu�une version tr�s l�g�rement di��rente denotre pr�c�dente notation�

Dans la convention d��criture adopt�e pour la forme BNF� les �l�ments de � sontdes suites de lettres et symboles comme MultiplicativeExpression� UnaryExpression� Lesr�gles ayant le m�me �l�ment dans leur partie gauche sont regroup�es et cet �l�mentn�est pas r�p�t� pour chacune d�entre elles� Le symbole � est remplac� par � suivi d�unpassage � la ligne� Quelques conventions particuli�res permettent de raccourcir l��criture�ainsi one of permet d��crire plusieurs r�gles sur la m�me ligne� En�n� les �l�ments del�alphabet terminal A sont les mots�cl�� comme class� if� then� else� for� � � �� et lesop�rateurs ou s�parateurs comme � � � � � � � � � �� � � �

Dans les grammaires donn�es en annexe� on compte dans la grammaire de Java ���lettres pour l�alphabet auxiliaire et ��� r�gles� Il est hors de question de traiter ici decet exemple trop long� Nous nous limitons aux exemples donn�s plus haut dans lesquels�gurent d�j� toutes les di%cult�s que l�on peut trouver par ailleurs�

Notons toutefois que l�on trouve la grammaire des expressions arithm�tiques sousforme BNF dans l�exemple de la grammaire de Java donn�e en annexe� On trouve ene�et � l�int�rieur de cette grammaire�

Page 145: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� EXEMPLES DE GRAMMAIRES ���

AdditiveExpression�MultiplicativeExpressionAdditiveExpression � MultiplicativeExpressionAdditiveExpression � MultiplicativeExpression

MultiplicativeExpression�UnaryExpressionMultiplicativeExpression � UnaryExpressionMultiplicativeExpression � UnaryExpressionMultiplicativeExpression � UnaryExpression

UnaryExpression�PreIncrementExpressionPreDecrementExpression� UnaryExpression� UnaryExpressionUnaryExpressionNotPlusMinus

UnaryExpressionNotPlusMinus�PostxExpression� UnaryExpression UnaryExpressionCastExpression

PostxExpression�PrimaryNamePostIncrementExpressionPostDecrementExpression

Primary�PrimaryNoNewArrayArrayCreationExpression

PrimaryNoNewArray�Literalthis

Expression �

ClassInstanceCreationExpressionFieldAccessMethodInvocationArrayAccess

Ceci correspond approximativement dans notre notation �

E �M E � E � M E � E � MM � U M � P � U M �M � U M �M � UU � I U � DU � �U U � �U U � U �

U � � P � U � � �U U � � �U U � � CP � P � P � N P � I � P � D�

P � � P �� P � � AP �� � L P �� � this P �� � �E� � � �

Page 146: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� ANALYSE SYNTAXIQUE

S

a S

a S

b S

b S

a S

b S

a S

b S

Fig� �� � Arbre de d�rivation de aabbabab

��� Arbres de d�rivation et arbres de syntaxe abstraite

Le but de l�analyse syntaxique est d�abord d�terminer si un mot appartient ounon au langage engendr� par une grammaire� Il s�agit donc� �tant donn� un mot f deconstruire la suite des d�rivations qui a permis de l�engendrer� Si l�on pratique ceci � lamain pour de petits exemples on peut utiliser la technique classique dite �essais�erreurs consistant � tenter de deviner � partir d�un mot la suite des d�rivations qui ont permis del�engendrer� Cette suite se pr�sente bien plus clairement sous forme d�un arbre� dit arbrede d�rivation dont des exemples sont donn�s �gures �� et ��� Il s�agit de ceux obtenuspour les mots aabbabab et �a � a a� �a a � a a� engendr�s respectivement par lagrammaire des syst�mes de parenth�ses et par celle des expressions in�xes� On verra queces arbres� ou plut)t une version plus compact de ceux�ci� jouent un r)le important pourla phase suivante de la compilation� Une d��nition rigoureuse et compl�te des arbresde d�rivation serait longue� contentons nous de quelques indications informelles� Dansun tel arbre� les noeuds internes sont �tiquet�s par des lettres auxiliaires !appartenant� �" les feuilles par des lettres de l�alphabet terminal� L��tiquette de la racine est �gale� l�axiome� Pour un noeud interne d� �tiquette S� le mot u obtenu en lisant de gauche� droite les �tiquettes de ses �ls est tel que S � u est une r�gle� En�n� le mot f donton fait l�analyse est constitu� des �tiquettes des feuilles lues de gauche � droite�

Pour un mot donn� du langage engendr� par une grammaire� l�arbre de d�rivationn�est pas n�cessairement unique� L�existence de plusieurs arbres de d�rivations pourun m�me programme signi�e en g�n�ral qu�il existe plusieurs interpr�tations possiblespour celui ci� On dit que la grammaire est ambigu1� c�est le cas pour l�imbrication desif then et if then else en Pascal� Des indications suppl�mentaires dans le manuel der�f�rence du langage permettent alors de lever l�ambigu.t� et d�associer un arbre unique� tout programme Pascal� Ceci permet de donner alors une interpr�tation unique� Toutesles grammaires donn�es plus haut sont non�ambigu1s� ceci peut se d�montrer rigoureu�sement� toutefois les preuves sont souvent techniques et ne pr�sentent pas beaucoupd�int�r�t�

L�arbre de d�rivation est parfois appel� arbre de syntaxe concr�te pour le distinguerde l�arbre de syntaxe abstraite construit g�n�ralement par le compilateur d�un langagede programmation� Cet arbre de syntaxe abstraite est plus compact que le pr�c�dent etcontient des informations sur la suite des actions e�ectu�es par un programme� Chaque

Page 147: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� ARBRES DE D�RIVATION ET ARBRES DE SYNTAXE ABSTRAITE ��

E

T

T

F

� E

E

T

F

a

� T

T

F

a

F

a

F

� E

E

T

T

F

a

F

a

� T

T

F

a

F

a

Fig� �� � Arbre de d�rivation d�une expression arithm�tique

Page 148: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� ANALYSE SYNTAXIQUE

a

a a

a a

a a

Fig� �� � Arbre de syntaxe abstraite de l�expression

noeud interne de cet arbre poss�de une �tiquette qui d�signe une op�ration � ex�cuter�Il s�obtient par des transformations simples � partir de l�arbre de d�rivation� On donneen exemple �gure �� l�arbre de syntaxe abstraite correspondant � l�arbre de d�rivationde la �gure ���

�� Analyse descendante r�cursive

Deux principales techniques sont utilis�es pour e�ectuer l�analyse syntaxique� Il fauten e�et� �tant donn�s une grammaire G et un mot f � de construire la suite des d�rivationsde G ayant conduit de l�axiome au mot f �

S� � u� � u� � � � un�� � un � f

La premi�re technique consiste � d�marrer de l�axiome et � tenter de retrouver u�� puisu� jusqu�� obtenir un � f � c�est l�analyse descendante� La seconde� l�analyse ascendanteproc�de en sens inverse� il s�agit de commencer par deviner un�� � partir de f puisde remonter � un�� et successivement jusqu�� l�axiome S�� Nous d�crivons ici sur desexemples les techniques d�analyse descendante� l�analyse ascendante sera trait�e dansun paragraphe suivant�

La premi�re m�thode que nous consid�rons s�applique � des cas tr�s particuliers�Dans ces cas� l�algorithme d�analyse syntaxique devient une traduction �d�le de l��cri�ture de la grammaire� On utilise pour cela autant de proc�dures qu�il y a d��l�mentsdans � chacune d�entre elles �tant destin�e � reconna�tre un mot d�rivant de l��l�mentcorrespondant de �� Examinons comment cela se passe sur l�exemple de la grammairedes expressions in�xes� nous choisissons ici la deuxi�me forme de cette grammaire�

E � T T � F F � aE � T �E T � F T F � �E�

Que l�on traduit par les trois proc�dures r�cursives crois�es suivantes en Java� Celles ciconstruisent l�arbre de syntaxe abstraite comme dans le chapitre ��

class ASA

char op�

ASA filsG� filsD�

ASA �char x� ASA a� ASA b�

op � x�

Page 149: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANALYSE DESCENDANTE R�CURSIVE ���

filsG � a�

filsD � b�

static String f�

static int i � �

static ASA expression�� throws ErreurDeSyntaxe

ASA a � terme���

if �f�charAt�i� �� '�'�

��i�

return new ASA�'�'� a� expression����

else return a�

static ASA terme�� throws ErreurDeSyntaxe

ASA a � facteur���

if �f�charAt�i� �� '�'�

��i�

return new ASA �'�'� a� terme����

else return a�

static ASA facteur�� throws ErreurDeSyntaxe

if �f�charAt�i� �� '�'�

��i�

ASA a � expression���

if �f�charAt�i� �� '�'�

��i�

return a�

else throw new ErreurDeSyntaxe�i��

else if �f�charAt�i� �� 'a'�

��i�

return new ASA �'a'� null� null��

else throw new ErreurDeSyntaxe�i��

Dans ce programme� le mot f � analyser est une variable globale� Il en est de m�mepour la variable enti�re i qui d�signe la position � partir de laquelle on e�ectue l�ana�lyse courante� Lorsqu�on active la proc�dure expression� on recherche une expressioncommen�ant en f i�� A la �n de l�ex�cution de cette proc�dure� si aucune erreur n�estd�tect�e� la nouvelle valeur !appelons la i�" de i est telle que f i�f i� �����f i� � �� estune expression� Il en est de m�me pour les proc�dures terme et facteur� Chacune deces proc�dures tente de retrouver � l�int�rieur du mot � analyser une partie engendr�epar E� T ou F � Ainsi� la proc�dure expression commence par rechercher un terme� Unnouvel appel � expression est e�ectu� si ce terme est suivi par le symbole �� Son actionse termine sinon� La proc�dure terme est construite sur le m�me mod�le et la proc�dure

Page 150: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� CHAPITRE �� ANALYSE SYNTAXIQUE

facteur recherche un symbole a ou une expression entour�e de parenth�ses� Si une er�reur de syntaxe est d�tect�e� on envoit une exception avec la position courante dans lemot � reconnaitre� ce qui permettra de pr�ciser l�endroit o$ l�erreur a �t� rencontr�e�La classe de l�exception est de�nie par�

class ErreurDeSyntaxe extends Exception

int position�

public ErreurDeSyntaxe �int i�

position � i�

Cette technique fonctionne bien ici car les membres droits des r�gles de grammaireont une forme particuli�re� Pour chaque �l�ment S de �� l�ensemble des membres droitsfu�� u� � � � upg de r�gles� dont le membre gauche est S� satisfait les conditions suivantes�les premi�res lettres des ui qui sont dans A� sont toutes distinctes et les ui qui com�mencent par une lettre de � sont tous facteurs gauches les uns des autres� Beaucoup degrammaires de langages de programmation satisfont ces conditions� Pascal� Java�

Une technique plus g�n�rale d�analyse consiste � proc�der comme suit� On construitit�rativement des mots u dont on esp�re qu�ils vont se d�river en f � Au d�part on au � S�� A chaque �tape de l�it�ration� on cherche la premi�re lettre de u qui n�est pas�gale � son homologue dans f � On a ainsi

u � gyv f � gxh x � y

Si y � A� alors f ne peut d�river de u� et il faut faire repartir l�analyse du mot qui adonn� u� Sinon y � � et on recherche toutes les r�gles dont y est le membre gauche�

y � u�� y � u�� � � � y � uk

On applique � u successivement chacune de ces r�gles� on obtient ainsi des motsv�� v�� � � � vk� On poursuit l�analyse� chacun des mots v�� v�� � � � vk jouant le r)le de u�L�analyse est termin�e lorsque u � f � La technique est celle de l�exploration arborescentequi sera d�velopp�e au Chapitre � On peut la repr�senter par la proc�dure suivantedonn�e sous forme informelle�

static boolean Analyse �String u� f�

if �f�equals�u��

return true�

else

Mettre f et u sous la forme f � gxh� u � gyv o� x �� y

if �y �� A�

Pour toute r�gle y � w faireif �Analyse�g � w � v� f��

return true�

return false�

On �crit donc un programme comme suit en utilisant la fonction estAuxiliaire�y quivaut vrai ssi y � �� On suppose que les mots f et u se terminent respectivement par� et � il s�agit l� de sentinelles permettant de d�tecter la �n de ces mots� On supposeaussi que l�ensemble des r�gles est contenu dans un tableau regle�S��i� qui donnela i � ���me r�gle dont le membre gauche est S� Le nombre de r�gles dont le membregauche est S est fourni par nbRegles�S��

Page 151: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANALYSE LL ���

static int pos � ��

static boolean analyseDescendante �String u� String f�

while �f�charAt�pos� �� u�charAt�pos��

��pos�

if �f�charAt�pos� �� '*' %% u�charAt�pos� �� '�'�

return true�

else

char y � u#pos$�

if �estAuxiliaire�y��

for �int i � � i � nbRegles#y$� ��i�

String v � u�substring�� pos� � regle#y$#i$

� u�substring�pos����

if �Analyse �v� f��

return true�

return false�

Remarques

�� Cette proc�dure ne donne pas de r�sultat lorsque la grammaire est ce qu�on appeller�cursive � gauche !le mot r�cursif n�a pas ici tout � fait le m�me sens que dans lesproc�dures r�cursives"� c�est � dire lorsqu�il existe une suite de d�rivations partantd�un S de � et conduisant � un mot u qui commence par S� Tel est le cas pour lapremi�re forme de la grammaire des expressions arithm�tiques in�xes qui ne peutdonc �tre analys�e par l�algorithme ci dessus�

�� Les transformations que l�on applique au mot u s�expriment bien � l�aide d�unepile dans laquelle on place le mot � analyser� sa premi�re lettre en sommet de pile�

�� Cette proc�dure est tr�s co#teuse en temps lors de l�analyse d�un mot assez longcar on e�ectue tous les essais successifs des r�gles et on peut parfois se rendrecompte� apr�s avoir pratiquement termin� l�analyse� que la premi�re r�gle appli�qu�e n�est pas la bonne� Il faut alors tout recommencer avec une autre r�gle et�ventuellement r�p�ter plusieurs fois� La complexit� de l�algorithme est ainsi unefonction exponentielle de la longueur du mot � analyser�

�� Si on suppose qu�aucune r�gle ne contient un membre droit �gal au mot vide� onpeut diminuer la quantit� de calculs e�ectu�s en d�butant la proc�dure d�analysepar un test v�ri�ant si la longueur de u est sup�rieure � celle de f � Dans ce cas�la proc�dure d�analyse doit avoir pour r�sultat false� Noter que dans ces condi�tions la proc�dure d�analyse donne un r�sultat m�me dans le cas de grammairesr�cursives � gauche�

�� Analyse LL

Une technique pour �viter les calculs longs de l�analyse descendante r�cursive consiste� tenter de deviner la premi�re r�gle qui a �t� appliqu�e en examinant les premi�reslettres du mot f � analyser� Plus g�n�ralement� lorsque l�analyse a d�j� donn� le mot uet que l�on cherche � obtenir f � on �crit comme ci�dessus

f � gh� u � gSv

Page 152: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� CHAPITRE �� ANALYSE SYNTAXIQUE

et les premi�res lettres de h doivent permettre de retrouver la r�gle qu�il faut appliquer� S� Cette technique n�est pas syst�matiquement possible pour toutes les grammaires�mais c�est le cas sur certaines comme par exemple celle des expressions pr��x�es ou unegrammaire modi��e des expressions in�xes� On dit alors que la grammaire satisfait lacondition LL�

Expressions pr��x�es Nous consid�rons la grammaire de ces expressions�

A � f�� � �� �� ag� � � fSg� l�axiome est S� les r�gles sont donn�es par�

S � �� S S� S � � S S� S � a

Pour un mot f de A�� il est imm�diat de d�terminer u� tel que

S � u��� f

En e�et� si f est de longueur �� ou bien f � a et le r�sultat de l�analyse syntaxique selimite � S � a� ou bien f n�appartient pas au langage engendr� par la grammaire�

Si f est de longueur sup�rieure � �� il su%t de conna�tre les deux premi�res lettresde f pour pouvoir retrouver u�� Si ces deux premi�res lettres sont ��� c�est la r�gleS � ��SS� qui a �t� appliqu�e� si ces deux lettres sont � alors c�est la r�gle S � �SS��Tout autre d�but de r�gle conduit � un message d�erreur�

Ce qui vient d��tre dit pour retrouver u� en utilisant les deux premi�res lettres de fse g�n�ralise sans di%cult� � la d�termination du �i � ���me mot ui�� de la d�rivation� partir de ui� On d�compose d�abord ui et f en�

ui � giSvi f � gifi

et on proc�de en fonction des deux premi�res lettres de fi�

� Si fi commence par a� alors ui�� � giavi

� Si fi commence par ��� alors ui�� � gi��SS�vi

� Si fi commence par �� alors ui�� � gi�SS�vi� Un autre d�but pour fi signi�e que f n�est pas une expression pr��x�e correcte�

il y a une erreur de syntaxe�

Cet algorithme reprend les grandes lignes de la descente r�cursive avec une di��renceimportante� la boucle while qui consistait � appliquer chacune des r�gles de la gram�maire est remplac�e par un examen de certaines lettres du mot � analyser� examen quipermet de conclure sans retour arri�re� On passe ainsi d�une complexit� exponentielle� un algorithme en O�n�� En e�et� une mani�re e%cace de proc�der consiste � utiliserune pile pour g�rer le mot vi qui vient de la d�composition ui � giSvi� La consultationde la valeur en t�te de la pile et sa comparaison avec la lettre courante de f permet ded�cider de la r�gle � appliquer� L�application d�une r�gle consiste alors � supprimer lat�te de la pile !membre gauche de la r�gle" et � y ajouter le mot formant le membredroit en commen�ant par la derni�re lettre�

Nous avons appliqu� cette technique pour construire l�arbre de syntaxe abstraiteassoci� � une expression pr��x�e� Dans ce qui suit� le mot � analyser f est une variableglobale de m�me que la variable enti�re pos qui indique la position � laquelle on setrouve dans ce mot�

static Arbre ArbSyntPref��

Arbre a�

char x�

Page 153: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANALYSE LL ���

if �f�charAt�pos� �� 'a'�

a � NouvelArbre�'a'� null� null��

��pos�

� else if �f�charAt�pos� �� '�' %%

�f�charAt�pos��� �� '�' �� f�charAt�pos��� �� '�'��

x � f�charAt�pos � ���

pos � pos � ��

a � NouvelArbre�x� ArbSyntPref��� ArbSyntPref����

if �f�charAt�pos� �� '�'�

��pos�

else

erreur�pos��

� else

erreur�pos��

return a�

L�algorithme d�analyse syntaxique donn� ici peut s��tendre � toute grammaire danslaquelle pour chaque couple de r�gles S � u et S � v� les mots qui d�rivent de u et vn�ont pas des facteurs gauches �gaux de longueur arbitraire� Ou de mani�re plus pr�cise�il existe un entier k tel que tout facteur gauche de longueur k appartenant � A� d�unmot qui d�rive de u est di��rent de celui de tout mot qui d�rive de v� On dit alors quela grammaire est LL�k� et on peut alors d�montrer�

Th�or�me Si G est une grammaire LL�k�� il existe un algorithme en O�n� qui ef�fectue l�analyse syntaxique descendante d�un mot f de longueur n�

En fait� cet algorithme est surtout utile pour k � �� Nous donnons ici ses grandes lignessous forme d�un programme Pascal qui utilise une fonction Predicteur�S� g� calcul�eau pr�alable� Pour un �l�ment S de � et un mot g de longueur k� cette fonction indiquele num�ro de l�unique r�gle S � u telle que u se d�rive en un mot commen�ant par gou qui indique Omega si aucune telle r�gle n�existe� Dans l�algorithme qui suit� on utiliseune pile comme variable globale� Elle contient la partie du mot u qui doit engendrer cequi reste � lire dans f � Nous en donnons ici une forme abr�g�e�

static boolean Analyse�String f� int pos�

int i�

pos � ��

while �Pile�valeur�p� �� f�charAt�pos��

Pile�supprimer�p��

��pos�

if �Pile�vide�p� %% f�charAt�pos� �� '*'�

return true�

else

y � Pile�valeur�p��

if �& estAuxiliaire�y��

return false�

else

i � Predicteur �y� pos� pos�k����

if �i &� Omega�

System�out�println �y� '�'� regle#y$#i$��

Pile�inserer�regle#y�i$� p��

Page 154: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� CHAPITRE �� ANALYSE SYNTAXIQUE

return Analyse �f� pos��

� else

return false�

��� Analyse ascendante

Les algorithmes d�analyse ascendante sont souvent plus compliqu�s que ceux del�analyse descendante� Ils s�appliquent toutefois � un beaucoup plus grand nombre degrammaires� C�est pour cette raison qu�ils sont tr�s souvent utilis�s� Ils sont ainsi � labase du syst�me yacc qui sert � �crire des compilateurs sous le syst�me Unix� Rappelonsque l�analyse ascendante consiste � retrouver la d�rivation

S� � u� � u� � � � un�� � un � f

en commen�ant par un�� puis un�� et ainsi de suite jusqu�� remonter � l�axiome S�� One�ectue ainsi ce que l�on appelle des r�ductions car il s�agit de remplacer un membredroit d�une r�gle par le membre gauche correspondant� celui�ci est en g�n�ral plus court�

Un exemple de langage qui n�admet pas d�analyse syntaxique descendante simple�mais sur lequel on peut e�ectuer une analyse ascendante est le langage des syst�mes deparenth�ses� Rappelons sa grammaire�

S � aSbS S � aSb S � abS S � ab

On voit bien que les r�gles S � aSbS et S � aSb peuvent engendrer des mots ayantun facteur gauche commun arbitrairement long� ce qui interdit tout algorithme de typeLL�k�� Cependant� nous allons donner un algorithme simple d�analyse ascendante d�unmot f �

Partons de f et commen�ons par tenter de retrouver la derni�re d�rivation� celle quia donn� f � un � partir d�un mot un��� N�cessairement un�� contenait un S qui a �t�remplac� par ab pour donner f � L�op�ration inverse consiste donc � remplacer un abpar S� mais ceci ne peut pas �tre e�ectu� n�importe o$ dans le mot� ainsi si on a

f � ababab

il y a trois remplacements possibles donnant

Sabab� abSab� ababS

Les deux premiers ne permettent pas de poursuivre l�analyse� En revanche� � partir dutroisi�me� on retrouve abS et �nalement S� D�une mani�re g�n�rale on remplace ab parS chaque fois qu�il est suivi de b ou qu�il est situ� en �n de mot� Les autres r�gles degrammaires s�inversent aussi pour donner des r�gles d�analyse syntaxique� Ainsi�

� R�duire aSb en S s�il est suivi de b ou s�il est situ� en �n de mot�

� R�duire ab en S s�il est suivi de b ou s�il est situ� en �n de mot�

� R�duire abS en S quelle que soit sa position�

� R�duire aSbS en S quelle que soit sa position�

Page 155: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� EVALUATION ���

On a un algorithme du m�me type pour l�analyse des expressions arithm�tiques in�xesengendr�es par la grammaire�

E � T T � F F � aE � E � T T � T F F � �E�E � E � T

Cet algorithme tient compte pour e�ectuer une r�duction de la premi�re lettre quisuit le facteur que l�on envisage de r�duire !et de ce qui se trouve � gauche de cefacteur"� On dit que la grammaire est LR���� La th�orie compl�te de ces grammairesm�riterait un plus long d�veloppement� Nous nous contentons de donner ici ce qu�onappelle l�automate LR��� qui e�ectue l�analyse syntaxique de la grammaire� r�cursive� gauche� des expressions in�xes� Noter que l�on a introduit l�op�rateur de soustractionqui n�est pas associatif� Ainsi la technique d�analyse d�crite au d�but du paragraphe ��ne peut �tre appliqu�e ici�

On lit le mot � analyser de gauche � droite et on e�ectue les r�ductions suivantes d�squ�elles sont possibles�

� R�duire a en F quelle que soit sa position�

� R�duire �E� en F quelle que soit sa position�

� R�duire F en T s�il n�est pas pr�c�d� de �� R�duire T F en T quelle que soit sa position�

� R�duire T en E s�il n�est pas pr�c�d� de � et s�il n�est pas suivi de �� R�duire E � T en E s�il n�est pas suivi de �� R�duire E � T en E s�il n�est pas suivi de �

On peut g�rer le mot r�duit � l�aide d�une pile� Les op�rations de r�duction consistent� supprimer des �l�ments dans celle�ci� les tests sur ce qui pr�c�de ou ce qui suit se fonttr�s simplement en consultant les premiers symboles de la pile� On peut construire aussiun arbre de syntaxe abstraite en utilisant une autre pile qui contient cette fois des arbres!c�est � dire des pointeurs sur des noeuds"� Les deux piles sont trait�es en parall�le� lar�duction par une r�gle a pour e�et sur la deuxi�me pile de construire un nouvel arbredont les �ls se trouvent en t�te de la pile� puis � remettre le r�sultat dans celle�ci�

��� Evaluation

Dans la plupart des algorithmes que nous avons donn�s� il a �t� question d�arbre desyntaxe abstraite d�une expression arithm�tique� A�n d�illustrer l�int�r�t de cet arbre�on peut examiner la simplicit� de la fonction d��valuation qui permet de calculer lavaleur de l�expression analys�e � partir de l�arbre de syntaxe abstraite�

static int evaluer�Arbre x�

if �x�valeur �� 'a'�

return x�valeur�

else if �x�valeur �� '�'�

return evaluer�x�filsG� � evaluer�x�filsD��

else if �x�valeur �� '�'�

Page 156: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� ANALYSE SYNTAXIQUE

return evaluer�x�filsG� � evaluer�x�filsD��

else if �x�valeur �� '�'�

return evaluer�x�filsG� � evaluer �x�filsD��

Une fonction similaire� qui ne demanderait pas beaucoup de mal � �crire� permet decr�er une suite d�instructions en langage machine traduisant le calcul de l�expression�Il faudrait remplacer les op�rations �� �� �� e�ectu�es lors de la visite d�un noeud del�arbre� par la concat�nation des listes d�instructions qui calculent le sous�arbre droitet le sous arbre gauche de ce noeud et de faire suivre cette liste par une instructionqui op�re sur les deux r�sultats partiels� Le programme complet qui en r�sulte d�passetoutefois le but que nous nous �xons dans ce chapitre�

��� Programmes en Caml

type asa �

Feuille of char

� Noeud of char � asa � asa��

exception erreur�de�syntaxe of int��

let f � � �a � a � a � ���

let i � ref ��

let rec expression �� �

let a � terme �� in

if f�#&i$ � )�) then begin

incr i�

Noeud �)�)� a� expression ��� end

else a

and terme �� �

let a � facteur �� in

if f�#&i$ � )�) then begin

incr i�

Noeud �)�)� a� terme ��� end

else a

and facteur �� �

if f�#&i$ � )�) then begin

incr i�

let a � expression �� in

if f�#&i$ � )�) then begin

incr i�

a end

else raise �erreur�de�syntaxe &i� end

else

if f�#&i$ � )a)

then begin

incr i�

Feuille )a) end

else raise �erreur�de�syntaxe &i���

�� Prdicat d�nissant les non�terminaux ��

Page 157: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� PROGRAMMES EN CAML ��

let est�auxiliaire y � ��� ��

�� r�gle��s���i� est la i�me r�gle dont le membre gauche est s ��

let r+gle �

#� #� s� s�� ��� �$�

#� s�� s��� ��� �$�

#� si� si�� ��� �$�

��� �$��

�� nbr�gle��s� est le nombre de r�gles dont le membre gauche est s ��

let nbr+gle � #� s� ���� sn �$��

�� Fonction auxiliaire sur les cha�nes de caract�res� remplacer s pos char renvoit unecopie de la cha�ne s avec char en position pos ��

let remplacer s pos char �

let s� � make�string �string�length s� ) ) in

blit�string s s� �string�length s��

s��#pos$ �� char�

s���

let analyse�descendante f u �

let b � ref false in

let pos � ref in

while f�#&pos$ � u�#&pos$ do incr pos done�

if f#&pos$ � )*) %% u�#&pos$ � )�)

then

true

else

let y � u�#&pos$ in

if est�auxiliaire y

then begin

let i � ref in

let ynum � int�of�char y � int�of�char )A) in

while not &b %% &i �� nbr+gle��ynum� do

b �� analyse�r(cursive

�remplacer �u� &pos� r+gle��ynum���&i��� f��

else incr i

done�

&b end

else false��

�� Analyse LL���� voir page ��� ��

let rec arbre�synt�pref �� �

if f�#&pos$ � )a)

then begin

incr pos�

Feuille )a) end

else

if f�#&pos$ � )�)

%% f�#&pos � �$ � )�)

�� f�#&pos � �$ � )�)

then begin

let x � f�#&pos � �$ in

pos �� &pos � ��

Page 158: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� ANALYSE SYNTAXIQUE

let a � arbre�synt�pref �� in

let b � arbre�synt�pref �� in

if f�#&pos$ � )�)

then Noeud �x� a� b�

else erreur �&pos� end

else erreur�&pos���

�� �valuation� voir page ��� ��

type expression �

� Constante of int

� Op(ration of char � expression � expression��

let rec (valuer � function

� Constante i � i

� Op(ration �'�'� e�� e�� � (valuer e� � (valuer e�

� Op(ration �'�'� e�� e�� � (valuer e� � (valuer e���

Page 159: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���

Chapitre �

Modularit�

Jusqu�� pr�sent� nous n�avons vu que l��criture de petits programmes ou de pro�c�dures su%sant pour apprendre les structures de donn�es et les algorithmes corres�pondants� La partie la plus importante de l��criture des vrais programmes consiste �les structurer pour les pr�senter comme un assemblage de briques qui s�emboitent na�turellement� Ce probl�me� qui peut appara�tre comme purement esth�tique� se r�v�lefondamental d�s que la taille des programmes devient cons�quente� En e�et� si on neprend pas garde au bon d�coupage des programmes en modules ind�pendants� on seretrouve rapidement d�bord� par un grand nombre de variables ou de fonctions� et ildevient quasiment impossible de r�aliser un programme correct�

Dans ce chapitre� il sera question de modules� d�interfaces� de compilation s�par�eet de reconstruction incr�mentale de programmes�

��� Un exemple� les les de caract�res

Pour illustrer notre chapitre� nous utilisons un exemple r�el tir� du noyau du syst�meUnix� Les �les ont �t� d�crites dans le chapitre � sur les structures de donn�es �l�mentai�res� Nous avons vu deux mani�res de les impl�menter� par un tableau circulaire ou parune liste� Les �les de caract�res sont tr�s couramment utilis�es� par exemple pour g�rerles entr�es&sorties d�un terminal !tty driver" ou du r�seau Ethernet�

La repr�sentation des �les de caract�res par des listes cha�n�es est co#teuse en espacem�moire� En e�et� si un pointeur est repr�sent� par une m�moire de � ou octets!adresse m�moire sur �� ou � bits"� il faut � ou � octets par �l�ment de la �le� etdonc �N ou N octets pour une �le de N caract�res' C�est beaucoup� La repr�sentationpar tableau circulaire semble donc meilleure du point de vue de l�occupation m�moire�Toutefois� elle est plus statique puisque� pour chaque �le� il faut r�server � l�avance laplace n�cessaire pour le tableau circulaire�

Introduisons une troisi�me r�alisation possible de ces �les� Au lieu de repr�senter la�le par une liste de tous les caract�res la constituant� nous allons regrouper les caract�respar blocs contigus de t caract�res� Les premier et dernier �l�ments de la liste pourront�tre incomplets !comme indiqu� dans la �gure ��"� Ainsi� si t � ��� une �le de Ncaract�res utilise environ �� � t��N�t octets pour des adresses sur �� bits� ce qui faitun incr�ment tout � fait acceptable de �� d�octet par caract�re� !En Java� on peut �treamen� � doubler la taille de chaque bloc� puisque les caract�res prennent deux octets"�

Une �le de caract�res sera alors d�crite par un objet donnant le nombre d��l�mentsde la �le� les bases et d�placements des premiers et derniers caract�res de la �le dans lespremiers et derniers blocs les contenant� Par base et d�placement d�un caract�re� nousentendons une r�f�rence vers un bloc de la liste contenant le caract�re et son adresse

Page 160: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� MODULARIT�

d�but

�n

t

Fig� �� � File de caract�res

relative dans ce bloc comme indiqu� sur la �gure ��� La d�claration de la classe FCd�une �le de caract�res s�e�ectue comme suit�

class FC

int cc�

Bloc debut�b� fin�b�

int debut�d� fin�d�

FC ��

cc � �

static class Bloc

final static int TAILLE � ���

Bloc suivant�

char #$ contenu�

Bloc ��

suivant � null�

contenu � new char#TAILLE$�

La �le vide est repr�sent�e par un compte de caract�res nul�

static FC vide ��

return new FC���

L�ajout et la suppression d�un caract�re dans une �le s�e�ectuent comme au chapitre ��Pour respecter la structure des blocs� il faut tester si le caract�re suivant est dansle m�me bloc ou s�il est n�cessaire d�aller chercher le bloc suivant dans la liste des

Page 161: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� UN EXEMPLE� LES FILES DE CARACT�RES ��

b d

� � � �

Fig� �� � Adresse d�un caract�re par base et d�placement

blocs� Lors de l�ajout� il faut allouer un nouveau bloc dans le cas de la �le vide ou dufranchissement d�un bloc�

static FC ajouter �char c� FC x�

Bloc b�

if �x�cc �� �

b � new Bloc���

x�debut�b � b� x�debut�d � �

x�fin�b � b� x�fin�d � ���

� else if �x�fin�d �� Bloc�TAILLE � ��

b � new Bloc���

x�fin�b�suivant � b�

x�fin�b � b� x�fin�d � ���

x�fin�b�contenu#��x�fin�d$ � c�

��x�cc�

return x�

La suppression s�e�ectue au d�but de �le� Pour la suppression� il faut au contraire rendreun bloc si le caract�re supprim� !rendu en r�sultat" lib�re un bloc� Par convention� nousretournons le caract�re nul quand on demande de supprimer un caract�re dans une �levide� Une meilleure solution aurait �t� de retourner une exception�

static char supprimer �FC x�

char res�

if �x�cc �� �

return ���

else

res � x�debut�b�contenu#x�debut�d$�

��x�cc�

��x�debut�d�

if �x�debut�d � Bloc�TAILLE�

x�debut�b � x�debut�b�suivant�

x�debut�d � �

return res�

Page 162: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� MODULARIT�

��� Interfaces et modules

Reprenons l�exemple pr�c�dent� Supposons qu�un programme� comme un gestion�naire de terminaux� utilise des �les de caract�res� une pour chaque terminal� On ne doitpas m�langer la gestion des �les de caract�res avec le reste de la logique du programme�Il faut donc regrouper les proc�dures traitant des �les de caract�res� Le programmeutilisant les �les de caract�res n�a pas besoin de conna�tre tous les d�tails de l�impl��mentation de ces �les� Il ne doit conna�tre que la d�claration des types utiles dans laclasse FC� le nom de la classe et les trois proc�dures pour initialiser une �le vide� ajouterun �l�ment au bout de la �le et retirer le premier �l�ment� Pr�cis�ment� on peut secontenter de l�interface suivante�

class FC

static FC vide �� ����

�� Retourne une �le vide ��

static FC ajouter �char c� FC x� ����

�� Ajoute c au bout de la �le x ��

static int supprimer �FC x� ����

�� Supprime le premier caract�re c de x et rend c comme rsultat ��

�� Si x est vide� le rsultat est �� ��

On ne manipulera les �les de caract�res qu�� travers cette interface� Pas question deconna�tre la structure interne de ces �les� Ni de savoir si elles sont organis�es par desimples listes� des tableaux circulaires ou des blocs encha�n�s� On dira que le programmeutilisant des �les de caract�res � travers l�interface pr�c�dente importe cette interface�Le corps des proc�dures sur les �les seront dans la partie impl�mentation du module des�les de caract�res� Dans l�interface d�un module� on a donc des types� des proc�dures oudes fonctions que l�on veut exporter ou rendre publiques� et il est bon d�y commenter lafonctionnalit� de chaque �l�ment pour comprendre sa signi�cation� puisqu�un utilisateurn�aura besoin que de consulter l�interface� Dans un module� il y a donc toute une partiecach�e comprenant les types et les corps des proc�dures ou des fonctions que l�on veutrendre priv�es� C�est ce qu�on appelle le principe d�encapsulation�

Comment y arriver en Java- Le plus simple est de se servir des modi�cateurs d�acc�sdans la d�claration des variables ou des m�thodes de la classe FC� Le quali�catif privatesigni�e que seuls les instructions � l�int�rieur de la classe o$ il est d��nie pourrontacc�der � ce champ ou m�thode� Au contraire public dit qu�un champ est accessiblepar toutes les classes� Jusqu�� pr�sent� nous n�avons pas mis !sauf pour la proc�duremain" de quali�catifs� L�option par d�faut est de rendre public les champs !en fait �l�int�rieur du package o$ il est d��ni� mais nous verrons plus loin la notion de package"�Red��nissons donc notre classe FC�

class FC

private int cc�

private Bloc debut�b� fin�b�

private int debut�d� fin�d�

public FC ��

cc � �

private static class Bloc

final static int TAILLE � ���

Bloc suivant�

Page 163: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� INTERFACES ET MODULES ��

char #$ contenu�

Bloc ��

suivant � null�

contenu � new char#TAILLE$�

public static FC vide ��

return new FC���

public static FC ajouter �char c� FC x�

Bloc b�

if �x�cc �� �

b � new Bloc���

x�debut�b � b� x�debut�d � �

x�fin�b � b� x�fin�d � ���

� else if �x�fin�d �� Bloc�TAILLE � ��

b � new Bloc���

x�fin�b�suivant � b�

x�fin�b � b� x�fin�d � ���

x�fin�b�contenu#��x�fin�d$ � c�

��x�cc�

return x�

public static char supprimer �FC x�

char res�

if �x�cc �� �

return ���

else

res � x�debut�b�contenu#x�debut�d$�

��x�cc�

��x�debut�d�

if �x�debut�d � Bloc�TAILLE�

x�debut�b � x�debut�b�suivant�

x�debut�d � �

return res�

On peut avoir � cacher non seulement le code des proc�dures r�alisant l�interface�mais aussi des variables et des fonctions qui ne seront pas accessibles de l�ext�rieur�Supposons dans notre exemple� que� pour �tre hyper e%cace !ce qui peut �tre le casdans un driver de p�riph�rique"� nous voulions avoir notre propre strat�gie d�allocationpour les blocs� On construira une liste des blocs libres listeLibre � l�initialisation duchargement de la classe FC et on utilisera les proc�dures nouveauBloc et libererBloccomme suit�

class FC

private int cc�

Page 164: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� MODULARIT�

private Bloc debut�b� fin�b�

private int debut�d� fin�d�

public FC ��

cc � �

private static class Bloc

final static int TAILLE � ���

Bloc suivant�

char #$ contenu�

Bloc ��

suivant � null�

contenu � new char#TAILLE$�

public static FC vide ��

return new FC���

public static FC ajouter �char c� FC x�

Bloc b�

if �x�cc �� �

b � nouveauBloc���

x�debut�b � b� x�debut�d � �

x�fin�b � b� x�fin�d � ���

� else if �x�fin�d �� Bloc�TAILLE � ��

b � nouveauBloc���

x�fin�b�suivant � b�

x�fin�b � b� x�fin�d � ���

x�fin�b�contenu#��x�fin�d$ � c�

��x�cc�

return x�

public static int supprimer �FC x�

if �x�cc �� �

return ���

else

char res � x�debut�b�contenu#x�debut�d$�

��x�cc�

��x�debut�d�

if �x�cc �� �

libererBloc �x�debut�b��

else if �x�debut�d � Bloc�TAILLE�

Bloc b � x�debut�b�

x�debut�b � x�debut�b�suivant�

x�debut�d � �

libererBloc �b��

return res�

Page 165: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� INTERFACES ET MODULES ��

private final static int NB�BLOCS � ��

private static Bloc listeLibre�

static

listeLibre � null�

for �int i�� i � NB�BLOCS� ��i�

Bloc b � new Bloc���

b�suivant � listeLibre�

listeLibre � b�

private static Bloc nouveauBloc ��

Bloc b � listeLibre�

listeLibre � listeLibre�suivant�

b�suivant � null�

return b�

private static void libererBloc �Bloc b�

b�suivant � listeLibre�

listeLibre � b�

On veut que la variable listeLibre reste cach�e� puisque cette variable n�a aucun sensdans l�interface des �les de caract�res� Il en est de m�me pour les proc�dures d�allocationou de lib�ration des blocs� Faisons trois remarques� Premi�rement� il est fr�quent qu�unmodule n�cessite une proc�dure d�initialisation� En Java� on le fait en mettant quelquesinstructions dans la d�claration de la classe !qui ne sont ex�cut�es qu�une seule fois�au chargement de la classe si le mot�cl� static �gure devant"� Deuxi�mement� pourne pas compliquer le programme� nous ne testons pas le cas o$ la liste des blocs libresdevient vide et� donc� l�allocation d�un nouveau bloc libre impossible� Troisi�mement�on un cr�erait un nouveau module s�par� pour l�allocation des blocs� si les proc�duresd�allocation et de lib�ration de blocs �taient tr�s complexes� Alors le module des �lesde caract�res serait lui aussi constitu� par plusieurs modules� Essayer de le faire enexercice�

Pour r�sumer� un module contient deux parties� une interface export�e qui contientles constantes� les types� les variables et la signature des fonctions ou proc�dures quel�on veut rendre publiques� une partie impl�mentation qui contient la r�alisation desobjets de l�interface� L�interface est la seule porte ouverte vers l�ext�rieur� Dans la partieimpl�mentation� on peut utiliser tout l�arsenal possible de la programmation� On ne veutpas que cette partie soit connue de son utilisateur pour �viter une programmation tropalambiqu�e� Si on arrive � ne laisser public que le strict n�cessaire pour utiliser unmodule� on aura grandement simpli�� la structure d�un programme� Il faut donc bienfaire attention aux interfaces� car une bonne partie de la di%cult� d��crire un programmer�side dans le bon choix des interfaces�

D�couper un programme en modules permet aussi la r�utilisation des modules� laconstruction hi�rarchique des programmes puisqu�un module peut lui�m�me �tre aussicompos� de plusieurs modules� le d�veloppement ind�pendant de programmes par plu�sieurs personnes dans un m�me projet de programmation� Il facilite les modi�cations� siles interfaces restent inchang�es� Ici� nous insistons sur la structuration des programmes�

Page 166: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� MODULARIT�

car tout le reste n�est que corollaire� Tout le probl�me de la modularit� se r�sume � iso�ler des parties de programme comme des bo�tes noires� dont les seules parties visibles� l�ext�rieur sont les interfaces� Bien d��nir un module assure la s�curit� dans l�acc�saux variables ou aux proc�dures� et est un bon moyen de structurer la logique d�un pro�gramme� Une deuxi�me partie de la programmation consiste � assembler les modulesde fa�on claire�

��� Interfaces et modules en Java

Beaucoup de langages de programmation ont une notion explicite de modules etd�interfaces� par exemple Clu� Mesa� Ada� Modula��� Oberon� Modula��� et ML� En Cou C,,� on utilise les �chiers include pour simuler les interfaces des modules� en faisantco.ncider les notions de module et de compilation s�par�e�

En Java� la notion de modularit� est plus dynamique et report�e dans le langage deprogrammation avec les modi�cateurs d�acc�s� Il n�y a pas de phase d��ditions de lienspermettant de faire coincider interfaces et impl�mentations� Seul le chargeur dynamiqueClassLoader ou l�interpr�teur !la machine virtuelle Java" font quelques v�ri�cations�Il existe une notion d�interfaces avec le mot�cl� Interface et de classes impl�mentantces interfaces� mais ces notions sont plut)t r�serv�s pour la construction de classesparam�tr�es ou pour la gestion dynamique simultan�e de plusieurs impl�mentationspour un m�me interface�

Mais il existe une autre notion pour assurer la modularit� en se servant de la restric�tion dans l�espace des noms� Nous avons vu que pour acc�der � des variables ou � desfonctions� on pouvait avoir � quali�er les noms par le nom de la classe !ou d�un objet pourles m�thodes dynamiques"� Ainsi on �crit Liste�ajouter� FC�TAILLE� args�length��System�out�print dans les exemples pr�c�dents� Parmi ces pr��xes� System est un nomde package� Un package permet de regrouper un ensemble de classes qui ont des fonc�tionalit�s proches� par exemple les appels syst�me� les entr�es&sorties� etc� Un packagecorrespond � un r�pertoire du syst�me de �chiers� dont les classes sont des �chiers� Pard�faut� une classe fait toujours partie d�un package� par d�faut le r�pertoire dont le ��chier contenant la classe fait partie� On peut sp�ci�er le package o$ se trouve une classeen la pr�c�dent par l�instruction

package Nom�de�package�

Pour acc�der � une classe� on doit la pr�c�der par le nom du package dont elle faitpartie� Mais� on peut �viter de mettre le nom complet en donnant la liste des noms depackages import�s�

import java�io���

import java�lang���

import java�util���

�� Compilation s�par�e et librairies

La compilation d�un programme consiste � fabriquer le binaire ex�cutable par leprocesseur de la machine� Pour des programmes de plusieurs milliers de lignes� il estbon de les d�couper en des �chiers compil�s s�par�ment� En Java� le code g�n�r� estind�pendant de la machine qui l�ex�cute� ce qui permet de l�ex�cuter sur toutes lesarchitectures � travers le r�seau� Il s�agit donc d�un code interpr�t� !byte�code" parun interpr�teur d�pendant lui de l�architecture sous�jacente� la machine virtuelle Java!encore appel�e JVM pour en anglais Java Virtual Machine"� Les �chiers de byte�codeont le su%xe �class� les �chiers sources ayant eux d�habitude le su%xe �java� Pourcompiler un �chier source sous un syst�me Unix� la commande�

Page 167: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� COMPILATION S�PAR�E ET LIBRAIRIES �

Ex�cution

java TTY

TTY�class

javac TTY�java

TTY�java

FC�class

javac FC�java

FC�java

Fig� �� � Compilation s�par�e

� javac FC�java

permet d�obtenir le �chier byte�code FC�class qui peut �tre utilis� par d�autres modulescompil�s ind�pendamment� Supposons qu�un �chier TTY�java contenant un gestionnairede terminaux utilise les fonctions sur les �les de caract�res� Ce programme contiendrades lignes du genre�

class TTY

FC in� out�

TTY ��

in � new FC���

out � new FC���

static int Lire �FC in� �

static void Imprimer �FC out� �

En Unix� on devra compiler s�par�ment TTY�java et on lancera la machine Java surTTY�class par les commandes�

� javac TTY�java

� java TTY

Remarquons que le su%xe �class n�est pas n�cessaire dans la deuxi�me commande�La derni�re commande cherche la fonction publique main dans la classe TTY�class etd�marre la machine virtuelle Java sur cette fonction� Les diverses classes utilis�es sontcharg�es au fur et � mesure de leur utilisation� Contrairement � beaucoup de langagesde programmation� il n�y a pas !pour le meilleur et pour le pire" de phase d��dition deliens en Java� Tout se fait dynamiquement� Graphiquement� les phases de compilationsont repr�sent�es par la �gure ���

Quand il y a un grand nombre de �chiers de code objet� on peut les regrouper dansun �chier d�archive �jar !java archive" pour en faire une librairie� par exemple libX �a

Page 168: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� MODULARIT�

TTY�class

javac TTY�java

TTY�java

FC�class

javac FC�java

FC�java

Fig� �� � D�pendances dans une compilation s�par�e

pour X�window� Les diverses classes ou librairies sont retrouv�es � des endroits stan�dards� que l�on peut changer en se servant de la variable d�environnement CLASSPATH�

Avec CodeWarrior� la notion de projet permet de combiner un certain nombre de�chiers Java comme FC�java et TTY�java� ainsi qu�un certain nombre de librairies�La commande Run ex�cute des commandes de compilation s�par�e et d��dition de lienanalogues � celles d�Unix�

�� D�pendances entre modules

Lors de l��criture d�un programme compos� de plusieurs modules� il est commodede d�crire les d�pendances entre modules et la mani�re de reconstruire les binairesex�cutables� Ainsi on pourra recompiler le strict n�cessaire en cas de modi�cation d�undes modules� Dans l�exemple de notre gestionnaire de terminaux� nous voulons indiquerque les d�pendances induites par la �gure �� pour reconstruire le code objet TTY�class�La description des d�pendances varie selon le syst�me� La commande javac fait l�analysede d�pendances et compile ce qui est n�cessaire� De m�me� la commande Run ou Compileen CodeWarrior sur Mac� De mani�re plus g�n�rale sous le syst�me Unix� on utilise desMake�le et la commande make�

Supposons pour un moment notre programme �crit en C� avec un �chier d�interfacefc�h� Le �chier de d�pendances serait ainsi �crit�

tty� tty�o fc�o

cc �o tty tty�o fc�o

tty�o� tty�c fc�h

cc �c tty�c

fc�o� fc�c fc�h

cc �c fc�c

Apr�s �! � il y a la liste des �chiers dont d�pend le but mentionn� au d�but de la ligne�Dans les lignes suivantes� il y a la suite de commandes � e�ectuer pour obtenir le �chierbut� La commande Unix make consid�re le graphe des d�pendances et calcule les com�mandes n�cessaires pour reconstituer le �chier but� Si les interd�pendances entre �chierssont repr�sent�s par les arcs d�un graphe dont les sommets sont les noms de �chier� cetteop�ration d�ordonnancement d�un graphe sans cycle s�appelle le tri topologique�

Page 169: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� TRI TOPOLOGIQUE ��

tty

cc �o tty tty�o fc�o

tty�o

cc �c tty�c

tty�c fc�h

fc�o

cc �c fc�c

fc�c

Fig� �� � D�pendances dans un Make�le

��� Tri topologique

Au d�but de certains livres� les auteurs indiquent les d�pendances chronologiquesentre les chapitres en les repr�sentant par un diagramme� Celui qui �gure au d�butdu livre de Barendregt sur lambda�calcul ��� est sans doute l�un des plus compliqu�s�Par exemple� on voit sur ce diagramme que pour lire le chapitre �� il faut avoir lu leschapitres �� et ��� Un lecteur courageux veut lire le strict minimum pour appr�henderle chapitre ��� Il faut donc qu�il transforme l�ordre partiel indiqu� par les d�pendancesdu diagramme en un ordre total d�terminant la liste des chapitres n�cessaires au cha�pitre ��� Bien s#r� ceci n�est pas possible si le graphe de d�pendance contient un cycle�L�op�ration qui consiste � mettre ainsi en ordre les noeuds d�un graphe dirig� sans cir�cuit !souvent appel�s sous leur d�nomination anglaise dags pour directed acyclic graphs"est appel�e le tri topologique� Comme nous l�avons vu plus haut� elle est aussi bien utiledans la compilation et l��dition de liens des modules

Le tri topologique consiste donc � ordonner les sommets d�un dag en une suitedans laquelle l�origine de chaque arc apparait avant son extr�mit�� La construction faiteici est une version particuli�re du tri topologique� il s�agit pour un sommet s donn�de construire une liste form�e de tous les sommets origines d�un chemin d�extr�mit�s� Cette liste doit en plus satisfaire la condition �nonc�e plus haut� Pour r�soudre ceprobl�me� on applique l�algorithme de descente en profondeur d�abord !Tr�maux" surle graphe oppos�� !Au lieu de consid�rer les successeurs succ�uk� du sommet u� onparcourt ses pr�d�cesseurs�" Au cours de cette recherche� quand on a �ni de visiter unsommet� on le met en t�te de liste� En �n de l�algorithme� on calcule l�image mirroir de laliste� Pour tester l�existence de cycles� on doit v�ri�er lorsqu�on rencontre un noeud d�j�visit� que celui�ci �gure dans la liste r�sultat� Pour ce faire� il faut utiliser un tableauannexe etat sur les noeuds qui indique si le noeud est visit�� en cours de visite� ou nonvisit��

final static pasVu � � enCours � �� dejaVu � ��

static Liste triTopologique �int u�

for �int i � � i � nbSommets� ��i�

etat#i$ � pasVu�

Liste resultat � Liste�reverse �DFS �u� null���

Page 170: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� � CHAPITRE �� MODULARIT�

Fig� � � Un exemple de graphe acyclique

static Liste DFS �int u� Liste a�faire�

for �int k � � pred#u$#k$ &� Omega� ��k�

int v � pred#u$#k$�

if �etat#v$ �� enCours�

Erreur ��Le graphe a un cycle���

if �etat#v$ �� pasVu�

etat#v$ � enCours�

a�faire � DFS �v� a�faire��

etat#u$ � dejaVu�

return Liste�ajouter �u� a�faire��

Nous avons omis les d�clarations des variables i et etat et du type �num�r� des �l�mentsde ce tableau� Nous avons repris les structures d�velopp�es dans les chapitres sur lesgraphes et les fonctions sur les listes� Nous supposons aussi que le tableau succ estremplac� par pred des pr�d�cesseurs de chaque noeud�

��� Un exemple de module en C

C est proche de Java par sa non�existence d�un syst�me de modules� Nous reprenonsl�exemple des �les de caract�res !en fait telles qu�elles se trouvaient en Unix version pour les gestionaires de terminaux"� C�est aussi l�occasion de constater comment laprogrammation en C permet certaines acrobaties� peu recommandables car on aurait pusuivre la technique d�adressage des caract�res dans les blocs comme en Java� La structuredes �les est l�g�rement di��rente car on adresse directement les caract�res dans un blocau lieu du syst�me base et d�placement de Pascal� Le d�bordement de bloc est test� en

Page 171: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� UN EXEMPLE DE MODULE EN C � �

regardant si on est sur un multiple de la taille d�un bloc� car on suppose le tableau desblocs align� sur un multiple de cette taille� Le �chier interface fc�h est

�define NCLIST � �� max total clist size ��

�define CBSIZE �� �� number of chars in a clist block ��

�define CROUND xf �� clist rounding� sizeof�int �� � CBSIZE � ���

��

� A clist structure is the head

� of a linked list queue of characters�

� The characters are stored in ��word

� blocks containing a link and several characters�

� The routines fcget and fcput

� manipulate these structures�

��

struct clist

int c�cc� �� character count ��

char �c�cf� �� pointer to �rst char ��

char �c�cl� �� pointer to last char ��

��

struct cblock

struct cblock �c�next�

char c�info#CBSIZE$�

��

typedef struct clist �fc�type�

int fc�put�char c� fc�type p��

int fc�get�fc�type p��

void fc�init�void��

Dans la partie impl�mentation qui suit� on remarque l�emploi de la directive static!celle de C� et non de Java'" qui permet de cacher � l��dition de liens des variables�proc�dures ou fonctions priv�es qui ne seront pas consid�r�es comme externes� Contrai�rement � Pascal� il est possible en C de cacher la repr�sentation des �les� en ne d�clarantle type fc�type que comme un pointeur vers une structure clist non d��nie� Les fonc�tions retournent un r�sultat entier qui permet de retourner des valeurs erron�es comme��� Le �chier fc�c est

�include �stdlib�h

�include �fc�h

static struct cblock cfree#NCLIST$�

static struct cblock �cfreelist�

int fc�put�char c� fc�type p�

struct cblock �bp�

char �cp�

register s�

if ��cp � p�c�cl� �� NULL �� p�c�cc � �

if ��bp � cfreelist� �� NULL�

return�����

cfreelist � bp�c�next�

bp�c�next � NULL�

Page 172: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� � CHAPITRE �� MODULARIT�

p�c�cf � cp � bp�c�info�

� else if ���int�cp % CROUND� �� �

bp � �struct cblock ��cp � ��

if ��bp�c�next � cfreelist� �� NULL�

return�����

bp � bp�c�next�

cfreelist � bp�c�next�

bp�c�next � NULL�

cp � bp�c�info�

�cp�� � c�

p�c�cc���

p�c�cl � cp�

return���

int fc�get�fc�type p�

struct cblock �bp�

int c� s�

if �p�c�cc �� �

c � ���

p�c�cc � �

p�c�cf � p�c�cl � NULL�

� else

c � �p�c�cf�� % xff�

if ���p�c�cc���

bp � �struct cblock ���p�c�cf����

bp � �struct cblock �� ��int�bp % ,CROUND��

p�c�cf � p�c�cl � NULL�

bp�c�next � cfreelist�

cfreelist � bp�

� else if ���int�p�c�cf % CROUND� �� �

bp � �struct cblock ���p�c�cf����

p�c�cf � bp�c�next�c�info�

bp�c�next � cfreelist�

cfreelist � bp�

return�c��

void fc�init��

int ccp�

struct cblock �cp�

ccp � �int�cfree�

ccp � �ccp�CROUND� % ,CROUND�

for�cp��struct cblock ��ccp� cp �� %cfree#NCLIST��$� cp���

cp�c�next � cfreelist�

cfreelist � cp�

Page 173: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� MODULES EN CAML � �

��� Modules en Caml

On construit pour tout module deux �chiers fc�mli !pour ML interface" et fc�ml!le module d�impl�mentation"� Le premier est un �chier d�interface dans lequel on donnela signature de tous les types� variables ou fonctions export�es� Par exemple�

�� Files de caract�res ��

type fc��

�� Le type des �les de caract�res ��

exception FileVide��

�� Leve quand �supprimer� est applique � une �le vide� ��

value vide� unit � fc

�� Retourne une nouvelle �le� initialement vide� ��and ajouter� char � fc � fc

�� �ajouter c x� ajoute le caract�re �c� � la �n de la �le �x�� ��and supprimer� fc � char

�� �supprimer x� enl�ve et retourne le premier lment de la �le �x�ou l�ve lexception �FileVide� si la queue est vide� ��

Le deuxi�me contient l�impl�mentation des �les de caract�res� o$ on fournit les struc�tures de donn�es ou le code correspondant � chaque d�claration pr�c�dente�

type fc � mutable cc� int�

mutable debut�b� liste�de�blocs� mutable debut�d� int�

mutable fin�b� liste�de�blocs� mutable fin�d� int� and

liste�de�blocs � Nil � Cons of bloc and

bloc � contenu� string� mutable suivant� liste�de�blocs���

exception FileVide��

let taille�bloc � ����

let vide�� � cc � � debut�b � Nil� debut�d � � fin�b � Nil� fin�d � ���

let ajouter c x �

let nouveau�bloc�� �

Cons contenu � make�string taille�bloc ) )� suivant � Nil� in

if x�cc � then begin

let b � nouveau�bloc�� in

x�debut�b �� b� x�debut�d �� �

x�fin�b �� b� x�fin�d �� ���

end else if x�fin�d � taille�bloc � � then begin

let b � nouveau�bloc�� in

�match x�fin�b with

Cons r � r�suivant �� b

� Nil � ��

��

x�fin�b �� b� x�fin�d �� ���

end�

x�fin�d �� x�fin�d � ��

�match x�fin�b with

Cons r � r�contenu�#x�fin�d$ �� c

� Nil � ��

��

x�cc �� x�cc � ��

Page 174: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� � CHAPITRE �� MODULARIT�

x��

let supprimer x �

if x�cc � then

raise FileVide

else match x�debut�b with

Nil � failwith �Cas impossible�

� Cons r � let res � r�contenu�#x�debut�d$ in

x�cc �� x�cc � ��

x�debut�d �� x�debut�d � ��

if x�debut�d � taille�bloc then begin

x�debut�b �� r�suivant�

x�debut�d �� �

end�

res��

Dans un deuxi�me module� par exemple un gestionnaire de terminaux dont le codese trouve dans un �chier tty�ml� on peut utiliser les noms du module fc�mli en lesquali�ant par le nom du module suivi symbole �� �

let nouveau�tty �

let x � fc��vide�� in

���

let y � fc��ajouter c x ����

Si on n�a pas envie d�utiliser cette notation longue� on supprime le pr��xe avec ladirective suivante en t�te de tty�ml�

�open �fc���

Les d�pendances entre modules se font comme dans le cas de C� On se sert de lacommande make de Unix et du make�le suivant� Remarquons que les �chiers �ml secompilent en �chiers �zo� les �chiers �mli en �zi� et que l�on �nit avec un �chier ttydirectement ex�cutable�

tty� tty�zo fc�zo

camlc �o tty tty�zo fc�zo

tty�zo� tty�ml fc�zi

camlc �c tty�ml

fc�zo� fc�ml

camlc �c fc�ml

fc�zi� fc�mli

camlc �c fc�mli

En�n� en Caml� on n�est pas forc� de d��nir un �chier d�interface� auquel cas lecompilateur g�n�rera automatiquement un �chier �zi en supposant toutes les variableset fonctions publiques dans le module d�impl�mentation� Toutefois� c�est plus s#r ded��nir soi�m�me les �chiers d�interface�

�� En OCaml� on est revenu � une notation plus classique avec un point au lieu des deux caract�ressoulign��

Page 175: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� MODULES EN CAML � �

tty

camlc �o tty tty�zo fc�zo

tty�zo

camlc �c tty�ml

tty�ml fc�zi

camlc �c fc�mli

fc�mli

fc�zo

caml �c fc�ml

fc�ml

Fig� � � D�pendances entre modules Caml

Page 176: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� MODULARIT�

Page 177: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

Chapitre

Exploration

Dans ce chapitre� on recherche des algorithmes pour r�soudre des probl�mes sepr�sentant sous la forme suivante�

On se donne un ensemble E �ni et � chaque �l�ment e de E est a�ect�e unevaleur v�e� !en g�n�ral� un entier positif"� on se donne de plus un pr�dicat!une fonction � valeurs "vrai� faux#" C sur l�ensemble des parties de E� Leprobl�me consiste � construire un sous ensemble F de E tel que�

� C�F � est satisfait

�P

e�F v�e� soit maximal !ou minimal� dans certains cas"

Les m�thodes d�velopp�es pour r�soudre ces probl�mes sont de natures tr�s diverses�Pour certains exemples� il existe un algorithme tr�s simple consistant � initialiser F parF � �� puis � ajouter successivement des �l�ments suivant un certain crit�re� jusqu��obtenir la solution optimale� c�est ce qu�on appelle l�algorithme glouton� Tous les pro�bl�mes ne sont pas r�solubles par l�algorithme glouton mais� dans le cas o$ il s�applique�il est tr�s e%cace� Pour d�autres probl�mes� c�est un algorithme dit de programmationdynamique qui permet d�obtenir la solution� il s�agit alors d�utiliser certaines particu�larit�s de la solution qui permettent de diviser le probl�me en deux� puis de r�soudres�par�ment chacun des deux sous�probl�mes� tout en conservant en table certaines in�formations interm�diaires� Cette technique� bien que moins e%cace que l�algorithmeglouton� donne quand m�me un r�sultat int�ressant car l�algorithme mis en oeuvre esten g�n�ral polynomial� En�n� dans certains cas� aucune des deux m�thodes pr�c�dentesne donne de r�sultat et il faut alors utiliser des proc�dures d�exploration syst�matiquede l�ensemble de toutes les parties de E satisfaisant C� cette exploration syst�matiqueest souvent appel�e exploration arborescente !ou backtracking en anglais"�

��� Algorithme glouton

Comme il a �t� dit� cet algorithme donne tr�s rapidement un r�sultat� En revanchece r�sultat n�est pas toujours la solution optimale� L�a�ectation d�une ou plusieursressource � des utilisateurs !clients� processeurs� etc�" constitue une classe importantede probl�mes� Il s�agit de satisfaire au mieux certaines demandes d�acc�s � une ouplusieurs ressources� pendant une dur�e donn�e� ou pendant une p�riode de temps d��niepr�cis�ment� Le cas le plus simple de ces probl�mes est celui d�une seule ressource�pour laquelle sont faites des demandes d�acc�s � des p�riodes d�termin�es� Nous allonsmontrer que dans ce cas tr�s simple� l�algorithme glouton s�applique� Dans des cas plus

Page 178: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� EXPLORATION

complexes� l�algorithme donne une solution approch�e� dont on se contente souvent� vule temps de calcul prohibitif de la recherche de l�optimum exact�

����� A�ectation dune ressource

Le probl�me d�crit pr�cis�ment ci�dessous peut �tre r�solu par l�algorithme glouton!mais� comme on le verra� l�algorithme glouton ne donne pas la solution optimale pourune autre formulation du probl�me� pourtant proche de celle�ci"� Il s�agit d�a�ecter uneressource unique� non partageable� successivement � un certain nombre d�utilisateursqui en font la demande en pr�cisant la p�riode exacte pendant laquelle ils souhaitent endisposer�

On peut mat�rialiser ceci en prenant pour illustration la location d�une seule voiture�Des clients formulent un ensemble de demandes de location et� pour chaque demandesont donn�s le jour du d�but de la location et le jour de restitution du v�hicule� le butest d�a�ecter le v�hicule de fa�on � satisfaire le maximum de clients !et non pas demaximiser la somme des dur�es de location"� On peut formuler ce probl�me en utilisantle cadre g�n�ral consid�r� plus haut� L�ensemble E est celui des demandes de location�pour chaque �l�ment e de E� on note d�e� la date du d�but de la location et f�e� � d�e�la date de �n� La valeur v�e� de tout �l�ment e de E est �gale � � et la contrainte �respecter pour le sous ensemble F � construire est la suivante�

�e�� e� � F d�e�� � d�e��� f�e�� � d�e��

puisque� disposant d�un seul v�hicule� on ne peut le louer qu�� un seul client � la fois�L�algorithme glouton s�exprime comme suit�

� Etape �� Classer les �l�ments de E par ordre des dates de �ns croissantes� Les�l�ments de E constituent alors une suite e�� e�� � � � en telle que f�e�� � f�e��� � � � �f�en�

� Initialiser F � � �� Etape � Pour i variant de � � n� ajouter la demande ei � F si celle�ci ne chevauche

pas la derni�re demande appartenant � F �

Montrons que l�on a bien obtenu ainsi la solution optimale�Soit F � fx�� x�� � � � xpg la solution obtenue par l�algorithme glouton et soit G �

fy�� y�� � � � yqg� q � p une solution optimale� Dans les deux cas nous supposons que lesdemandes sont class�es par dates de �ns croissantes� Nous allons montrer que p � q�Supposons que �i � k� on ait xi � yi et que k soit le plus petit entier tel que xk � yk�alors par construction de F on a� f�yk� � f�xk�� On peut alors remplacer G par G� �fy�� y�� � � � yk��� xk� yk��� yqg tout en satisfaisant � la contrainte de non chevauchementdes demandes� ainsi G� est une solution optimale ayant plus d��l�ments en communavec F que n�en avait G� En r�p�tant cette op�ration su%samment de fois on trouveun ensemble H de m�me cardinalit� que G et qui contient F � L�ensemble H ne peutcontenir d�autres �l�ments car ceux�ci auraient �t� ajout�s � F par l�algorithme glouton�ceci montre bien que p � q�

Remarques�� Noter que le choix de classer les demandes par dates de �n croissantes est important�Si on les avait class�es� par exemple� par dates de d�but croissantes� on n�aurait pas

Page 179: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� ALGORITHME GLOUTON � �

obtenu le r�sultat� On le voit sur l�exemple suivant avec trois demandes e�� e�� e� dontles dates de d�but et de �n sont donn�es par le tableau suivant�

e� e� e�d � � �f �

Bien entendu� pour des raisons �videntes de sym�trie� le classement par dates de d�butd�croissantes donne aussi le r�sultat optimal�

�� On peut noter aussi que si le but est de maximiser la dur�e totale de location duv�hicule l�algorithme glouton ne donne pas l�optimum� En particulier� il ne consid�rerapas comme prioritaire une demande de location de dur�e tr�s importante� L�id�e est alorsde classer les demandes par dur�es d�croissantes et d�appliquer l�algorithme glouton�malheureusement cette technique ne donne pas non plus le bon r�sultat !il su%t deconsid�rer une demande de location de � jours et deux demandes qui ne se chevauchentpas mais qui sont incompatibles avec la premi�re chacune de dur�e �gale � � jours"� Defait� le probl�me de la maximisation de cette dur�e totale est NP complet� il est doncillusoire de penser trouver un algorithme simple et e%cace�

�� S�il y a plus d�une ressource � a�ecter� par exemple deux voitures � louer� l�algorithmeglouton consistant � classer les demandes suivant les dates de �n et � a�ecter la premi�reressource disponible� ne donne pas l�optimum�

����� Arbre recouvrant de poids minimal

Un exemple classique d�utilisation de l�algorithme glouton est la recherche d�un arbrerecouvrant de poids minimal dans un graphe sym�trique� il prend dans ce cas particulierle nom d�algorithme de Kruskal� D�crivons bri�vement le probl�me et l�algorithme�

Un graphe sym�trique est donn� par un ensemble X de sommets et un ensemble Ad�arcs tel que� pour tout a � A� il existe un arc oppos� �a dont l�origine est l�extr�mit� dea et dont l�extr�mit� est l�origine de a� Le couple fa� �ag forme une ar�te� Un arbre est ungraphe sym�trique tel que tout couple de sommets est reli� par un chemin !connexit�" etqui ne poss�de pas de circuit !autres que ceux form�s par un arc et son oppos�"� Pour ungraphe sym�trique G � �X�A� quelconque� un arbre recouvrant est donn� par un sousensemble de l�ensemble des ar�tes qui forme un arbre ayant X pour ensemble de sommets!voir �gure ��"� Pour poss�der un arbre recouvrant� un graphe doit �tre connexe� Dansce cas� les arborescences construites par les algorithmes d�crits au chapitre � sont desarbres recouvrants� Lorsque chaque ar�te du graphe est a�ect�e d�un certain poids�se pose le probl�me de la recherche d�un arbre recouvrant de poids minimal !c�est �dire un arbre dont la somme des poids des ar�tes soit minimale"� Une illustration dece probl�me est la r�alisation d�un r�seau �lectrique ou informatique entre di��rentspoints� deux points quelconques doivent toujours �tre reli�s entre eux !connexit�" et ondoit minimiser le co#t de la r�alisation� Le poids d�une ar�te est� dans ce contexte� leco#t de construction de la portion du r�seau reliant ses deux extr�mit�s�

On peut facilement formuler le probl�me dans le cadre g�n�ral donn� en d�but dechapitre� E est l�ensemble des ar�tes du graphe� la condition C � satisfaire par F est deformer un graphe connexe� en�n il faut minimiser la somme des poids des �l�ments deF � Ce probl�me peut �tre r�solu tr�s e%cacement par l�algorithme glouton suivant �

� Etape �� Classer les ar�tes par ordre de poids croissants� Elles constituent alorsune suite

e�� e�� � � � en

Page 180: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� EXPLORATION

� �

��

� ��

Fig� �� � Un graphe sym�trique et l�un de ses arbres recouvrants

telle quep�e�� � p�e��� � � � � p�en�

� Initialiser F � � �� Etape � Pour i variant de � � n� ajouter l�ar�te ei � F si celle�ci ne cr�e pas de

circuit avec celles appartenant � F �

On montre que l�algorithme glouton donne l�arbre de poids minimal en utilisant lapropri�t� suivante des arbres recouvrants d�un graphe�

Soient T et U deux arbres recouvrants distincts d�un graphe G et soit a unear�te de U qui n�est pas dans T � Alors il existe une ar�te b de T telle queU n fag � fbg soit aussi un arbre recouvrant de G�

Plus g�n�ralement on montre que l�algorithme glouton donne le r�sultat si et seule�ment si la propri�t� suivante est v�ri��e par les sous ensembles F de E satisfaisantC�

Si F et G sont deux ensembles qui satisfont la condition C et si x est un�l�ment qui est dans F et qui n�est pas dans G� alors il existe un �l�ment deG tel que F n fxg � fyg satisfasse C�

Un exemple d�arbre recouvrant de poids minimal est donn� sur la �gure ���

��� Exploration arborescente

De tr�s nombreux probl�mes d�optimisation ou de recherche de con�gurations par�ticuli�res donnent lieu � un algorithme qui consiste � faire une recherche exhaustive dessolutions� Ces algorithmes paraissent simples puisqu�il s�agit de parcourir syst�matique�ment un ensemble de solutions� mais bien que leur principe ne soit pas particuli�rementing�nieux� la programmation n�cessite un certain soin�

Page 181: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� EXPLORATION ARBORESCENTE ��

� �

� �

� � �

� � �

��

�� �

� ��

� �

� �

��

Fig� �� � Un arbre recouvrant de poids minimum

����� Sac � dos

Prenons pour premier exemple le probl�me dit du sac � dos� soit un ensemble Ed�objets chacun ayant un certain poids� un entier positif not� p�e�� et soit M un r�el quirepr�sente la charge maximum que l�on peut emporter dans un sac � dos� La questionest de trouver un ensemble d�objets dont la somme des poids soit la plus voisine possiblede M tout en lui �tant inf�rieure ou �gale� Le probl�me est ici formul� dans les termesg�n�raux du d�but du chapitre� la condition C portant sur le poids du sac � ne pasd�passer� Il est assez facile de trouver des exemples pour lesquels l�algorithme gloutonne donne pas le bon r�sultat� il su%t en e�et de consid�rer � objets de poids respectifs�� � � � pour remplir un sac de charge maximum �gale � �� On s�apper�oit que si l�onremplit le sac en pr�sentant les objets en ordre de poids d�croissants et en retenantceux qui ne font pas d�passer la capacit� maximale� on obtiendra une charge �gale ��� Si � l�oppos�� on classe les objets par ordre de poids croissants� et que l�on appliquel�algorithme glouton� la charge obtenue sera �gale � �� alors qu�il est possible de remplirle sac avec deux objets de poids et d�obtenir l�optimum�

Le probl�me du sac � dos� lorsque la capacit� du sac n�est pas un entier� � est unexemple typique classique de probl�me !NP�complet" pour lequel aucun algorithmee%cace n�est connu et o$ il faut explorer toutes les possibilit�s pour obtenir la meilleuresolution� Une bonne programmation de cette exploration syst�matique consiste � utiliserla r�cursivit�� Notons n le nombre d��l�ments de E� nous utiliserons un tableau sacpermettant de coder toutes les possibilit�s� un objet i est mis dans le sac si sac�i�� true� il n�est pas mis si sac�i� � false� Il faut donc parcourir tous les vecteurspossibles de bool�ens� pour cela on consid�re successivement toutes les positions i ��� � � � n et on e�ectue les deux choix possibles pour sac�i� en ne choisissant pas laderni�re possibilit� si l�on d�passe la capacit� du sac� On utilise un entier meilleurqui m�morise la plus petite valeur trouv�e pour la di��rence entre la capacit� du sacet la somme des poids des objets qui s�y trouvent� Un tableau msac garde en m�moirele contenu du sac qui r�alise ce minimum� La proc�dure r�cursive calcul�iu a pourparam�tres d�appel� i l�objet pour lequel on doit prendre une d�cision� et u la capacit�disponible restante� Elle consid�re deux possibilit�s pour l�objet i l�une pour laquelle il

�� Dans le cas o� M est en entier� on peut trouver un algorithme tr�s ecace fond� sur la program�mation dynamique�

Page 182: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� EXPLORATION

est mis dans le sac !si on ne d�passe pas la capacit� restante u"� l�autre pour laquelleil n�y est pas mis� La proc�dure appelle calcul�i� u et calcul�i� u � p�i��Ainsi le premier appel de calcul�i u est fait avec i � � et u �gal � la capacit� M dusac� les appels successifs feront ensuite augmenter i !et diminuer u" jusqu�� atteindrela valeur n� Le r�sultat est m�moris� s�il am�liore la valeur courante de meilleur�

static void calcul �int i� float u�

if �i � n�

if �u � meilleur�

for �int j � � i � n� ��i�

msac#i$ � sac#i$�

meilleur � u�

� else

if �p#i$ �� u�

sac#i$ � true�

calcul�i � �� u � p#i$��

sac#i$ � false�

calcul�i � �� u��

On v�ri�e sur des exemples que cette proc�dure donne des r�sultats assez rapidementpour n � ��� Pour des valeurs plus grandes le temps mis est bien plus long car il cro�tcomme �n�

����� Placement de reines sur un �chiquier

Le placement de reines sur un �chiquier sans qu�aucune d�entre elles ne soit en prisepar une autre constitue un autre exemple de recherche arborescente� L� encore il fautparcourir l�ensemble des solutions possibles� Pour les valeurs successives de i� on placeune reine sur la ligne i et sur une colonne j � pos�i� en v�ri�ant bien qu�elle n�est pasen prise� Le tableau pos que l�on remplit r�cursivement contient les positions des reinesd�j� plac�es� Tester si deux reines sont en con�it est relativement simple� Notons i�� j�et i�� j� leurs positions respectives !ligne et colonne" il y a con�it si i� � i� !elles sontalors sur la m�me ligne"� ou si j� � j� !m�me colonne" ou si ji� � i�j � jj� � j�j !m�mediagonale"�

static boolean conflit �int i�� int j�� int i�� int j��

return �i� �� i�� �� �j� �� j�� ��

�Math�abs �i� � i�� �� Math�abs �j� � j����

Celle�ci peut �tre appel�e plusieurs fois pour tester si une reine en position i� j estcompatible avec les reines pr�c�demment plac�es sur les lignes �� � � � � i� ��

static boolean compatible �int i� int j�

for �int k � � k � i� ��k�

if �conflit �i� j� k� pos#k$��

return false�

return true�

La fonction r�cursive qui trouve une solution au probl�me des reines est alors la suivante�

Page 183: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� PROGRAMMATION DYNAMIQUE ��

L�Z�Z�Z��Z�ZQZ�ZZ�Z�Z�ZQ�Z�Z�L�ZZ�L�Z�Z��Z�Z�ZQZZQZ�Z�Z��Z�L�Z�Z

Fig� �� � Huit reines sur un �chiquier

static void reines �int i�

if �i � nbReines�

imprimerSolution���

else

for �int j � � j � nbReines� ��j�

if compatible �i� j�

pos#i$ � j�

reines �i����

La boucle for � l�int�rieur de la proc�dure permet de parcourir toutes les posi�tions sur la ligne i compatibles avec les reines d�j� plac�es� Les appels successifs deReines�i modi�ent la valeur de pos�i� d�termin�e par l�appel pr�c�dent� La proc��dure pr�c�dente a%che toutes les solutions possibles� il est assez facile de modi�er laproc�dure en s�arr�tant d�s que l�on a trouv� une solution ou pour simplement compterle nombre de solutions di��rentes� En lan�ant Reines��� on trouve ainsi � solutionspour un �chiquier �� � dont l�une d�elles est donn�e �gure ���

Remarque Dans les deux exemples donn�s plus haut� toute la di%cult� r�side dansle parcours de toutes les solutions possibles� sans en oublier et sans revenir plusieursfois sur la m�me� On peut noter que l�ensemble de ces solutions peut �tre vu commeles sommets d�une arborescence qu�il faut parcourir� La di��rence avec les algorithmesd�crits au chapitre � est que l�on ne repr�sente pas cette arborescence en totalit� enm�moire mais simplement la partie sur laquelle on se trouve�

��� Programmation dynamique

Pour illustrer la technique d�exploration appel�e programmation dynamique� le mieuxest de commencer par un exemple� Nous consid�rons ainsi la recherche de chemins delongueur minimale entre tous les couples de points d�un graphe aux arcs valu�s�

Page 184: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� CHAPITRE �� EXPLORATION

����� Plus courts chemins dans un graphe

Dans la suite� on consid�re un graphe G � �X�A� ayant X comme ensemble de som�mets et A comme ensemble d�arcs� On se donne une application l de A dans l�ensembledes entiers naturels� l�a� est la longueur de l�arc a� La longueur d�un chemin est �gale �la somme des longueurs des arcs qui le composent� Le probl�me consiste � d�terminerpour chaque couple �xi� xj� de sommets� le plus court chemin� s�il existe� qui joint xi �xj � Nous commen�ons par donner un algorithme qui d�termine les longueurs des pluscourts chemins not�es �xi� xj�� on convient de noter �xi� xj� � � s�il n�existe pas dechemin entre xi et xj !en fait il su%t dans la suite de remplacer � par un nombresu%samment grand par exemple la somme des longueurs de tous les arcs du graphe"�La construction e�ective des chemins sera examin�e ensuite� On suppose qu�entre deuxsommets il y a au plus un arc� En e�et� s�il en existe plusieurs� il su%t de ne retenir quele plus court�

Les algorithmes de recherche de chemins les plus courts reposent sur l�observation tr�ssimple mais importante suivante�

Remarque Si f est un chemin de longueur minimale joignant x � y et qui passe parz� alors il se d�compose en deux chemins de longueur minimale l�un qui joint x � z etl�autre qui joint z � y�

Dans la suite� on suppose les sommets num�rot�s x�� x�� � � � xn et� pour tout k � � onconsid�re la propri�t� Pk suivante pour un chemin�

�Pk�f�� Tous les sommets de f � autres que son origine et son extr�mit��ont un indice strictement inf�rieur � k�

On peut remarquer qu�un chemin v�ri�e P� si et seulement s�il se compose d�un uniquearc� d�autre part la condition Pn�� est satisfaite par tous les chemins du graphe� Notons k�xi� xj� la longueur du plus court chemin qui v�ri�e Pk et qui a pour origine xi etpour extr�mit� xj � Cette valeur est � si aucun tel chemin n�existe� Ainsi ��xi� xj� ��s�il n�y a pas d�arc entre xi et xj et vaut l�a� si a est cet arc� D�autre part n�� � � Lelemme suivant permet de calculer les k�� connaissant les k�xi� xj�� On en d�duira unalgorithme it�ratif�

Lemme Les relations suivantes sont satisfaites par les k�

k���xi� xj� � min� k�xi� xj�� k�xi� xk� � k�xk� xj��

Preuve Soit un chemin de longueur minimale satisfaisant Pk��� ou bien il ne passepas par xk et on a

k���xi� xj� � k�xi� xj�

ou bien il passe par xk et� d�apr�s la remarque pr�liminaire� il est compos� d�un cheminde longueur minimale joignant xi � xk et satisfaisant Pk et d�un autre minimal aussijoignant xk � xj� Il a donc pour longueur� k�xi� xk� � k�xk� xj��

L�algorithme suivant pour la recherche du plus court chemin met � jour une matricedelta�ij� qui a �t� initialis�e par les longueurs des arcs et par un entier su%sammentgrand s�il n�y a pas d�arc entre xi et xj� A chaque it�ration de la boucle externe� on faitcro�tre l�indice k du k calcul��

for �k � � k � n� ��k�

Page 185: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� PROGRAMMATION DYNAMIQUE ��

x�

x��

x�

x�

x�

x�

��

x�

Fig� �� � Un graphe aux arcs valu�s

for �i � � i � n� ��i�

for �j � �� j � n� ��j�

delta#i$#j$ � Math�min�delta#i$#j$� delta#i$#k$ � delta#k$#j$��

On note la similitude avec l�algorithme de recherche de la fermeture transitive d�ungraphe expos� au chapitre �� Sur l�exemple du graphe donn� sur la �gure ��� on partde la matrice � donn�e par

� �

�BBBBBBBBBB�

� � � � � � �� � � � � �� � � � � � �� � � � � � �� � � � � �� � � � � � �� � � � � � �

�CCCCCCCCCCA

Apr�s le calcul on obtient�

�BBBBBBBBBB�

� � � � � ��� � � � � �� � � � � �� � � � � �� � � � �� � � � � �� � � � �� �

�CCCCCCCCCCA

Pour le calcul e�ectif des chemins les plus courts� on utilise une matrice qui contientSuiv i� j�� le sommet qui suit i dans le chemin le plus court qui va de i � j� Les valeursSuiv i� j� sont initialis�es � j s�il existe un arc de i vers j et � �� sinon� Suiv i� i� estlui initialis� � i� Le calcul pr�c�dent qui a donn� peut s�accompagner de celui de Suiven proc�dant comme suit�

Page 186: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� EXPLORATION

for �int k � � k � n� ��k�

for �int i � � i � n� ��i�

for �int j � � j � n� ��j�

if �delta#i$#j$ �delta#i$#k$ � delta#k$#j$�

delta#i$#j$ � delta#i$#k$ � delta#k$#j$�

suivant#i$#j$ � suivant#i$#k$�

Une fois le calcul des deux matrices e�ectu� on peut retrouver le chemin le pluscourt qui joint i � j par la proc�dure�

static void plusCourtChemin�int i� int j�

for �int k � i� k &� j� k � suivant#k$#j$�

System�out�print �k � � ���

System�out�println �j��

Sur l�exemple pr�c�dent on trouve�

Suiv �

�BBBBBBBBBB�

� � � � � � �� � � � � �� � � � � �� � � � � � �� � � � � � �� � � � � � �� � � � � � �

�CCCCCCCCCCA

����� Sous�s�quences communes

On utilise aussi un algorithme de programmation dynamique pour rechercher dessous�s�quences communes � deux s�quences donn�es� pr�cisons tout d�abord quelquesd��nitions� Une s�quence !ou un mot" est une suite �nie de symboles !ou lettres" prisdans un ensemble �ni !ou alphabet"� Si u � a� � � � an est une s�quence� o$ a�� � � � � ansont des lettres� l�entier n est la longueur de u� Une s�quence v � b� � � � bm est unesous�s�quence de u � a� � � � an s�il existe des entiers i�� � � � � im� !� � i� � � � � im � n"tels que aik � bk !� � k � m"� Une s�quence w est une sous�s�quence commune auxs�quences u et v si w est sous�s�quence de u et de v� Une sous�s�quence commune estmaximale si elle est de longueur maximale�

On cherche � d�terminer la longueur d�une sous�s�quence commune maximale �u � a� � � � an et v � b� � � � bm� Pour cela� on note L�i� j� la longueur d�une sous�s�quencecommune maximale aux mots a� � � � ai et b� � � � bj � !� � j � m� � � i � n"� On peutmontrer que

L�i� j� �

�� � L�i� �� j � �� si ai � bjmax�L�i� j � ��� L�i � �� j�� sinon�

��

En e�et� soit w une sous s�quence de longueur maximale� commune � a� � � � ai��et � b� � � � bj�� si ai � bj � wai est une sous�s�quence commune maximale � a� � � � ai etb� � � � bj � Si ai � bj alors une sous�s�quence commune � a� � � � ai et b� � � � bj est ou biencommune � a� � � � ai et b� � � � bj�� !si elle ne se termine pas par bj"� ou bien � a� � � � ai��et b� � � � bj� !si elle ne se termine par ai"� On obtient ainsi l�algorithme qui permet ded�terminer la longueur d�une sous s�quence commune maximale � a� � � � an et b� � � � bm

static void longueurSSC �String u� String v�

Page 187: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���� PROGRAMMATION DYNAMIQUE �

int n � u�length���

int m � v�length���

int longueur#$#$ � new int#n$#m$�

for �int i � � i � n� ��i� longueur#i� $ � �

for �int j � � j � m� ��j� longueur#� j$ � �

for �int i � �� i � n� ��i�

for �int j � �� j � m� ��j�

if �u�charAt�i� �� v�charAt�j��

longueur#i$#j$ � � � longueur#i��$#j��$�

else if longueur#i$#j��$ longueur#i��$#j$

longueur#i$#j$ � longueur#i$#j��$�

else

longueur#i$#j$ � longueur#i��$#j$�

Il est assez facile de transformer l�algorithme pour retrouver une sous�s�quence maxi�male commune au lieu de simplement calculer sa longueur� Pour cela� on met � jourun tableau provient qui indique lequel des trois cas a permis d�obtenir la longueurmaximale�

static void longueurSSC �String u� String v�

int#$#$ longueur� int#$#$ provient�

int n � u�length���

int m � v�length���

for �int i � � i � n� ��i� longueur#i� $ � �

for �int j � � j � m� ��j� longueur#� j$ � �

for �int i � �� i � n� ��i�

for �int j � �� j � m� ��j�

if �u�charAt�i� �� v�charAt�j��

longueur#i$#j$ � � � longueur#i��$#j��$�

provient#i�j$ � ��

� else if longueur#i$#j��$ longueur#i��$#j$

longueur#i$#j$ � longueur#i$#j��$�

provient#i�j$ � ��

� else

longueur#i$#j$ � longueur#i��$#j$�

provient#i�j$ � �

Une fois ce calcul e�ectu� il su%t de remonter � chaque �tape de ij vers i� j� �vers i j� ou vers i� j en se servant de la valeur de provient�ij��

static String ssc �String u� String v�

int n � u�length���

int m � v�length���

int longueur#$#$ � new int#n$#m$�

int provient#$#$ � new int#n$#m$�

longueurSSC �u� v� longueur� provient��

int lg � longueur#n$#m$�

StringBuffer res � new StringBuffer�lg��

int i � n� j � m�

for �int k � lg��� k � � �

switch �provient#i$#j$�

Page 188: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� CHAPITRE �� EXPLORATION

case �� res�setCharAt�k� u�charAt�i����� ��i� ��j� ��k�

break�

case �� ��j� break�

case �� ��i� break�

return new String�res��

Remarque La recherche de sous�s�quences communes � deux s�quences intervientparmi les nombreux probl�mes algorithmiques pos�s par la recherche des propri�t�s dess�quences repr�sentant le g�nome humain�

�� Programmes en Caml

�� les n reines� voir page ��� ��

let nReines n �

let pos � make�vect n in

let conflit i� j� i� j� �

i� � i� �� j� � j� ��

abs�i� � i�� � abs �j� � j�� in

let compatible i j �

try

for k � to i�� do

if conflit i j k pos��k� then

raise Exit

done�

true

with Exit � false in

let rec reines i �

if i � n then

imprimerSolution pos

else

for j � to n�� do

if compatible i j then begin

pos��i� �� j�

reines �i����

end

done in

reines ��

�� les n reines �suite� ��

�open �printf���

let imprimerSolution pos �

let n � vect�length�pos� in

for i � to n�� do

for j � to n�� do

if j � pos��i� then

Page 189: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� PROGRAMMES EN CAML ��

printf �� �

else

printf � �

done�

printf ��n��

done�

printf ������������������������n���

�� les sous squences communes ��

let longueur�ssc u v �

let n � string�length u and

m � string�length v in

let longueur � make�matrix �n��� �m��� and

provient � make�matrix �n��� �m��� in

for i�� to n do

for j�� to m do

if u�#i��$ � v�#j��$ then begin

longueur��i���j� �� � � longueur��i�����j����

provient��i���j� �� ��

end else

if longueur��i���j��� longueur��i�����j� then begin

longueur��i���j� �� longueur��i���j����

provient��i���j� �� ��

end else begin

longueur��i���j� �� longueur��i�����j��

provient��i���j� �� ��

end

done

done�

longueur� provient��

let ssc u v �

let n � string�length u and

m � string�length v in

let longueur� provient � longueur�ssc u v in

let lg � longueur��n���m� in

let res � create�string lg and

i � ref n and

j � ref m and

k � ref �lg��� in

while &k � do

match provient��&i���&j� with

� � res�#&k$ �� u�#&i��$� decr i� decr j� decr k

� � � decr j

� � � decr i

done�

res��

Page 190: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� CHAPITRE �� EXPLORATION

Page 191: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���

Annexe A

Java

Le langage Java a �t� con�u par J� Gosling et ses coll�gues � Sun microsystems� Lelangage� pr�vu initialement pour programmer de petits automatismes� s�est vite retrouv�comme le langage de programmation du World Wide Web� car son interpr�teur a �t�int�gr� dans pratiquement tous les navigateurs existants� Tr�s rapidement� le langageest devenu populaire� De multiples livres le d�crivent� et il est un peu vain de vouloir lesr�sumer ici� nous nous contenterons d�un minimum� Parmi ces livres� les plus int�ressantsnous semblent dans l�ordre �j��j��j��j���

Voici trois exemples simples de programmes� ceux qui souhaitent apprendre Java enexaminant un programme plus fourni peuvent se reporter directement au paragrapheCarr�s magiques�

A�� Exemples simples

Le premier est un classique� il s�agit simplement d�a%cher Bonjour � � l��cran�

�� Voici mon premier programme ��

import java�io��� �� On a besoin de la biblioth+que d'entr(es et sorties

class PremierProg

public static void main �String args#$�

System�out�println��Bonjour&���

Pour ex�cuter ce programme il faut commencer par l��diter� pour cela on utilise un�diteur de texte !par exemple emacs" pour cr�er un �chier Premier�java qui le contient�Apr�s cela on le compile par la commande �

javac Premier�java

Ceci a pour e�et de faire construire par le compilateur un �chier PremierProg�class�en�n il faut ex�cuter ce programme par la commande java suivi du nom de la classe!dans ce cas c�est la fonction main de la classe qui est ex�cut�e" �

java PremierProg

On voit s�a%cher �

Bonjour&

Page 192: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE A� JAVA

Analysons le texte de ce premier programme� il contient d�abord un commentaire entreles deux symboles �� et ��� puis un appel � la biblioth�que d�entr�es sorties� un nouveaucommentaire de �n de ligne qui commence apr�s le symbole �� et se termine � la �nde la ligne� ces commentaires ne sont utiles qu�� des lecteurs !humains" du texte duprogramme� ils n�auront aucun e�et sur la compilation ou l�ex�cution�

Dans le programme� il y a une seule classe PremierProg� et une seule fonction !ondit aussi m�thode" dans cette classe� cette fonction a pour nom main� elle a%che lacha�ne de caract�res Bonjour� qui est donn�e sous forme d�un param�tre litt�ral � lafonction println� Cette derni�re fonction se trouve dans la partie System�out de labiblioth�que !d�o$ la fa�on de l�invoquer par System�out�println"�

Un deuxi�me exemple est le suivant �

class Additionner

public static void main �String args#$�

if �args�length &� ��

System�out�println��mauvais nombre d'arguments���

else

int s � Integer�parseInt�args#$� � Integer�parseInt�args#�$��

System�out�println �s���

Ce programme a%che la somme des deux nombres entiers qui lui sont donn�s� dansle cas o$ il y plus ou moins de � nombres� un message d�erreur est a%ch�� Pour e�ectuerl�addition des deux nombres il faut les donner en arguments � la suite de l�appel dejava Additionner� ainsi �

java Additionner �" !�

r�pond �

��

On voit de nouvelles choses sur ce programme� d�abord il y a un if suivi d�uneexpression bool�enne !on dit aussi logique"� Cette expression fait intervenir la variableargs� qui repr�sente la suite d�arguments suivant la commande java Additionner�Plus g�n�ralement args�length est le nombre d�arguments� args��� est le premier�args� � est le second etc� L�expression est ainsi vraie si le nombre d�arguments estdi��rent de � !le symbole �� signi�e � en C et en Java" � dans ce cas le programmea%che un message et puis s�arr�te� Si la condition apr�s le if n�est pas satisfaite� c�estce qui se trouve apr�s else qui est ex�cut�� ici il s�agit d�une suite d�instructions entre� et �� La premi�re instruction calcule la somme de deux entiers en commen�ant partransformer les param�tres� qui sont des cha�nes de caract�res� en des entiers par lafonction parseInt� La seconde a%che cette valeur�

Un troisi�me programme additionne des nombres entiers en quantit� quelconque�

class Somme

public static void main �String args#$�

int s � �

for �int i � � i � args�length� i���

s � s � Integer�parseInt�args#i$��

System�out�println �s��

Ainsi�

Page 193: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A��� SYMBOLES ���

java Somme �� �� � ! ��

a%che aussi ��Dans le texte de ce programme� on voit appara�tre la boucle for qui contient trois

sous�instructions� entre parenth�ses� s�par�es par des � et un corps de boucle qui estici � s � s � Integer�parseInt�args�i�� La premi�re sous�instruction du for n�estex�cut�e qu�une seule fois au d�but� elle initialise la variable i � �� La seconde sous�instruction est une expression logique !test" qui est un test de suite de calcul � si celle�cin�est pas satisfaite on sort de la boucle� sinon on ex�cute le corps de la boucle et on va� la troisi�me sous�instruction� Cette troisi�me sous�instruction est une instruction quiest ex�cut�e apr�s le corps� ici il s�agit d�une incr�mentation � i��� signi�e incr�menteri !ajouter � � i"� une fois cette incr�mentation e�ectu�e� on revient au test� Lorsqu�onsort de la boucle for� une instruction demande que le r�sultat !contenu dans la variables" soit a%ch��

A�� Symboles

Dans un programme il est indispensable de savoir reconna�tre les di��rents symbolesqui y apparaissent � espacements� commentaires� s�parateurs� mots r�serv�s� litt�raux�op�rateurs� identi�cateurs�

A���� S�parateurs� commentaires

Un espacement dans un programme est une suite d�espaces� de tabulations ou de pas�sages � la ligne� Un espacement sert pour s�parer les noms des variables des op�rationset des autres symboles�

Il y a aussi � caract�res qui servent de s�parateurs� il s�agit de� � � � � � �

On verra leur utilisation plus loin�Un commentaire est du texte qui se trouve soit entre les deux symboles �� et ���

soit entre le symbole �� et la �n d�une ligne� Rappelons que le but du commentaire estd�aider un lecteur � comprendre le programme que l�on a �crit !noter que ce lecteurpeut tr�s bien �tre soi m�me'" le compilateur ne les consid�re pas�

A���� Mots r�serv�s� op�rateurs

Les mots suivants ont une signi�cation particuli�re en Java et ne peuvent �tre utilis�spour d�signer autre chose� Il s�agit de mots qui sont utilis�s dans une instruction ou uned�claration� Un bon programmeur doit conna�tre la signi�cation de tous ces mots� onse limitera dans le cours � en expliquer une petite partie� de l�ordre d�une vingtaine�

abstract boolean break byte case

catch char class const continue

default do double else extends

final finally float for goto

if implements import instanceof int

interface long native new package

private protected public return short

static super switch synchronized this

throw throws transient try void

volatile while

Page 194: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE A� JAVA

Les op�rateurs sont au nombre de � � ils servent � exprimer des op�rations sur lesnombres� caract�res� ou les valeurs bool�ennes !vrai� faux"�

Les plus courants sont �

cp cori&x�annee�&

� � � � � � �� �� "" ## � � �� �� �� ��

A���� Identi�cateurs� litt�raux

Les identi�cateurs sont des s�quences de lettres et de chi�res commen�ant par unelettre� Les identi�cateurs sont s�par�s par des espacements� des s�parateurs ou desop�rateurs� les mots r�serv�s ne peuvent pas �tre utilis�s comme identi�cateurs�

Les litt�raux sont des constantes qui d�signent un entier !comme ���� ou � "� un�ottant !comme ������� ou �e��" � un bool�en !true ou false" un caract�re !entre deux�"� une cha�ne de caract�res !entre deux �" Voici quelques exemples de litt�raux� on enverra d�autres plus loin�

��$ � � �� $ �e�� true �c� �Bonjour��

A�� Types primitifs

En Java les variables et les expressions doivent avoir un type� il y a trois sortesde types � les types primitifs sont les plus simples� le type tableau� et les types d��nispar une classe !il y a aussi des types d��nis par une interface� mais cette notion sortdu cadre d�une initiation"� Le type d�une variable doit �tre d�clar� n�importe o$ avantl�utilisation de la variable� pour cela on indique le nom du type avant le nom de lavariable� Par exemple la suite suivante d�clare que les variables a b c sont de typeentier� que x est de type r�el !on dit �ottant" et que mot est une cha�ne de caract�res�

int a� b� c�

float x�

String mot�

A���� Num�rique entier

Le type d�un entier est byte� short� int ou long� selon qu�on le repr�sente sur� �� �� ou � bits� On utilise principalement int� car toutes les machines ont desprocesseurs �� bits� et bient)t � bits� Attention� il y a � conventions bien sp�ci�ques surles nombres entiers� les nombres commen�ant par �x sont des nombres hexad�cimaux�Ainsi �xff vaut ���� De m�me� sur une machine �� bits� �xffffffff vaut ��� Lesconstantes enti�res longues sont de la forme L� ��L� Les plus petites et plus grandesvaleurs des entiers sont Integer�MIN�VALUE � ����� Integer�MAX�VALUE � ������ desentiers longs Long�MIN�VALUE � ����� Long�MAX�VALUE � ��� � �� Byte�MIN�VALUE ������ Byte�MAX�VALUE � ���� etc�

A���� Num�rique �ottant

Le type d�un r�el est float ou double� Ce sont des nombres �ottants en simpleou double pr�cision� Les constantes sont en notation d�cimale �� $ % ou en notationavec exposant � �$ %e� et respectent la norme IEEE ��� Par d�faut les constantessont prises en double pr�cision� �� $ %f est un �ottant en simple pr�cision� Les valeursminimales et maximales sont Float�MIN�VALUE et Float�MAX�VALUE� Il existe aussi lesconstantes de la norme IEEE� Float�POSITIVE�INFINITY� Float�NEGATIVE�INFINITY�Float�NaN� etc�

Page 195: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A�� EXPRESSIONS ���

A���� Bool�ens

Les variables bool�ennes sont d�clar�es par le type boolean� elles ne peuvent prendreque deux valeurs � true et false qui sont aussi des litt�raux� on peut ainsi �crire

boolean fini � true�

A���� Caract�res

Le type des caract�res est char� Les constantes sont �crites entre apostrophes� comme�A�� �B�� �a�� �b�� ���� � �� � �� Le caract�re apostrophe se note �&��� et plus g��n�ralement il y a des conventions pour des caract�res fr�quents� �&n� pour newline��&r� pour retour�charriot� �&t� pour tabulation� �&&� pour &� Attention� les caract�ressont cod�s sur � bits� avec le standard international Unicode� On peut aussi �crire uncaract�re par son code �&u�� pour le caract�re nul !code �"�

Les constantes cha�nes de caract�res sont �crites entre guillemets� comme dans�Pierre et Paul�� On peut mettre des caract�res sp�ciaux � l�int�rieur� par exemple�Pierre&net&nPaul&n� qui s�imprimera sur trois lignes� Pour mettre un guillemet dansune cha�ne� on �crit &�� Si les constantes de type cha�nes de caract�res ont une syntaxesp�ciale� noter que la classe String des cha�nes de caract�res n�est pas un type primitif�

A� Expressions

A���� Expressions arithm�tiques

Une expression arithm�tique est form�e de variables� ou de constantes qui sont desnombres et d�op�rateurs qui sont les op�rations math�matiques habituelles� La notationest celle couramment utilis�e en math�matiques� les op�rations usuelles sont ���� �pour l�addition� soustraction� multiplication� division et le reste de la division !modulo"�Il y a des r�gles de priorit�� ainsi l�op�ration de multiplication a une plus grande priorit�que l�addition� cela signi�e que les multiplications sont faites avant les additions� Lapr�sence de parenth�ses permet de mieux contr)ler le r�sultat� Par exemple � � � � %est �valu� � ��� par contre �� � � � % est �valu� �� Un expression a toujours un typeet le r�sultat de son �valuation est une valeur ayant ce type� L��valuation de ��� soul�vel�exception !voir plus loin" ArithmeticException�

A���� Expressions logiques

Une expression logique a pour r�sultat un bool�en� Par exemple� le test d��galit�a �� b a pour r�sultat true si les deux nombres !ou les deux bool�ens� ou les deuxcaract�res" a et b sont �gaux� et false sinon� La signi�cation de a �� b dans d�autrescas� n�cessite de conna�tre la notion de r�f�rence� ce qui n�est pas notre propos ici�L�op�rateur �� !di��rent de" a un r�sultat oppos� � celui de ��� Les op�rateurs deconnection logique et� ou� non sont repr�sent�s respectivement par "" ## � les deuxop�rateurs "" ## sont les seuls pour lesquels l��valuation des deux op�randes n�estpas faite syst�matiquement pour obtenir le r�sultat� Ainsi� l��valuation de u "" v com�mence par celle de u si on obtient false le r�sultat global est false sans qu�il soit faitl��valuation de v� Par exemple �$ �� � "" ���� �� � s��value � false alors que���� �� �"" �$ �� � soul�ve une exception� L�op�rateur ## suit une r�gle similaire�

Pour tout autre op�rateur� tous les op�randes sont syst�matiquement �valu�s avantd�e�ectuer l�op�ration�

Page 196: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ANNEXE A� JAVA

A���� Concat�nation

Le symbole � d�signe aussi la concat�nation !mise bout � bout" de deux cha�nes decaract�res� le contexte permet de d�terminer s�il s�agit de l�addition de deux nombresou de la concat�nation� On dit qu�il y a surcharge de l�op�ration ��

A���� Expressions sur les bits

Les op�rations sur les bits peuvent se r�v�ler utiles� On peut faire " !et logique"� #!ou logique"� ' !ou exclusif"� �� !d�calage vers la gauche"� �� !d�calage vers la droite"�� !compl�ment � �"� Ainsi

x � x % xff�

y � y � x��

mettent dans x les derniers bits de x et positionne le ��me bit � partir de la droitedans y� Il faut bien distinguer les op�rations logiques "" et ## � r�sultat bool�en desop�rations " et # sur les bits qui donnent une valeur enti�re� Par exemple� si x vaut �et y vaut �� x " y vaut ��

Les op�rations �� et �� d�calent leur op�rande de gauche de la valeur indiqu�e parl�op�rande de droite� Ainsi � �� � vaut ��� et � �� � vaut �� Les d�calages � gaucheintroduisent toujours des z�ros sur les bits de droite� Pour les bits de gauche dans le casdes d�calages � droite� c�est d�pendant de la machine�

Le compl�ment � � est tr�s utile dans les expressions sur les bits� Il permet d��criredes expressions ind�pendantes de la machine� Par exemple

x � x % ,x"f�

remet � z�ro les bits de gauche de x� ind�pendamment du nombre de bits pour repr��senter un entier� Une notation� supposant des entiers sur �� bits et donc d�pendante dela machine� serait

x � x % xffff��

A��� Pr�c�dences

Certains op�rateurs ont des pr�c�dences �videntes� et limitent l�utilisation des pa�renth�ses dans les expressions� D�autres sont moins clairs� voici la table donnant lespr�c�dences dans l�ordre d�croissant� on utilise le parenth�sage en cas d��galit�

Oprateurs Associativit Signi�cation�� #$ � gauche � droite fonction� tableau� champs& , �� �� � � droite � gauche oprateurs unaires� � � gauche � droite oprateurs multiplicatifs� � gauche � droite oprateurs additifs�� gauche � droite dcalages� �� � gauche � droite comparaisons numriques�� &� gauche � droite tests dgalit% gauche � droite et sur chaque bit� gauche � droite ou sur chaque bit%% gauche � droite et logique�� gauche � droite ou logique � droite � gauche if then else� �� �� �� �� �� %� �� �� ��� � droite � gauche a ectations

En r�gle g�n�rale� il est conseill� de mettre des parenth�ses si les pr�c�dences ne sontpas claires�

Page 197: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A�� INSTRUCTIONS ��

A� Instructions

Toute expression suivie d�un point�virgule devient une instruction� Ainsi le point�virgule fait partie de l�instruction� et n�est pas un s�parateur comme en Pascal� Dem�me� les accolades � � permettent de regrouper des instructions en s�quence� Ce quipermet de mettre plusieurs instructions dans les alternatives d�un if par exemple�

A��� A�ectations

L�instruction la plus courante est l�a�ectation� elle s��crit �

a � e�

elle consiste � �valuer l�expression e� puis � a�ecter la valeur ainsi obtenue � la variablea�

A titre anecdotique� les op�rateurs d�a�ectation peuvent �tre plus complexes que lesimple � et permettent des abr�viations parfois utiles� Ainsi� si op est un des op�rateurs�� �� �� �� �� ��� ��� "� '� ou #�

e� op e�

est un raccourci pour

e� e� op e�

L�a�ectation peut �tre consid�r�e comme un op�rateur dans une expression� le r��sultat est la valeur a�ect�e � la partie gauche� On peut donc �crire simplement

x � y � z � ��

pour

x � �� y � �� z � ��

Une expression qui contient une a�ectation modi�e donc la valeur d�une variablependant son �valuation� On dit alors que cette expression a un e�et de bord � Les e�etsde bord sont � manipuler avec pr�caution� car leur e�et peut d�pendre d�un ordred��valuation tr�s complexe� Il est par exemple peu recommand� de mettre plus d�une�et de bord dans une expression�

A��� Incr�mentation

L�instruction i��� ou ��i� est une incr�mentation� elle s�applique � une variable detype entier et a pour e�et d�ajouter � � sa valeur� En rempla�ant �� par �� on retranche� au lieu d�ajouter !d�cr�mentation"� Ainsi �

��i�

j���

a le m�me r�sultat que �

i � i � ��

j � j � ��

L�incr�mentation peut aussi �tre e�ectu�e � l�int�rieur d�une expression� elle a alorsun e�et de bord� il y a des op�rations de pr��incr�mentation� de post�incr�mentation� depr��d�cr�mentation� de post�d�cr�mentation qui permettent de fournir la valeur d�unevariable tout en l�incr�mentant ou la d�cr�mentant !lui ajouter ou retrancher �" avantou apr�s � Par exemple� supposons que n vaille �� alors le programme suivant

x � ��n�

Page 198: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ANNEXE A� JAVA

y � n���

z � ��n�

t � n���

fait passer n � � met dans x� met dans y� fait passer n � � puis retranche � � n pourlui donner la valeur � nouveau� met cette valeur dans z et dans t� et fait passer n ���De mani�re similaire� on pourra �crire

if �c &� ' '�

c � s�charAt�i����

pour

if �c &� ' '�

c � s�charAt�i��

��i�

En r�gle g�n�rale� il ne faut pas abuser des op�rations d�incr�mentation� Si c�est unecommodit� d��criture comme dans les deux cas pr�c�dents� il n�y a pas de probl�me� Sil�expression devient incompr�hensible et peut avoir plusieurs r�sultats possibles selonun ordre d��valuation d�pendant de l�impl�mentation� alors il ne faut pas utiliser cesop�rations et on doit s�parer l�expression en plusieurs morceaux pour isoler la partiee�et de bord�

On doit �viter les e�ets de bord dans une expression

A��� Conversions

Il est important de bien comprendre les r�gles de conversions implicites dans l��va�luation des expressions� Par exemple� si f est r�el� et si i est entier� l�expression f � iest un r�el qui s�obtient par la conversion implicite de i vers un float� Certaines conver�sions sont interdites� comme par exemple indicer un tableau par un nombre r�el� Eng�n�ral� on essaie de faire la plus petite conversion permettant de faire l�op�ration !cf��gure A��"� Ainsi un caract�re n�est qu�un petit entier� Ce qui permet de faire facilementcertaines fonctions comme la fonction qui convertit une cha�ne de caract�res ASCII enun entier !atoi est un raccourci pour Ascii To Integer"

static int atoi �String s�

int n � �

for �int i � � i � s�length��� ��i�

n � � � n � �s�charAt�i� � ''��

return n�

On peut donc remarquer que s�charAt�i � ��� permet de calculer l�entier qui repr��sente la di��rence entre le code de s�charAt�i et celui de ���� N�oublions pas quecette fonction est plus simplement calcul�e par Integer�parseInt�s�

Les conversions implicites suivent la �gure A��� Pour toute op�ration� on convertittoujours au le plus petit commun majorant des types des op�randes� Des conversionsexplicites sont aussi possibles� et recommand�es dans le doute� On peut les faire parl�op�ration de coercion !cast" suivante

�type�name� expression

Page 199: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A�� INSTRUCTIONS ���

double

float

long

int char

short

byte

Fig� A�� � Conversions implicites

L�expression est alors convertie dans le type indiqu� entre parenth�ses devant l�expres�sion� L�op�rateur � d�a�ectation est un op�rateur comme les autres dans les expressions�Il subit donc les m�mes lois de conversion� Toutefois� il se distingue des autres op�rationspar le type du r�sultat� Pour un op�rateur ordinaire� le type du r�sultat est le typecommun obtenu par conversion des deux op�randes� Pour une a�ectation� le type dur�sultat est le type de l�expression � gauche de l�a�ectation� Il faut donc faire uneconversion explicite sur l�expression de droite pour que le r�sultat soit coh�rent avecle type de l�expression de gauche� En�n� dans les appels de fonctions� il y a aussi uneop�ration similaire � une a�ectation pour passer les arguments� et donc des conversionsdes arguments sont possibles�

A��� Instructions conditionnelles

Les instructions de contr)le sont � peu pr�s les m�mes qu�en Pascal� D�abord lesinstructions conditionnelles if sont de la forme

if �E�

S�

ou

if �E�

S�else

S�

Remarquons bien qu�une instruction peut �tre une expression suivie d�un point�virgule!contrairement � Pascal"� Donc l�instruction suivante est compl�tement licite

if �x � ��

c � '' � x�

else

c � 'a' � x � ��

Il y a la m�me convention qu�en Pascal pour les if embo�t�s� Le else se rapportanttoujours au if le plus proche�

Parfois� on peut trouver un peu long d��crire

if �a b�

z � a�

Page 200: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE A� JAVA

else

z � b�

On peut alors utiliser l�expression conditionnelle 2 �

e� � e� � e�

Celle�ci �value e� d�abord� si l�on obtient true� le r�sultat est e�� sinon c�est e�� Doncle maximum de a et b peut s��crire

z � �a b� a � b�

Une s�rie de if peut �tre remplac�e par une instruction de s�lection par cas� c�estl�instruction switch� Elle a la syntaxe suivante

switch �E�

case c�� instructions

case c�� instructions

���

case cn� instructions

default� instructions

Cette instruction a une signi�cation bien particuli�re� Pour sortir de l�instruction� ilfaut passer par une instruction break� Sinon� le reste de l�instruction est ex�cut� en s��quence� Cela permet de regrouper plusieurs alternatives� mais peut �tre particuli�rementdangereux� Par exemple� le programme suivant

switch �c�

case '�t'�

case ' '�

�� nEspaces�

break�

case ''� case '�'� case '�'� case '�'� case '�'�

case '!'� case '�'� case '"'� case '�'� case '�'�

�� nChiffres�

break�

default�

�� nAutres�

break�

permet de factoriser le traitement de quelques cas� On verra que l�instruction breakpermet aussi de sortir des boucles� Il faudra donc bien faire attention � ne pas oublierle break � la �n de chaque cas� et � ce que break ne soit pas intercept� par une autreinstruction�

A�� It�rations

Les it�rations sont r�alis�es par les instructions for� while� et do���while� L�instruc�tion while permet d�it�rer tant qu�une expression bool�enne est vraie� on it�re l�instruc�tion S tant que la condition E est vraie par

while �E�

S

et on fait de m�me en e�ectuant au moins une fois la boucle par

do

Page 201: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A�� INSTRUCTIONS ���

S

while �E��

L�instruction d�it�ration la plus puissante est l�instruction for� Sa syntaxe est

for �E�� E�� E��

S

qui est �quivalente �

E��

while �E��

S�

E��

Elle est donc beaucoup plus complexe qu�en Pascal ou Caml et peut donc ne pas ter�miner� puisque les expressions E� et E� sont quelconques� On peut toujours �crire desit�rations simples�

for �i � � i � �� ��i�

a#i$ � �

mais l�it�ration suivante est plus complexe !voir le paragraphe sur le hachage dans lepremier chapitre du cours Algorithme et Programmation"

for �int i � h�x�� i &� ��� i � col#i$�

if �x�equals�nom#i$��

return tel#i$�

Nous avons vu que l�instruction break permet de sortir d�une instruction switch�mais aussi de toute instruction d�it�ration� De m�me� l�instruction continue permet depasser brusquement � l�it�ration suivante� Ainsi

for �i � � i � n� ��i�

if �a#i$ � �

continue�

���

C�est bien commode quand le cas ai � � est tr�s long� Les break et continue peuventpr�ciser l��tiquette de l�it�ration qu�elles r�f�rencent� Ainsi� dans l�exemple suivant� ond�clare une �tiquette devant l�instruction while� et on sort des deux it�rations commesuit�

boucle�

while �E�

for �i � � i � n� ��i�

if �a#i$ � �

break boucle�

���

Page 202: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE A� JAVA

A�� Tableaux

A� �� D�claration� construction

Les tableaux permettent d�utiliser plusieurs variables de m�me type� ainsi avec lad�claration et la construction �

int v#$ � new int#��$�

ou la suivante qui est �quivalente �

int#$ v � new int#��$�

on a � sa disposition ��� variables de type int que l�on peut a�ecter et �valuer� Chacunede ces variables est accessible par a�i�� o$ i est un entier compris entre � et ���� Tousles tableaux commencent par l�indice �gal � �� Si i est en dehors de ces limites� uneexception IndexOutOfBoundsException est soulev�e� La notation v�length indique lalongueur du tableau v�

La construction usuelle de parcours des �l�ments d�un tableau fait itervenir uneboucle for� voici par exemple le calcul du plus petit �l�ment d�un tableau !non vide"

int min � v#$�

for �int i � � i � v�length� ��i�

if �v#i$ � min� min � v#i$�

On verra que les tableaux sont en fait des objets� de ce point de vue length est unchamps associ� � l�objet�

A� �� Matrices

Les tableaux n�ont qu�une seule dimension� un tableau � deux dimensions est consi�d�r� comme un tableau dont tous les �l�ments sont des tableaux � une dimension� etc�Pour d�clarer une matrice de taille ��� �� on �crit �

int#$#$ mat � new int#�$#�$�

Comme on l�a vu� la cr�ation d�un tableau se fait avec le mot�cl� new comme pourles objets� mais il existe une facilit� syntaxique pour cr�er des tableaux � plusieursdimensions� Voici par exemple le calcul de la table de v�rit� de l�union de deux op�rateursbool�ens�

static boolean#$#$ union �boolean a#$#$� boolean b#$#$�

boolean c#$#$ � new boolean #�$#�$�

for �int i � � i � �� ��i�

for �int j � � j � �� ��j�

c#i$#j$ � a#i$#j$ �� b#i$#j$�

return c�

Pour initialiser un tableau� on peut le faire avec des constantes lit�rales�

boolean intersection #$#$ � true� false�� false� false���

boolean ouExclusif #$#$ � false� true�� true� false���

Page 203: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A��� FONCTIONS� PROC�DURES ���

A�� Fonctions� Proc�dures

Chaque classe contient une suite lin�aire de fonctions ou proc�dures !on dit m�thodedans la terminologie des langage � objets"� Il n�y a pas de fonctions embo�t�es les unesdans les autres� Par convention� le d�but de l�ex�cution est donn� � la proc�dure publiquemain qui prend un tableau de cha�nes de caract�res comme argument� Pour d�clarerune fonction� on d�clare d�abord sa signature� c�est � dire le type de son r�sultat etdes arguments� puis son corps� c�est � dire la suite d�instructions qui la r�alisent� entreaccolades � �� Une fonction obtient un r�sultat� celui�ci est rendu par l�instructionreturn� Ainsi dans

static int suivant �int x�

if �x � � �� ��

return � � x � ��

else

return x � ��

le r�sultat est de type entier !� cause du mot�cl� int avant suivant" et l�unique argu�ment x est aussi entier� L�instruction

return e�

sort de la fonction en donnant le r�sultat e� et permet de rendre ce r�sultat�

A���� R�sultat void

Lorsqu�aucun r�sultat n�est rendu� on dit que l�on a a�aire � une proc�dure et le motr�serv� void pr�c�de la d�claration de m�thode� Dans les deux proc�dures qui suivent�le r�sultat est de type void et l�argument est entier�

static void test �int x�

while �x &� ��

x � suivant �x��

static void testConjecture �int n�

for �int x��� x �� n� ��x�

test �x��

System�out�println �x��

On calcule donc les it�rations de la fonction qui renvoie x�� si x est impair� et bx��csinon� !En fait� on ne sait pas d�montrer qu�on �nit toujours avec � pour tout entier xde d�part� Par exemple� � partir de � on obtient ��� ��� ��� � � ��� �� ��� ��� ��� ����� �� � �� �� �"�

A���� Variables locales� globales

Il peut y avoir des variables locales dans une proc�dure� plus exactement dans touteinstruction compos�e entour�e par des accolades� Les variables globales sont elles d�cla�r�es au m�me niveau que les proc�dures ou fonctions� Les variables locales peuvent �treinitialis�es� Cela revient � faire la d�claration et l�a�ectation par la valeur initiale� quipeut �tre une expression complexe et qui est �valu�e � chaque entr�e dans la fonction�Les variables locales disparaissent donc quand on quitte la fonction�

Page 204: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE A� JAVA

Dans une fonction� on peut acc�der aux variables globales et �ventuellement lesmodi�er� quoiqu�il est recommand� de ne pas faire trop d�e�ets de bord� mais on nepourra passer une variable en argument pour modi�er sa valeur� Prenons l�exemple dela fonction suivant pr�c�dente� on a chang� la valeur du param�tre x dans le corps dela fonction� Mais ceci n�est vrai qu�� l�int�rieur du corps de la fonction� En Java� seulela valeur du param�tre compte� on ne modi�era donc pas ainsi une variable ext�rieure� la fonction� pass�e en param�tre�

Les param�tres de type primitif des fonctions sont pass�s par valeur

Noter que cette r�gle ne s�applique pas aux types plus complexes� en particulier auxtableaux�

A�� Classes

Une classe est � la fois la d�claration d�un type non primitif et d�une s�rie de fonc�tions ou proc�dures associ�es� L�id�e est de d�couper en petits modules l�espace desdonn�es et des fonctions� Les �l�ments de l�ensemble repr�sent� par une classe sont lesobjets� Dans une classe� il y a une partie champs de donn�es� et une autre qui est unensemble de fonctions ou proc�dures� Dans la programmation orient�e�objet� on aimeparler d�objets comme des intances d�une classe� et de m�thodes pour les fonctions etproc�dures associ�es !�m�thodes car ce sont souvent des m�thodes d�acc�s aux objetsde la classe que r�alisent ces fonctions"� Bien s#r� il peut y avoir des classes sans donn�esou sans m�thodes� Prenons le cas d�une structure d�enregistrement classique en Pascalou en C� On peut �crire�

class Date

int j� �� Jour ��

int m� �� Mois ��

int a� �� Anne ��

��

et par la suite on peut d�clarer des variables� comme on le faisait avec les variables detype primitif !entier� r�el� caract�re ou bool�en"� Ainsi on note deux dates importantes

static final int Jan��� Fev��� Mar��� Avr��� Mai�!� Juin���

Juil�"� Aou��� Sep��� Oct��� Nov���� Dec����

Date bastille � new Date��� berlin � new Date���

bastille�j � ��� bastille�m � Juil� bastille�a � �"���

berlin�j � �� berlin�m � Nov� berlin�a � �����

Nous venons de d��nir deux objets bastille et berlin� et pour acc�der � leurs champson utilise la notation bien connue su%xe avec un point� Le champ jour de la date dela prise de la Bastille s�obtient donc par bastille�j� Rien de neuf� c�est la notationutilis�e en Pascal� en C� ou en Caml� Pour cr�er un objet� on utilise le mot�cl� new suividu nom de la classe et de parenth�ses� !Pour les experts� les objets sont repr�sent�s parun pointeur et leur contenu se trouve dans le tas"� Un objet non initialis� vaut null�

A���� Constructeurs

Nos dates sont un peu lourdes � manipuler� Tr�s souvent� on veut une m�thodeparam�tr�e pour construire un objet d�une classe� C�est tellement fr�quent qu�il y a unesyntaxe particuli�re pour le faire� Ainsi pour d�crire un constructeur on �crit le nom

Page 205: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A��� CLASSES ���

de la classe suivi des param�tres qui permettent d�e�ectuer la construction� voici unconstructeur de dates �

class Date

int j� �� Jour ��

int m� �� Mois ��

int a� �� Anne ��

Date �int jour� int mois� int annee�

this�j � jour�

this�m � mois�

this�a � annee�

��

on pourra cr�er les dates simplement avec

static Date berlin � new Date��� Nov� ������

bastille � new Date���� Juil� �"����

Un constructeur est donc une m�thode !non statique" sans nom� On indique le type deson r�sutat !i�e� le nom de la classe o$ il se trouve" et ses param�tres� Le corps de lafonction est quelconque� mais on ne fait pas �gurer d�instruction return � puisque sonr�sultat est toujours l�objet en cours de cr�ation� Le constructeur est appel� apr�s lemot r�serv� new� Dans le cas o$ il n�y a pas de constructeur explicite� le constructeur pard�faut !sans arguments" r�serve juste l�espace m�moire n�cessaire pour l�objet construit�Remarquons que dans le constructeur� on a utilis� le mot r�s�rv� this qui d�signe l�objeten cours de cr�ation pour bien comprendre que j� m et a sont des champs de l�objetconstruit� Le constructeur se �nit donc implicitement par return this� Mais� ce motr�serv� n��tait pas indispensable� on aurait pu simplement �crire

class Date

int j� �� Jour ��

int m� �� Mois ��

int a� �� Anne ��

Date �int jour� int mois� int annee�

j � jour�

m � mois�

a � annee�

��

A���� Champs statiques

Un champ peut �tre d�clar� statique� Cela signi�e qu�il n�existe qu�� un seul exem�plaire pour tous les objets de la classe dont il fait partie� Une donn�e statique est doncattach�e � une classe et non aux objets de cette classe� Supposons par exemple que l�ori�gine des temps !pour le syst�me Unix" soit une valeur de premi�re importance� ou quenous voulions compter le nombre de dates cr�es avec notre constructeur� On �crirait�

class Date

int j� �� Jour ��

int m� �� Mois ��

int a� �� Anne ��

static final int Jan��� Fev��� Mar��� Avr��� Mai�!� Juin���

Juil�"� Aou��� Sep��� Oct��� Nov���� Dec����

static Date tempsZeroUnix � new Date ��� Jan� ��"��

Page 206: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ANNEXE A� JAVA

static int nbInstances � �

Date �int jour� int mois� int annee�

j � jour�

m � mois�

a � annee�

��nbInstances�

��

Il y a donc deux sortes de donn�es dans une classe� les champs associ�s � chaque instanced�un objet !ici les jours� mois et ann�es"� et les champs uniques pour toute la classe !iciles constantes� la date temps�z�ro pour Unix et le nombre d�utilisateurs"� Les variablesstatiques sont initialis�es au chargement de la classe� les autres dynamiquement enacc�dant aux champs de l�objet�

A���� M�thodes statiques et dynamiques�

Consid�rons maintenant les m�thodes d�une classe� A nouveau� elles sont de deuxsortes� les m�thodes dynamiques et les m�thodes statiques� Dans notre cours� nous avonsfortement privil�gi� cette deuxi�me cat�gorie� car leur utilisation est tr�s proche de celledes fonctions ou proc�dures de C ou de Pascal� Les m�thodes statiques sont pr�c�d�esdu mot�cl� static� les d�clarations de m�thodes dynamiques n�ont pas de pr��xe� Lasyntaxe est celle d�une fonction usuelle� Prenons le cas de l�impression de notre classeDate�

class Date

���

static void imprimer �Date d�

System�out�print ��d � � � d�j � �� � �

�m � � � d�m � �� � �

�a � � � d�a��

et on pourra imprimer avec des instructions du genre

Date�imprimer �berlin��

Date�imprimer �bastille��

Remarquons qu�on doit quali�er le nom de proc�dure par le nom de la classe� si onse trouve dans une autre classe� !Cette syntaxe est coh�rente avec celle des acc�s auxchamps de donn�es"� Dans les langages de programmation usuels� on retrouve cettenotation aussi pour acc�der aux fonctions de modules di��rents� On peut aussi �crirede m�me une fonction qui teste l��galit� de deux dates

class Date

���

static boolean equals �Date d�� Date d��

return d��j �� d��j %% d��m �� d��m %% d��a �� d��a�

Jusqu�� pr�sent� nous avions consid�r� des objets� des fonctions� et des classes� Lesm�thodes non statiques sont le b�aba de la programmation objet� Quelle est l�id�e-Comme une classe� un objet a non seulement des champs de donn�es� mais il contientaussi un vecteur de m�thodes� Pour d�clencher une m�thode� on passe les param�tres auxm�thodes de l�objet� Ces fonctions ont la m�me syntaxe que les m�thodes statiques� � une

Page 207: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A��� CLASSES ��

exception pr�s� elles ont aussi le param�tre implicite this qui est l�objet dont elles sontla m�thode� !Pour acc�der aux champs de l�objet� this est facultatif"� Ce changement�qui rend plus proches les fonctions et les donn�es� peut para�tre mineur� mais il est � labase de la programmation objet� car il se combinera � la notion de sous�classe� Prenonsl�exemple des deux m�thodes statiques �crites pr�c�demment� Nous pouvons les r��criredynamiquement comme suit�

class Date

���

void print ��

System�out�print ��d � � � this�j � �� � �

�m � � � this�m � �� � �

�a � � � this�a��

boolean equals �Date d�

return this�j �� d�j %% this�m �� d�m %% this�a �� d�a�

ou encore sans le mot�cl� this non n�cessaire ici�

class Date

���

void print ��

System�out�print ��d � � � j � �� � �

�m � � � m � �� � �

�a � � � a��

boolean equals �Date d�

return j �� d�j %% m �� d�m %% a �� d�a�

et on pourra �crire

if �&berlin�equals�bastille��

berlin�print ���

Dans cette �criture� on passe l�argument !quand il existe" � la m�thode correspondantede l�objet auquel appartient cette m�thode� Nous avons d�j� utilis� cette notation avecles fonctions pr�d��nies de la librairie� Par exemple println est une m�thode associ� au�ux de sortie out� qui lui m�me est une donn�e statique de la classe System� De m�mepour les cha�nes de caract�res� la classe String d��nit les m�thodes length� charAtpour obtenir la longueur de l�objet cha�ne s ou lire le caract�re � la position i dans scomme suit�

String s � �Oh� la belle cha-ne��

if �s�length�� ��

System�out�println �s�charAt�i���

Il faut savoir que la m�thode !publique" sp�ciale toString peut �tre prise en comptepar le syst�me d��criture standard� Ainsi� dans le cas des dates� si on avait d�clar��

class Date

���

public String toString ��

Page 208: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ANNEXE A� JAVA

return ��d � � � j � �� � �

�m � � � m � �� � �

�a � � � a��

on aurait pu seulement �crire

if �&berlin�equals�bastille��

System�out�println �berlin��

En�n� dans une classe� on peut directement mettre entre accolades des instructions��ventuellement pr�c�d�es par le mot�cl� static pour initialiser divers champs � chaquecr�ation d�un objet ou au chargement de la classe�

A���� Copie� destruction

Un objet peut �tre pass� comme param�tre d�une proc�dure ou fonction� mais alorsseule la r�f�rence � l�objet est pass�e� Il n�y a pas de copie de l�objet� Donc� on peut�ventuellement modi�er le contenu de l�objet dans la proc�dure� Pour copier un objet�il faut faire une fonction particuli�re� noter que l�on peut souvent utiliser la m�thodeclone�

Les objets ne sont jamais copi�s implicitement

D�autre part� il n�y a pas d�instruction pour d�truire des objets� Ce n�est pas grave� carle garbage collector !GC" r�cup�re automatiquement l�espace m�moire des objets nonutilis�s� Cela est fait r�guli�rement� notamment quand il n�y a plus de place en m�moire�C�est un service de r�cup�ration des ordures� comme dans la vie courante� Il n�y a doncpas � se soucier de la d��allocation des objets�

A��� Surcharge

Il est possible de d��nir plusieurs m�thodes ayant le m�me nom !on dit qu�elles sontsurcharg�es"� en faisant varier le type de leurs arguments ou leur nombre� Nous avonsd�j� vu le cas de println qui prenait z�ro arguments ou un argument de type quelconque!qui �tait en fait transform� en cha�ne de caract�res avec la m�thode toString"� Onpeut d�clarer tr�s simplement de telles m�thodes surcharg�es� par exemple dans le casdes constructeurs�

class Date

int j� �� Jour ��

int m� �� Mois ��

int a� �� Anne ��

Date �int jour� int mois� int annee�

j � jour� m � mois� a � annee�

Date �long n�

�� Un savant calcul du jour� mois et anne � partir du nombre�� de millisecondes depuis lorigine des temps informatiques� ie�� le � janvier �����

Date ��

�� idem avec le temps courant System�currentTimeMillis�

Page 209: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A��� ENTR�ES�SORTIES ���

��

Le constructeur ad�quat sera appel� en fonction du type ou du nombre de ses argu�ments� ici avec trois entiers d�signant les jour� mois et ann�e� ou avec un seul entierlong donnant le nombre de milisecondes depuis le d�but des temps informatiques� ousans argument pour avoir la date du jour courant� !Remarque� compter le temps avecdes milisecondes sur � bits reporte le probl�me du bug de l�an ���� � l�an ��� mais cen�est pas le cas dans certains syst�mes Unix o$ le nombre de secondes sur �� bits depuis�� � reporte le probl�me � l�an ���'"� Il faut faire attention aux abus de surcharge� etintroduire une certaine logique dans son utilisation� sinon les programmes deviennentrapidement incompr�hensibles� Pire� cela peut �tre redoutable lorsqu�on combine sur�charge et h�ritage !cf� plus loin"�

La surcharge est r�solue statiquement � la compilation�

A�� Entr�es�Sorties

Nous ne consid�rons que quelques instructions simples permettant de lire ou �criredans une fen�tre texte ou avec un �chier� System�in et System�out sont deux champsstatiques !donc uniques" de la classe syst�me� qui sont respectivement des InputStreamet PrintStream� Dans cette derni�re classe� il y a notamment les m�thodes� flush quivide les sorties non encore e�ectu�es� print et println qui impriment sur le terminalleur argument avec �ventuellement un retour � la ligne� Pour l�impression� l�argumentde ces fonctions est quelconque� !�ventuellement vide pour la deuxi�me"� Elles sontsurcharg�es sur pratiquement tous les types� et transforment leur argument en cha�nede caract�res� Ainsi�

System�out�println ��x� �� donne x � newline

System�out�println ��� � newline�

System�out�print ������ ����

System�out�print �������� ����

System�out�print �true� true

System�out�print ��true�� true

Les m�thodes des classes InputStream et PrintStream lisent ou impriment des oc�tets !byte"� Il vaut mieux faire des op�rations avec des caract�res Unicode !sur � bits�qui comprennent tous les caract�res internationaux"� Pour cela� au lieu de fonctionneravec les �ux d�octets !Stream tout court"� on utilise les classes des Reader ou des Wri�ter� comme InputStreamReader et OutputStreamWriter� qui manipulent des �ux decaract�res� Dans ces classes� il existe de nombreuses m�thodes ou fonctions� Ici� nousconsid�rons les entr�es�sorties avec un tampon !bu�er en anglais"� qui sont plus e%caces�car elles regroupent les op�rations d�entr�es�sorties� C�est pourquoi� on �crit souvent laligne cryptique�

BufferedReader in �

new BufferedReader�new InputStreamReader�System�in���

qui construit� � partir du �ux de caract�res System�in !d�signant la fen�tre d�entr�e detexte par d�faut"� un �ux de caract�res� puis un �ux de caract�res avec tampon !pluse%cace"� Dans cette derni�re classe� on lit les caract�res par read� ou readLine��Par convention� read� retourne �� quand la �n de l�entr�e est d�tect�e !comme en C"�C�est pourquoi le type de son r�sultat est un entier !et non un caract�re"� puisque �� nepeut pas �tre du type caract�re�

Page 210: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE A� JAVA

A���� sur le terminal

Pour lire l�entr�e sur le terminal et l�imprimer imm�diatement� on fait donc�

import java�io���

static void copie �� throws Exception

BufferedReader in �

new BufferedReader�new InputStreamReader�System�in���

int c�

while ��c � in�read��� &� ���

System�out�println�c��

System�out�flush���

Remarquons l�idiome pour lire un caract�re� Il s�agit d�un e�et de bord dans le pr�dicatdu while� On fait l�a�ectation c � in�read� qui retourne comme r�sultat la valeurde la partie droite !le caract�re lu" et on teste si cette valeur vaut ���

A���� Sur des �chiers

On peut aussi manipuler des �chiers� gr(ce aux classes �chiers File� Ainsi le pro�gramme pr�c�dent se r��crit pour copier un �chier source de nom s dans un autredestination de nom d�

import java�io���

static void copieDeFichiers �String s� String d� throws Exception

File src � new File �s��

if � &src�exists�� �� &src�canRead���

erreur ��Lecture impossible de � � s��

BufferedReader in � new BufferedReader�new FileReader�src���

File dest � new File �d��

if � &dest�canWrite���

erreur ��Ecriture impossible de � � d��

BufferedWriter out � new BufferedWriter�new FileWriter�dest���

maCopie �in� out��

in�close���

out�close���

static void maCopie �BufferedReader in� BufferedWriter out�

throws IOException

int c�

while ��c � in�read��� &� ���

out�write�c��

out�flush���

La proc�dure de copie ressemble au programme pr�c�dent� au changement pr�s de printen write� car nous n�avons pas voulu utiliser la classe Printer� ce qui �tait faisable�Remarquons que les entr�es sorties se sont simplement faites avec les �chiers en suivantun sh�ma quasi identique � celui utilis� pour le terminal� La seule di��rence vient del�association entre le nom de �chier et les �ux de caract�res tamponn�s� D�abord le nom

Page 211: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A���� EXCEPTIONS ���

de �chier est transform� en objet File sur lequel plusieurs op�rations sont possibles�comme v�ri�er l�existence ou les droits d�acc�s en lecture ou en �criture� Puis on construitun objet de �ux de caract�res dans les classes FileReader et FileWriter� et en�n desobjets de �ux de caract�res avec tampon� La proc�dure de copie est elle identique �celle vue pr�c�demment�

On peut donc dire que l�entr�e standard System�in !de la fen�tre de texte"� lasortie standard System�out !dans la fen�tre de texte"� et la sortie standard des erreursSystem�err !qui n�a vraiment de sens que dans le syst�me Unix" sont comme des�chiers particuliers� Les op�rations de lecture ou d��criture �tant les m�mes� Seule laconstruction du �ux de caract�res tamponn� varie�

En�n� on peut utiliser mark� skip et reset pour se positionner � une position pr�cisedans un �chier�

A��� Exceptions

Les exceptions sont des objets de toute sous�classe de la classe Exception !voir lanotion de sous�classe plus loin"� Il existe aussi une classe Error moins utilis�e pour leserreurs syst�me� Toutes les deux sont des sous�classes de la classe Throwable� dont tousles objets peuvent �tre appliqu�s � l�op�rateur throw� comme suit�

throw e�

Ainsi on peut �crire en se servant de deux constructeurs de la classe Exception�

throw new Exception���

throw new Exception ��Acc+s interdit dans un tableau���

Heureusement� dans les classes des librairies standard� beaucoup d�exceptions sont d�japr��d��nies� par exemple IndexOutOfBoundsExeption� On r�cup�re une exception parl�instruction try � � � catch� Par exemple

try

�� un programme compliqu� catch � IOException e�

�� essayer de rparer cette erreur dentre�sortie�

catch � Exception e�

�� essayer de rparer cette erreur plus gnrale�

Si on veut faire un traitement uniforme en �n de l�instruction try� que l�on passe ounon par une exception� que le contr)le sorte ou non de l�instruction par une rupture des�quence comme un return� break� etc� on �crit

try

�� un programme compliqu� catch � IOException e�

�� essayer de rparer cette erreur dentre�sortie�

catch � Exception e�

�� essayer de rparer cette erreur plus gnrale�

finally

�� un peu de nettoyage�

Page 212: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE A� JAVA

Il y a deux types d�exceptions� On doit d�clarer les exceptions v�ri��es derri�re lemot�cl� throws dans la signature des fonctions qui les l�vent� Ce n�est pas la peine pourles exceptions non v�ri��es qui se reconnaissent en appartenant � une sous�classe de laclasse RuntimeException� Ainsi

static int lire �� throws IOException� ParseException

int n�

BufferedReader in �

new BufferedReader�new InputStreamReader�System�in���

System�out�print ��Taille du carr( magique� svp �� ���

n � Integer�parseInt �in�readLine����

if ��n �� � �� �n N� �� �n � � �� ��

erreur ��Taille impossible����

return n�

peut �tre �crit dans l�exemple du carr� magique ci�dessous�

A��� Carr�s magiques

A����� Pr�sentation

On souhaite pr�senter un exemple un peu plus important que ceux vus jusqu�ici� ona choisi la construction des carr�s magiques� Un carr� magique est une matrice a carr�ede dimension n� n telle que la somme des lignes� des colonnes� et des deux diagonalessoient les m�mes� Si n est impair� on calcule un carr� magique par l�algorithme suivant �on met � au milieu de la derni�re ligne en an�bn��c��� On suit la premi�re diagonale!modulo n" en mettant �� �� � � � � D�s qu�on rencontre un �l�ment d�j� vu� on monted�une ligne dans la matrice� et on recommence� Ainsi voici des carr�s magiques d�ordre�� ��

�B� � �

� �� � �

�CA

�BBBBB�

�� �� �� � �� �� � �� � � � �� ��� � � �� ���� �� � � ��

�CCCCCA

�BBBBBBBBBB�

�� � �� � � �� ���� � � �� � ��� �� �� �� �� �� �� �� �� � � ���� � � �� �� � �� �� � �� �� �� �� � �� � ��

�CCCCCCCCCCA

Exercices �� Montrer que les sommes sont bien les m�mes� �� Peut�on en construired�ordre pair-

A����� Texte du programme

import java�io���

import java�lang���

import java�util���

class CarreMagique

Page 213: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A���� CARR�S MAGIQUES ���

final static int N � ��

static int a#$#$ � new int#N$#N$�

static int n�

static void init �int n�

for �int i � � i � n� ��i�

for �int j � � j � n� ��j�

a#i$#j$ � �

static void magique �int n�

int i� j�

i � n � �� j � n � ��

for �int k � �� k �� n � n� ��k�

a#i$#j$ � k�

if ��k � n� �� �

i � i � ��

else

i � �i � �� � n�

p j � �j � �� � n�

static void erreur �String s�

System�err�println ��Erreur fatale� � � s��

System�exit ����

static int lire ��

int n�

BufferedReader in �

new BufferedReader�new InputStreamReader�System�in���

System�out�print ��Taille du carr( magique� svp �� ���

try

n � Integer�parseInt �in�readLine����

catch �IOException e�

n � �

catch �ParseException e�

n � �

if ��n �� � �� �n N� �� �n � � �� ��

erreur ��Taille impossible����

return n�

static void imprimer �int n�

for �int i � � i � n� ��i�

for �int j � � j � n� ��j�

System�out�print �leftAligned�!� a#i$#j$ � � ����

System�out�println ���

Page 214: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE A� JAVA

static String leftAligned �int size� String s�

StringBuffer t � new StringBuffer �s��

for �int i � s�length��� i � size� ��i�

t � t�append�� ���

return new String �t��

public static void main �String args#$�

n � lire���

init�n�� �� inutile� mais pdagogique!magique�n��

imprimer�n��

A����� Explications

D�abord� on remarque qu�un programme est une suite de directives et de d�clarationsde classes� Ici� nous n�avons qu�un seule classe CarreMagique� Auparavant nous avonsquelques directives sur un nombre de classes standard dont nous allons nous servir sansutiliser la notation longue !cf plus loin"� Chaque classe contient un certain nombre ded�clarations de variables et de fonctions ou proc�dures� !En programmation objet� onparle de m�thodes au lieu de fonctions ou de proc�dures� Ici nous utiliserons les deuxterminologies"� Une des fonctions� conventionnellement de nom main� est le point ded�part du programme� Ignorons ses arguments pour le moment�

Dans notre exemple� la fonction main lit l�entier n � la console� initialise la matricea avec des z�ros� puis calcule un carr� magique d�ordre n et l�imprime� Nous regardonsmaintenant les autres fonctions et proc�dures� Remarquons que les commentaires sontcompris entre les s�parateurs �� et ��� ou apr�s �� comme en C,,�

La classe CarreMagique commence par la d�claration de trois variables� La premi�red�claration d��nit une constante N enti�re !integer en anglais� int en abr�g�" qui repr��sente la taille maximale du carr� autoris�� Il est fr�quent d��crire les constantes avec desmajuscules uniquement� Nous adoptons la convention suivante sur les noms� les nomsde constantes ou de classes commencent par des majuscules� les noms de variables ou defonctions commencent par une minuscule� On peut ne pas respecter cette convention�mais cela rendra les programmes moins lisibles� !Pour le moment� nous n�essayons pasde comprendre les mots cl�s final ou static + ce deuxi�me mot�cl� reviendra tr�ssouvent dans nos programmes"�

Apr�s N� on d�clare un tableau a d�entiers � deux dimensions !la partie �crite avant lesymbole �" et on alloue un tableau N�N d�entiers qui sera sa valeur� Cette d�clarationpeut sembler tr�s compliqu�e� mais les tableaux adoptent la syntaxe des objets !que nousverrons plus tard" et cela permettra d�initialiser les tableaux par d�autres expressions�Remarquons que les bornes du tableau ne font pas partie de la d�claration� En�n�une troisi�me d�claration dit qu�on se servira d�une variable enti�re n� qui repr�senteral�ordre du carr� magique � calculer�

Ensuite� dans la classe CarreMagique� nous n�avons plus que des d��nitions de fonc�tions� Consid�rons la premi�re init� pas vraiment utile� mais int�ressante puisque tr�ssimple� Le type void de son r�sultat est vide� il est indiqu� avant la d�claration deson nom� comme pour les variables ou les tableaux� !En Pascal� on parlerait de proc��dure"� Elle a un seul param�tre entier n !donc di��rent de la variable globale d��nieauparavant"� Cette proc�dure remet � z�ro toute la matrice a� Remarquons qu�on �crit

Page 215: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A���� CARR�S MAGIQUES ���

a�i��j� pour son �l�ment ai�j !� � i� j � n"� et que le symbole d�a�ectation est �comme en C ou en Fortran !l�op�rateur � pour le test d��galit� s��crit ��"� Les tableauxcommencent toujours � l�indice �� Deux boucles imbriqu�es permettent de parcourir lamatrice� L�instruction for a trois clauses� l�initialisation� le test pour continuer � it�reret l�incr�mentation � chaque it�ration� On initialise la variable fraiche i � �� on continuetant que i � n� et on incr�mente i de � � chaque it�ration !�� et �� sont les symbolesd�incr�mentation et de d�cr�mentation"�

Consid�rons la fonction imprimer� Elle a la m�me structure� sauf que nous impri�mons chaque �l�ment sur � caract�res cadr�s � gauche� Les deux fonctions de librairieSystem�out�print et System�out�println permettent d��crire leur param�tre !avecun retour � la ligne dans le cas de la deuxi�me"� Le param�tre est quelconque et peutm�me ne pas exister� c�est le cas ici pour println� Il est trop t)t pour expliquer led�tail de leftAligned� introduit ici pour rendre l�impression plus jolie� et supposonsque l�impression est simplement d�clench�e par

System�out�print �a#i$#j$ � � ���

Alors� que veut�dire a�i��j� � � �-- A gauche de l�op�rateur �� nous avons l�entier ai�jet � droite une cha�ne de caract�res'' Il ne s�agit bien s#r pas de l�addition sur les entiers�mais de la concat�nation des cha�nes de caract�res� Donc � transforme son argumentde gauche dans la cha�ne de caract�res qui le repr�sente et ajoute au bout la cha�ne� � contenant un espace blanc� La proc�dure devient plus claire� On imprime tous les�l�ments ai�j s�par�s par un espace blanc avec un retour � la ligne en �n de ligne dutableau� La fonction compliqu�e leftAligned ne fait que justi�er sur � caract�res cetteimpression !il n�existe pas d�impression formatt�e en Java"� En conclusion� on constateque l�op�rateur � est surcharg�� car il a deux sens en Java� l�addition arithm�tique�mais aussi la concat�nation des cha�nes de caract�res d�s qu�un de ses arguments estune cha�ne de caract�res� C�est le seul op�rateur surcharg� !contrairement � C,, quiautorise tous ses op�rateurs � �tre surcharg�s"�

La proc�dure erreur prend comme argument la cha�ne de caract�res s et l�imprimepr�c�d�e d�un message insistant sur le cot� fatal de l�erreur� Ici encore� on voit l�utilisa�tion de � pour la concat�nation de deux cha�nes de caract�res� Puis� la proc�dure faitun appel � la fonction syst�me exit qui arr�te l�ex�cution du programme avec un coded�erreur !� voulant dire arr�t normal� tout autre valeur un arr�t anormal"� !Plus tard�nous verrons qu�il y a bien d�autres mani�res de g�n�rer un message d�erreur� avec lesexceptions ou les erreurs pr��d��nies"�

La fonction lire qui n�a pas d�arguments retourne un entier lu � la console� Lafonction commence par la d�claration d�une variable enti�re n qui contiendra le r�sultatretourn�� Puis� une ligne cryptique !� apprendre par coeur" permet de dire que l�on vafaire une lecture !avec tampon" � la console� On imprime un message !sans retour � laligne" demandant de rentrer la taille voulue pour le carr� magique� et on lit par readLineune cha�ne de caract�re entr�e � la console� Cette cha�ne est convertie en entier par lafonction parseInt et le tout est rang� dans la variable n� Si une erreur se produit aucours de la lecture� on r�cup�re cette erreur et on positionne n � z�ro� L�instruction trypermet de d�limiter un ensemble d�instruction o$ on pourra r�cup�rer une exception parun catch qui sp�ci�e les exceptions attendues et l�action � tenir compte en cons�quence�Tous les langages modernes ont un syst�me d�exceptions� qui permet de s�parer letraitement des erreurs du traitement normal d�un groupe d�instructions� Notre fonctionlire �nit par tester si � � n � N et si n est impair !c�est � dire n mod � � �"� En�n�la fonction retourne de son r�sultat�

Il ne reste plus qu�� consid�rer le coeur de notre probl�me� la construction d�uncarr� magique d�ordre n impair� On remarquera que la proc�dure est bien courte� etque l�essentiel de notre programme traite des entr�es�sortie� C�est un ph�nom�ne g�n��ral en informatique� l�algorithme est � un endroit tr�s localis�� mais tr�s critique� d�un

Page 216: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ANNEXE A� JAVA

ensemble bien plus vaste� On a vu que pour construire le carr�� on d�marre sur l��l��ment an�bn��c��� On y met la valeur �� On suit une parall�le � la premi�re diagonale!modulo n"� en d�posant �� �� � � � � n� Quand l��l�ment suivant de la matrice est nonvide� on revient en arri�re et on recommence sur la ligne pr�c�dente� jusqu�� remplirtout le tableau� Comme on sait exactement quand on rencontre un �l�ment non vide�c�est � dire quand la valeur rang�e dans la matrice est un multiple de n� la proc�duredevient remarquablement simple� !Remarque syntaxique� le point�virgule avant le elseferait hurler tout compilateur Pascal� En Java comme en C� le point�virgule fait partiede l�instruction� Simplement toute expression suivie de point�virgule devient une ins�truction� Pour composer plusieurs instructions en s�quence� on les concat�ne entre desaccolades comme dans la deuxi�me alternative du if ou dans l�instruction for"�

Remarquons que le programme serait plus simple si au lieu de lire n sur la console�on le prenait en arguments de main� En e�et� l�argument de main est un tableau decha�nes de caract�res� qui sont les di��rents arguments pour lancer le programme Javasur la ligne de commande� Alors on supprimerait lire et main deviendrait�

public static void main �String args#$�

if �args�length � ��

erreur ��Il faut au moins un argument����

n � Integer�parseInt�args#$��

init�n�� �� inutile� mais pdagogique!magique�n��

imprimer�n��

A��� Sous�classes

Le cours n�utilise pratiquement pas la notion de sous�classe� car cette notion inter�vient surtout si on fait de la programmation orient�e�objet� Nous mentionnons toutefoisbri�vement cette notion� Une classe peut �tendre une autre classe� Par exemple� la classedes dates pourrait �tre refaite en deux syst�mes de dates� gr�gorien ou r�volutionnaireen fonction du nombre de millisecondes !�ventuellement n�gatif" depuis l�origine destemps informatiques� ou bien une classe �tend une classe standard d�j� fournie commecelle des applets pour programmer un navigateur� ou la classe MacLib pour faire le gra�phique �l�mentaire de ce cours� etc� Prenons l�exemple ultra classique de la classe despoints �ventuellement color�s� exemple qui a l�avantage d��tre court et su%sant pourexpliquer la probl�matique rencontr�e� Un point est repr�sent� par la paire �x� y� de sescoordonn�es

class Point

int x� y�

Point �int x� int y�

x � x� y � y�

public String toString ��

return ��� � x � �� � � y �����

void move �int dx� int dy�

x � x � dx�

y � y � dy�

Page 217: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A���� SOUS�CLASSES ��

Il y a ici deux m�thodes� l�une pour convertir un point en cha�ne de caract�res !pourl�impression" et l�autre !move" pour d�placer un point� cette derni�re m�thode �tant uneproc�dure qui renvoie donc le type vide� On peut utiliser des objets de cette classe en�crivant des instructions de la forme

Point p � new Point��� ���

System�out�println �p��

p�move ���� ����

System�out�println �p��

D��nissons � pr�sent la classe des points color�s avec un champ suppl�mentairecouleur� en la d�clarant comme une extension� ou encore une sous�classe� de la classedes points� comme suit�

class PointAvecCouleur extends Point

int couleur�

PointAvecCouleur �int x� int y� int c�

super �x� y�� couleur � c�

public String toString ��

return ��� � x � �� � � y � �� � � couleur � ����

Les champs x et y de l�ancienne classe des points existent toujours� Le champ couleurest juste ajout�� S�il existait d�j� un champ couleur dans la classe Point� on ne ferait quele cacher et l�ancien champ serait toujours accessible par super�couleur gr(ce au mot�cl� super� Dans la nouvelle classe� nous avons un constructeur qui prend un argumentsuppl�mentaire pour la couleur� Ce constructeur doit toujours commencer par un appel� un constructeur de la super�classe !la classe des points"� Si on ne met pas d�appelexplicite � un constructeur de cette classe� l�instruction super� est faite implicitement�et ce constructeur doit alors exister dans la super classe� En�n� la m�thode toStringest red��nie pour prendre en compte le nouveau champ pour la couleur� On utilise lespoints color�s comme suit

PointAvecCouleur q � new PointAvecCouleur ��� �� xfff��

System�out�println �q��

q�move�������

System�out�println �q��

La classe des points color�s a donc h�rit� des champs x et y et de la m�thode move dela classe des points� mais la m�thode toString a �t� red��nie� On n�a eu donc qu��programmer l�incr�ment entre les points normaux et les points color�s� C�est le principede base de la programmation objet� le contr)le des programmes est dirig� par les donn�eset leurs modi�cations� Dans la programmation classique� on doit changer le corps debeaucoup de fonctions ou de proc�dures si on change les d�clarations des donn�es� carla description d�un programme est donn� par sa fonctionalit��

Une m�thode ne peut red��nir qu�une m�thode de m�me type pour ses param�treset r�sultat� Plus exactement� elle peut red��nir une m�thode d�une classe plus g�n�raledont les arguments ont un type plus g�n�ral� Il est interdit de d��nir les m�thodes pr���x�es par le mot�cl� final� On ne peut non plus donner des modi�cateurs d�acc�s plusrestrictifs� une m�thode publique devant rester publique� Une classe h�rite d�une seuleclasse !h�ritage simple"� Des langages comme Smalltalk ou C,, autorisent l�h�ritage

Page 218: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ANNEXE A� JAVA

multiple � partir de plusieurs classes� mais les m�thodes sont alors un peu plus d�li�cates � impl�menter� L�h�ritage est bien s#r transitif� D�ailleurs toutes les classes Javah�ritent d�une unique classe Object�

Il se pose donc le probl�me de savoir quelle m�thode est utilis�e pour un objetdonn�� C�est toujours la m�thode la plus pr�cise qui peut s�appliquer � l�objet et � sesarguments qui est s�lectionn�e� Remarquons que ceci n�est pas forc�ment dans le corpsdu programme charg� au moment de la r�f�rence� puisqu�une nouvelle classe peut �trecharg�e� et contenir la m�thode qui sera utilis�e�

La r�solution des m�thodes dynamiques est faite � l�ex�cution�

En�n� il y a une fa�on de convertir un objet en objet d�une super�classe ou d�unesous�classe avec la notation dex conversion explicites !d�ja vu pour le cas des valeursnum�riques"� Par exemple

Point p � new Point ��� ���

PointAvecCouleur q � new PointAvecCouleur ��� �� ROUGE��

Point p� � q�

PointAvecCouleur q� � �PointAvecCouleur� p�

PointAvecCouleur q� � �PointAvecCouleur� p��

Aller vers une classe plus g�n�rale ne pose pas en g�n�ral de di%cult�s� et le faireexplicitement peut forcer la r�solution des surcharges de nom de fonctions� mais l�objetreste le m�me� Si on convertit vers une sous�classe plus restrictive� la machine virtuelleJava v�ri�e � l�ex�cution et peut lever l�exception ClassCastException� Dans l�exemplepr�c�dent seule l�avant�derni�re ligne l�vera cette exception�

A��� Fonctions graphiques

A����� Fonctions �l�mentaires

Les fonctions sont inspir�es de la libraire QuickDraw du Macintosh� mais fonc�tionnent aussi sur les stations Unix� Sur Macintosh� une fen�tre Drawing permet deg�rer un �cran typiquement de ����� ��� points� L�origine du syst�me de coordonn�esest en haut et � gauche� L�axe des x va classiquement de la gauche vers la droite� l�axe desy va plus curieusement du haut vers le bas !c�est une vieille tradition de l�informatique�dure � remettre en cause"� En QuickDraw� x et y sont souvent appel�s h !horizontal"et v !vertical"� Il y a une notion de point courant et de crayon avec une taille et unecouleur courantes� On peut d�placer le crayon� en le levant ou en dessinant des vecteurspar les fonctions suivantes

moveTo �x y D�place le crayon aux coordonn�es absolues x� y�

move �dx dy D�place le crayon en relatif de dx� dy�

lineTo �x y Trace une ligne depuis le point courant jusqu�au point de coordonn�esx� y�

line �dx dy Trace le vecteur !dx� dy" depuis le point courant�

penPat�pattern Change la couleur du crayon� white� black� gray� dkGray !darkgray"� ltGray !light gray"�

penSize�dx dy Change la taille du crayon� La taille par d�faut est !�� �"� Toutesles op�rations de trac� peuvent se faire avec une certaine �paisseur du crayon�

Page 219: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A���� FONCTIONS GRAPHIQUES ���

penMode�mode Change le mode d��criture� patCopy !mode par d�faut qui e�ace cesur quoi on trace"� patOr !mode Union� i�e� sans e�acer ce sur quoi on trace"�patXor !mode Xor� i�e� en inversant ce sur quoi on trace"�

A����� Rectangles

Certaines op�rations sont possibles sur les rectangles� Un rectangle r a un type pr�d��niRect� Ce type est une classe qui a le format suivant

public class Rect

short left� top� right� bottom�

Fort heureusement� il n�y a pas besoin de conna�tre le format internes des rectangles� eton peut faire simplement les op�rations graphiques suivantes sur les rectangles

setRect�r g h d b �xe les coordonn�es !gauche� haut� droite� bas" du rectangler� C�est �quivalent � faire les op�rations r�left !� g�� r�top !� h�� r�right!� d�� r�bottom !� b�

unionRect�r r� r d��nit le rectangle r comme l�enveloppe englobante des rec�tangles r et r��

frameRect�r dessine le cadre du rectangle r avec la largeur� la couleur et le modedu crayon courant�

paintRect�r remplit l�int�rieur du rectangle r avec la couleur courante�

invertRect�r inverse la couleur du rectangle r�

eraseRect�r e�ace le rectangle r�

fillRect�rpat remplit l�int�rieur du rectangle r avec la couleur pat�

drawChar�c drawString�s a%che le caract�re c ou la cha�ne s au point courantdans la fen�tre graphique� Ces fonctions di��rent de write ou writeln qui �criventdans la fen�tre texte�

frameOval�r dessine le cadre de l�ellipse inscrite dans le rectangle r avec la largeur�la couleur et le mode du crayon courant�

paintOval�r remplit l�ellipse inscrite dans le rectangle r avec la couleur courante�

invertOval�r inverse l�ellipse inscrite dans r�

eraseOval�r e�ace l�ellipse inscrite dans r�

fillOval�rpat remplit l�int�rieur l�ellipse inscrite dans r avec la couleur pat�

frameArc�rstartarc dessine l�arc de l�ellipse inscrite dans le rectangle r d�mar�rant � l�angle start et sur la longueur d��nie par l�angle arc�

frameArc�rstartarc peint le camembert correspondant � l�arc pr�c�dent � � � � Il ya aussi des fonctions pour les rectangles avec des coins arrondis�

button est une fonction qui renvoie la valeur vraie si le bouton de la souris est enfonc��faux sinon�

Page 220: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE A� JAVA

getMouse�p renvoie dans p le point de coordonn�es �p�h� p�v� courantes du curseur�

getPixel�p donne la couleur du point p� R�pond un bool�en� false si blanc� true�si noir�

hideCursor� showCursor� cache ou remontre le curseur�

A����� La classe Maclib

class Point

short h� v�

Point�int h� int v�

h � �short�h�

v � �short�v�

class MacLib

static void setPt�Point p� int h� int v� ���

static void addPt�Point src� Point dst� ����

static void subPt�Point src� Point dst� ����

static boolean equalPt�Point p�� Point p�� ����

���

Et les fonctions correspondantes !voir page ���"

static void setRect�Rect r� int left� int top� int right� int bottom�

static void unionRect�Rect src�� Rect src�� Rect dst�

static void frameRect�Rect r�

static void paintRect�Rect r�

static void eraseRect�Rect r�

static void invertRect�Rect r�

static void frameOval�Rect r�

static void paintOval�Rect r�

static void eraseOval�Rect r�

static void invertOval�Rect r�

static void frameArc�Rect r� int startAngle� int arcAngle�

static void paintArc�Rect r� int startAngle� int arcAngle�

static void eraseArc�Rect r� int startAngle� int arcAngle�

static void invertArc�Rect r� int startAngle� int arcAngle�

static boolean button��

static void getMouse�Point p�

Toutes ces d��nitions sont aussi sur poly dans le �chier

�usr�local�lib�MacLib�java�MacLib�java

On veillera � avoir cette classe dans l�ensemble des classes chargeables !variabled�environnement CLASSPATH"�A����� Jeu de balle

Le programme suivant fait rebondir une balle dans un rectangle� premi�re �tape versun jeu de pong�

Page 221: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A���� FONCTIONS GRAPHIQUES ���

class Pong extends MacLib

static final int C � !� �� Le rayon de la balle

X � !� X� � �!�

Y � !� Y� � ���

static void getXY �Point p�

int N � ��

Rect r � new Rect���

int x� y�

while �&button��� �� On attend le bouton enfonc�

while �button��� �� On attend le bouton rel"ch�

getMouse�p�� �� On note les coordonnes du pointeurx � p�h�

y � p�v�

setRect�r� x � N� y � N� x � N� y � N��

paintOval�r�� �� On a#che le point pour signi�er la lecture�

public static void main �String args#$�

int x� y� dx� dy�

Rect r � new Rect���

Rect s � new Rect���

Point p � new Point���

int i�

initQuickDraw��� �� Initialisation du graphiquesetRect�s� !� !� X� � �� Y� � ���

setDrawingRect�s��

showDrawing���

setRect�s� X� Y� X�� Y���

frameRect�s�� �� Le rectangle de jeugetXY�p�� �� On note les coordonnes du pointeurx � p�h� y � p�v�

dx � �� �� La vitesse initialedy � �� �� de la ballefor ����

setRect�r� x � C� y � C� x � C� y � C��

paintOval�r�� �� On dessine la balle en x� y

x � x � dx�

if �x � C �� X � � �� x � C � X� � ��

dx � �dx�

y � y � dy�

if �y � C �� Y � � �� y � C � Y� � ��

dy � �dy�

for �i � � i � �!� ��i�

� �� On temporiseinvertOval�r�� �� On e ace la balle

Page 222: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE A� JAVA

A�� Syntaxe BNF de Java

Ce qui suit est une syntaxe sous forme BNF !Backus Naur Form"� Chaque petitparagraphe est la d��nition souvent r�cursive d�un fragment de syntaxe d�nomm�e parun nom !malheureusement en anglais"� Chaque ligne correspond � di��rentes d��nitionspossibles� L�indice optional sera mis pour signaler l�aspect facultatif de l�objet indic�e�Certains objets !token" seront suppos�e pr�ed��nis� IntegerLiteral pour une constanteenti�re� Identi�er pour tout identi�cateur� � � � La syntaxe du langage ne garantit pas laconcordance des types� certaines phrases pouvant �tre syntaxiquement correctes� maisfausses pour les types�

Goal�CompilationUnit

A����� Contantes litt�rales

Literal�IntegerLiteralFloatingPointLiteralBooleanLiteralCharacterLiteralStringLiteralNullLiteral

A����� Types� valeurs� et variables

Type�PrimitiveTypeReferenceType

PrimitiveType�NumericTypeboolean

NumericType�IntegralTypeFloatingPointType

IntegralType� one ofbyte short int long char

FloatingPointType� one offloat double

ReferenceType�ClassOrInterfaceTypeArrayType

ClassOrInterfaceType�Name

ClassType�ClassOrInterfaceType

InterfaceType�ClassOrInterfaceType

Page 223: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A��� SYNTAXE BNF DE JAVA ���

ArrayType�PrimitiveType �

Name �

ArrayType �

A����� Noms

Name�SimpleNameQualiedName

SimpleName�Identier

QualiedName�Name � Identier

A����� Packages

CompilationUnit�PackageDeclarationopt ImportDeclarationsopt TypeDeclarationsopt

ImportDeclarations�ImportDeclarationImportDeclarations ImportDeclaration

TypeDeclarations�TypeDeclarationTypeDeclarations TypeDeclaration

PackageDeclaration�package Name �

ImportDeclaration�SingleTypeImportDeclarationTypeImportOnDemandDeclaration

SingleTypeImportDeclaration�import Name �

TypeImportOnDemandDeclaration�import Name � � �

TypeDeclaration�ClassDeclarationInterfaceDeclaration�

Modiers�ModierModiers Modier

Modier� one ofpublic protected private

static

abstract final native synchronized transient volatile

Page 224: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE A� JAVA

A���� Classes

D�claration de classe

ClassDeclaration�Modiersopt class Identier Superopt Interfacesopt ClassBody

Super�extends ClassType

Interfaces�implements InterfaceTypeList

InterfaceTypeList�InterfaceTypeInterfaceTypeList � InterfaceType

ClassBody�� ClassBodyDeclarationsopt �

ClassBodyDeclarations�ClassBodyDeclarationClassBodyDeclarations ClassBodyDeclaration

ClassBodyDeclaration�ClassMemberDeclarationStaticInitializerConstructorDeclaration

ClassMemberDeclaration�FieldDeclarationMethodDeclaration

D�clarations de champs

FieldDeclaration�Modiersopt Type VariableDeclarators �

VariableDeclarators�VariableDeclaratorVariableDeclarators � VariableDeclarator

VariableDeclarator�VariableDeclaratorIdVariableDeclaratorId � VariableInitializer

VariableDeclaratorId�IdentierVariableDeclaratorId �

VariableInitializer�ExpressionArrayInitializer

D�clarations de m�thodes

MethodDeclaration�MethodHeader MethodBody

Page 225: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A��� SYNTAXE BNF DE JAVA ���

MethodHeader�Modiersopt Type MethodDeclarator ThrowsoptModiersopt void MethodDeclarator Throwsopt

MethodDeclarator�Identier FormalParameterListopt �

MethodDeclarator �

FormalParameterList�FormalParameterFormalParameterList � FormalParameter

FormalParameter�Type VariableDeclaratorId

Throws�throws ClassTypeList

ClassTypeList�ClassTypeClassTypeList � ClassType

MethodBody�Block�

Initialieurs statiques

StaticInitializer�static Block

D�clarations de constructeurs

ConstructorDeclaration�Modiersopt ConstructorDeclarator Throwsopt ConstructorBody

ConstructorDeclarator�SimpleName FormalParameterListopt �

ConstructorBody�� ExplicitConstructorInvocationopt BlockStatementsopt �

ExplicitConstructorInvocation�this ArgumentListopt � �

super ArgumentListopt � �

A���� Interfaces

InterfaceDeclaration�Modiersopt interface Identier ExtendsInterfacesopt InterfaceBody

ExtendsInterfaces�extends InterfaceTypeExtendsInterfaces � InterfaceType

InterfaceBody�

Page 226: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ANNEXE A� JAVA

� InterfaceMemberDeclarationsopt �

InterfaceMemberDeclarations�InterfaceMemberDeclarationInterfaceMemberDeclarations InterfaceMemberDeclaration

InterfaceMemberDeclaration�ConstantDeclarationAbstractMethodDeclaration

ConstantDeclaration�FieldDeclaration

AbstractMethodDeclaration�MethodHeader �

A����� Tableaux

ArrayInitializer�� VariableInitializersopt �opt �

VariableInitializers�VariableInitializerVariableInitializers � VariableInitializer

A����� Blocs et instructions

Block�� BlockStatementsopt �

BlockStatements�BlockStatementBlockStatements BlockStatement

BlockStatement�LocalVariableDeclarationStatementStatement

LocalVariableDeclarationStatement�LocalVariableDeclaration �

LocalVariableDeclaration�Type VariableDeclarators

Statement�StatementWithoutTrailingSubstatementLabeledStatementBlockStatementsBlockStatementsIfThenStatementIfThenElseStatementWhileStatementForStatement

StatementNoShortIf�StatementWithoutTrailingSubstatementLabeledStatementNoShortIfIfThenElseStatementNoShortIfWhileStatementNoShortIf

Page 227: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A��� SYNTAXE BNF DE JAVA ��

ForStatementNoShortIf

StatementWithoutTrailingSubstatement�BlockEmptyStatementExpressionStatementSwitchStatementDoStatementBreakStatementContinueStatementReturnStatementSynchronizedStatementThrowStatementTryStatement

EmptyStatement��

LabeledStatement�Identier � Statement

LabeledStatementNoShortIf�Identier � StatementNoShortIf

ExpressionStatement�StatementExpression �

StatementExpression�AssignmentPreIncrementExpressionPreDecrementExpressionPostIncrementExpressionPostDecrementExpressionMethodInvocationClassInstanceCreationExpression

IfThenStatement�if Expression � Statement

IfThenElseStatement�if Expression � StatementNoShortIf else Statement

IfThenElseStatementNoShortIf�if Expression � StatementNoShortIf else StatementNoShortIf

SwitchStatement�switch Expression � SwitchBlock

SwitchBlock�� SwitchBlockStatementGroupsopt SwitchLabelsopt �

SwitchBlockStatementGroups�SwitchBlockStatementGroupSwitchBlockStatementGroups SwitchBlockStatementGroup

SwitchBlockStatementGroup�SwitchLabels BlockStatements

Page 228: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ANNEXE A� JAVA

SwitchLabels�SwitchLabelSwitchLabels SwitchLabel

SwitchLabel�case ConstantExpression �

default �

WhileStatement�while Expression � Statement

WhileStatementNoShortIf�while Expression � StatementNoShortIf

DoStatement�do Statement while Expression � �

ForStatement�for ForInitopt � Expressionopt � ForUpdateopt �

Statement

ForStatementNoShortIf�for ForInitopt � Expressionopt � ForUpdateopt �

StatementNoShortIf

ForInit�StatementExpressionListLocalVariableDeclaration

ForUpdate�StatementExpressionList

StatementExpressionList�StatementExpressionStatementExpressionList � StatementExpression

BreakStatement�break Identieropt �

ContinueStatement�continue Identieropt �

ReturnStatement�return Expressionopt �

ThrowStatement�throw Expression �

SynchronizedStatement�synchronized Expression � Block

TryStatement�try Block Catchestry Block Catchesopt Finally

Catches�CatchClauseCatches CatchClause

Page 229: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A��� SYNTAXE BNF DE JAVA ���

CatchClause�catch FormalParameter � Block

Finally�finally Block

A����� Expressions

Primary�PrimaryNoNewArrayArrayCreationExpression

PrimaryNoNewArray�Literalthis

Expression �

ClassInstanceCreationExpressionFieldAccessMethodInvocationArrayAccess

ClassInstanceCreationExpression�new ClassType ArgumentListopt �

ArgumentList�ExpressionArgumentList � Expression

ArrayCreationExpression�new PrimitiveType DimExprs Dimsoptnew ClassOrInterfaceType DimExprs Dimsopt

DimExprs�DimExprDimExprs DimExpr

DimExpr�� Expression

Dims��

Dims �

FieldAccess�Primary � Identiersuper � Identier

MethodInvocation�Name ArgumentListopt �

Primary � Identier ArgumentListopt �

super � Identier ArgumentListopt �

ArrayAccess�Name � Expression

PrimaryNoNewArray � Expression

PostxExpression�

Page 230: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE A� JAVA

PrimaryNamePostIncrementExpressionPostDecrementExpression

PostIncrementExpression�PostxExpression ��

PostDecrementExpression�PostxExpression ��

UnaryExpression�PreIncrementExpressionPreDecrementExpression� UnaryExpression� UnaryExpressionUnaryExpressionNotPlusMinus

PreIncrementExpression��� UnaryExpression

PreDecrementExpression��� UnaryExpression

UnaryExpressionNotPlusMinus�PostxExpression� UnaryExpression UnaryExpressionCastExpression

CastExpression� PrimitiveType Dimsopt � UnaryExpression Expression � UnaryExpressionNotPlusMinus Name Dims � UnaryExpressionNotPlusMinus

MultiplicativeExpression�UnaryExpressionMultiplicativeExpression � UnaryExpressionMultiplicativeExpression � UnaryExpressionMultiplicativeExpression � UnaryExpression

AdditiveExpression�MultiplicativeExpressionAdditiveExpression � MultiplicativeExpressionAdditiveExpression � MultiplicativeExpression

ShiftExpression�AdditiveExpressionShiftExpression � AdditiveExpressionShiftExpression � AdditiveExpressionShiftExpression �� AdditiveExpression

RelationalExpression�ShiftExpressionRelationalExpression � ShiftExpressionRelationalExpression � ShiftExpressionRelationalExpression �� ShiftExpressionRelationalExpression �� ShiftExpression

Page 231: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

A��� SYNTAXE BNF DE JAVA ���

RelationalExpression instanceof ReferenceType

EqualityExpression�RelationalExpressionEqualityExpression �� RelationalExpressionEqualityExpression � RelationalExpression

AndExpression�EqualityExpressionAndExpression � EqualityExpression

ExclusiveOrExpression�AndExpressionExclusiveOrExpression � AndExpression

InclusiveOrExpression�ExclusiveOrExpressionInclusiveOrExpression � ExclusiveOrExpression

ConditionalAndExpression�InclusiveOrExpressionConditionalAndExpression �� InclusiveOrExpression

ConditionalOrExpression�ConditionalAndExpressionConditionalOrExpression �� ConditionalAndExpression

ConditionalExpression�ConditionalOrExpressionConditionalOrExpression � Expression � ConditionalExpression

AssignmentExpression�ConditionalExpressionAssignment

Assignment�LeftHandSide AssignmentOperator AssignmentExpression

LeftHandSide�NameFieldAccessArrayAccess

AssignmentOperator� one of� �� �� �� �� �� �� �� ��� �� �� ��

Expression�AssignmentExpression

ConstantExpression�Expression

Bibliographie Java

j�� Exploring Java� �nd edition� Pat Niemeyer et Joshua Peck � pages� O�Reilly�ISBN� �������� ���� ��� �

Page 232: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE A� JAVA

j�� The Java Language Speci�cation� James Gosling� Bill Joy et Guy Steele� AddisonWesley� ISBN� ������������ ����

j� Java in a Nutshell� David Flanagan� O�Reilly� ISBN� ����������X� ��� �

j�� Java examples in a Nutshell� David Flanagan� O�Reilly� ISBN� �������� ���� ��� �

Page 233: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

���

Annexe B

Caml

Le langage ML��� a �t� con�u par Milner � Edimbourg en �� comme un langagetyp� de manipulation symbolique� servant de m�talangage au syst�me de d�monstrationautomatique LCF� Caml est un de ses dialectes con�u et d�velopp� � l�INRIA � partirde ���� Les langages de la famille ML ont d�autres descendants� comme comme Has�kell� d�velopp� � Glasgow et � Yale� Miranda � Kent� et surtout SML&NJ ��� � AT*TBell laboratories et � CMU� Comme Java� ML est fortement typ�� il autorise les d���nitions alg�briques des structures de donn�es et la gestion automatique de la m�moire�Les langages de la famille ML sont devenus populaires dans la communaut� du calculsymbolique et dans l�enseignement de l�informatique�

Caml est un langage de programmation fonctionnelle� c�est���dire un langage quiencourage un style de programmation fond� sur la notion de calcul plut)t que sur lanotion de modi�cation de l��tat de la m�moire de la machine� Ce style� souvent plusproche des d��nitions math�matiques� repose sur l�utilisation intensive des fonctions�et n�est possible qu�� cause de l�e�ort port� sur la compilation des fonctions et la ges�tion de la m�moire� A ce titre� Caml est assez di��rent de Pascal et de C� quoiqu�ilpropose aussi des aspects imp�ratifs qui autorisent un style assez proche du style im�p�ratif traditionnel� Il partage avec Java son typage fort et la gestion automaituqe dela m�moire� mais il a des types polymorphes param�tr�s et des op�rations de �ltragesur les structures de donn�es dynamiques� Ici� comme en Java� nous ne ferons pas deprogrammation fonctionnelle� et nous nous contenterons d�un usage assez imp�ratif�

On trouve une introduction didactique au langage SML&NJ dans les livres de Paulson���et d�Ulmann���� Pour une introduction � Caml� on consultera les livres de Weis�Leroy���� Cousineau�Mauny ��� Hardin�Donzeau�Gouge ��� ou Monasse ���� Le �Manuel der�f�rence du langage Caml ��� d�crit le langage en d�tail� Cette annexe a �t� �crite parPierre Weis�

B�� Un exemple simple

Exercice impos�� �crivons l�exemple des carr�s magiques en Caml�

�open �printf���

let magique a �

let n � vect�length a in

let i � ref �n � �� in

let j � ref �n � �� in

for k � � to n � n do

a��&i���&j� �� k�

if k mod n � then decr i else

Page 234: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE B� CAML

begin

i �� �&i � �� mod n�

j �� �&j � �� mod n�

end

done��

let erreur s � printf �Erreur fatale� �s�n� s� exit ���

let lire �� �

printf �Taille du carr( magique� svp ��

let n � int�of�string �read�line ��� in

if n �� �� n mod � � then erreur �Taille impossible� else n��

let imprimer a �

for i � to vect�length a � � do

for j � to vect�length a � � do

printf ���d � a��i���j�

done�

printf ��n�

done��

let main �� �

let n � lire �� in

let a � make�matrix n n in

magique a�

imprimer a�

exit ��

main ����

Phrases

On constate qu�un programme Caml est une suite de phrases qui se terminent toutespar ��� Ces phrases sont des d��nitions de valeurs� de proc�dures ou de fonctions� ouencore des expressions qui sont �valu�es dans l�ordre de pr�sentation� Ainsi� la der�ni�re phrase est l�expression main ��� qui d�clenche l�ex�cution du programme� Onremarque aussi que les d��nitions des objets pr�c�dent toujours leur premi�re utilisation�

Une d��nition est introduite par le mot cl� let suivi du nom de l�entit� d��nie�Par exemple� let n � vect�length a d��nit la variable n comme la longueur du vec�teur a et let magique a � ��� d��nit la fonction magique avec a pour argument� 3l�occasion� on remarque qu�en Caml on �vite les parenth�ses inutiles !mais le langageadmet les parenth�ses super�ues"� ainsi� l�application des fonctions est not�e par simplejuxtaposition� et l�on �crit vect�length a plut)t que vect�length �a�

La valeur des variables en Caml est �x�e une fois pour toutes lors de leur d��nitionet cette liaison n�est pas modi�able !il est impossible de changer la valeur li�e � unnom d��ni par let"� Comme en math�matiques� les variables sont des noms li�s �des constantes qu�on calcule lors de la d��nition de ce nom� C�est aussi analogue auxconstantes de Pascal� si ce n�est que l�expression li�e � une variable Caml est quelconqueet qu�il n�y a pas de limite � sa complexit��

En Caml la valeur d�une variable est x�e lors de sa d�nition�

Page 235: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

B��� UN EXEMPLE SIMPLE ���

R�f�rences

Les variables de Caml ne sont donc pas des variables au sens traditionnel des lan�gages de programmation� puisqu�il est impossible de modi�er leur valeur� Il est pourtantsouvent n�cessaire d�utiliser dans les programmes des variables modi�ables au sens dePascal ou de C� En Caml� on utilise pour cela une r�f�rence modi�able vers une valeur�c�est���dire une case m�moire dont on peut lire et �crire le contenu� Pour cr�er uner�f�rence� on applique le constructeur ref au contenu initial de la case m�moire� C�estle cas pour la variable i� d��nie par la ligne let i � ref �n � � dont la valeur estune r�f�rence qui contient n � � la cr�ation� Pour lire le contenu d�une r�f�rence�on utilise l�op�rateur �� qu�on lit �contenu de !ou �deref car on l�appelle aussi op�ra�teur de d�r�f�rencement"� Pour �crire le contenu d�une r�f�rence on utilise l�op�rateurd�a�ectation !�� Par exemple� i !� �i � incr�mente le contenu de la r�f�rence de lavariable i� ce qui a �nalement le m�me e�et que l�a�ectation i !� i � de Pascal oul�a�ectation i � i � de C� Noter que les r�f�rences ne contredisent pas le dogme �unevariable est toujours li�e � la m�me valeur � la variable i est li�e � une unique r�f�renceet il est impossible de la changer� Plus pr�cis�ment� la valeur de i est l�adresse de lacase m�moire modi�able qui contient la valeur� et cette adresse est une constante� Onne peut que modi�er le contenu de l�adresse�

Le connaisseur de Pascal ou de C est souvent troubl� par cette distinction expliciteentre une r�f�rence et son contenu qui oblige � appliquer syst�matiquement l�op�rateur� pour obtenir le contenu d�une r�f�rence� alors que ce d�r�f�rencement est implicite enPascal et en C� En Caml� quand i a �t� d��ni comme une r�f�rence� la valeur de i estla r�f�rence elle�m�me et jamais son contenu� pour obtenir le contenu� il faut appliquerune op�ration de d�r�f�rencement explicite et l�on �crit �i� S�mantiquement� �i est �rapprocher de �i en C ou i' en Pascal�

L�op�rateur d�a�ectation !� doit �tre rapproch� aussi des op�rateurs ordinaires dontil a le statut� e !� e� signi�e que le r�sultat de l��valuation de e est une r�f�rencedont le contenu va devenir la valeur de e� !de m�me que e � e� renvoie la somme desvaleurs de e et e�"� �videmment� dans la grande majorit� des cas� la partie gauche del�a�ectation est r�duite � un identi�cateur� et l�on a�ecte simplement la r�f�rence qui luiest li�e� Ainsi� en �crivant i !� �i � � on d�cr�mente le contenu de la r�f�rence i eny mettant le pr�d�cesseur de son contenu actuel� Cette op�ration de d�cr�mentation estd�ailleurs pr�d��nie sous la forme d�une proc�dure qui prend une r�f�rence en argumentet la d�cr�mente�

let decr x �

x �� &x � ���

Dans cet exemple� la distinction r�f�rence�contenu est �vidente� l�argument de decr estla r�f�rence elle�m�me� pas son contenu� Cette distinction r�f�rence�contenu s��claireencore si l�on consid�re les r�f�rences comme des vecteurs � une seule case� c�est alorsun prolongement naturel de la n�cessaire distinction entre un vecteur et le contenu deses cases�L�op�rateur d�a�ectation en Caml pose une petite di%cult� suppl�mentaire aux habitu�sdes langages imp�ratifs� comme nous venons de le voir� l��criture e !� e� impose quele r�sultat de l��valuation de e soit une r�f�rence� Pour des raisons de typage� il n�estdonc pas question d�utiliser le symbole !� pour a�ecter des cases de vecteurs� ni descaract�res de cha�nes� ni m�me des champs d�enregistrement� Chacune de ces op�rationsposs�de son propre op�rateur !o$ intervient le symbole ��"�

En Caml l�op�rateur �� est r�serv� aux r�f�rences�

Page 236: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ANNEXE B� CAML

Vecteurs et tableaux

Un vecteur est une succession de cases m�moires� Les indices des �l�ments com�mencent en �� si le vecteur est de longueur n les indices vont de � � n� �� Pour acc�deraux �l�ments d�un vecteur v� on utilise la notation v��indice� Pour modi�er le contenudes cases de vecteur� on utilise le symbole �� qu�on lit re�oit� Par exemple v��i �� kmet la valeur k dans la case i du vecteur v�

Pour cr�er un tableau� on appelle la primitive make�matrix� La ligne

let c � make�matrix n n in

d��nit donc une matrice n � n� dont les �l�ments sont des entiers� tous initialis�s � ��Chaque �l�ment de la matrice c ainsi d��nie est acc�d� par la notation c��i��j� etmodi�� par la notation c��i��j �� nouvelle valeur� Comme la notation le sugg�re�

c��i��j signi�e en fait �c��i��j� c�est���dire acc�s au ji�me

�l�ment du vecteurc��i� Cela veut dire que la matrice est en r�alit� un vecteur dont les �l�ments sont eux�m�mes des vecteurs� les lignes de la matrice� !Mais rien n�emp�che �videmment de d��nirune matrice comme le vecteur de ses colonnes�" Retenons qu�en Caml comme en C� lestableaux sont des vecteurs de vecteurs� D�autre part� la ligne let c � make�matrix n n

in d��nit un tableau dont la taille n�est pas une constante connue � la compilation�mais une valeur d�termin�e � l�ex�cution !ici n est lue sur l�entr�e standard"� cependant�une fois le tableau cr��� sa taille est �x�e une fois pour toutes et n�est plus modi�able�

En Caml la taille des vecteurs est x�e � la cr�ation�

Fonctions et proc�dures

Caml est un langage fonctionnel� comme nous l�avons d�j� vu� les fonctions formentles briques de base des programmes� En outre� les fonctions sont des valeurs primitivesdu langage qu�on manipule au m�me titre que les autres valeurs� Il est tr�s facile ded��nir des fonctions qui manipulent des fonctions ou m�me de fabriquer des structuresde donn�es qui comportent des fonctions� Une fonction peut librement �tre prise enargument ou rendue en r�sultat� et il n�y a pas de restriction � son usage dans lesstructures de donn�es�

En Caml les fonctions sont des valeurs comme les autres�

Comme en math�matiques� une fonction a des arguments et rend un r�sultat qu�ellecalcule avec une expression o$ intervient la valeur de ses arguments� Comme pour lesautres valeurs� la d��nition d�une fonction est introduite par un mot cl� let suivi dunom de la fonction et de la liste de ses arguments� ce qui nous donne typiquementlet f x � ��� pour une fonction � un argument et let f x x� ��� xn � ��� pourune fonction � n arguments�

Voici un exemple de fonction des entiers dans les entiers�

let prochain x � if x mod � � � then � � x � � else x � ���

La fonction prochain renvoie x � � si x est impair� et bx��c si x est pair� !On peuts�amuser � it�rer cette fonction et � observer ses r�sultats successifs� on ne sait toujourspas d�montrer qu�on obtient �nalement �� quelque soit l�entier de d�part� Par exemple� � ��� ��� ��� � � ��� �� ��� ��� ��� ��� �� �� � �� �� �"�

D��nissons maintenant le pr�dicat even� qui teste la parit� des entiers !c�est unefonction des entiers dans les bool�ens"�

let even x � x mod � � ��

Page 237: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

B��� QUELQUES �L�MENTS DE CAML ��

On remarque que les d��nitions de prochain et de even ne font pas intervenir detypes� la signature des fonctions est implicite� Pourtant Caml dispose� comme Pascal�d�un typage fort� c�est���dire strict et v�ri�� compl�tement � la compilation� En e�et�les types des arguments et du r�sultat des fonctions sont automatiquement calcul�spar le compilateur� sans intervention du programmeur� ni annotations de type dansles programmes� L�habitu� de Pascal ou C pourra s�il le d�sire ins�rer des types dansses programmes� � l�aide de contraintes de type� Une contrainte de type consiste en unmorceau de programme mis entre parenth�ses et d�cor� avec son type� Ainsi �x ! intimpose que x soit un entier� Avec une contrainte sur son argument et son r�sultat lafonction even s��crirait�

let even �x � int� � �x mod � � � bool���

Comme on le constate sur le programme du carr� magique� les contraintes de type nesont pas n�cessaires� il n�est donc pas d�usage d�en mettre dans les programmes�

En Caml le typage est � la charge du compilateur�

Lorsque l�argument ou le r�sultat d�une fonction sont sans int�r�t� on le note alors�� l�unique valeur du type unit� Une telle fonction est souvent quali��e de proc�dureau lieu de fonction� mais ce n�est qu�une distinction commode qui n�est pas faite parle langage� Par exemple� main est une proc�dure� et l�on constate qu�elle est d��nieexactement de la m�me mani�re que notre fonction prochain ou le pr�dicat even�

La fonction magique est elle aussi une proc�dure� elle construit un carr� magiqued�ordre n impair de la m�me fa�on qu�en Pascal ou C�

La fonction lire lit la taille du carr� magique et fait quelques v�ri�cations sursa valeur� En cas de taille incorrecte� elle appelle la fonction erreur qui a%che unmessage et arr�te le programme en erreur� Pour lire cette taille� elle appelle la proc�durede lecture d�une ligne read�line� apr�s avoir imprim� un message sur le terminal�La proc�dure d�impression format�e printf a pour premier param�tre une cha�ne decaract�res� d�limit�e par des guillemets� C�est le format qui indique comment imprimerles arguments qui suivent� on sp�ci�e le type d�impression d�sir�� � l�aide de caract�ressymboliques� pr�c�d�s de l�indicateur �� Par exemple �s signi�e qu�on doit imprimerune cha�ne de caract�res� et �d un entier� L�ordre des indications d�impression dansle format doit �tre corr�l� avec l�ordre des arguments � imprimer� Dans la proc�dureimprimer qui imprime le tableau a� l�indication �$d indique l�impression d�un entier sur� caract�res� cadr� � droite�

En�n� la proc�dure main est la proc�dure principale du programme qui fait appelsuccessivement aux di��rentes proc�dures� dans un ordre simple et compr�hensible� Lam�thode qui consiste � d��nir de petites fonctions� qu�on appelle ensuite dans la fonc�tion principale est un principe de programmation structur�e� Elle am�liore la lisibilit� etfacilite les modi�cations� mais n�est pas une obligation du langage� Nous aurions pu d���nir toutes les fonctions locales � la fonction main� mais en g�n�ral ce style est mauvais�car on m�lange le c4ur algorithmique du programme !la proc�dure magique" avec desd�tails annexes comme l�impression et la lecture� Remarquons qu�il faut appeler expli�citement le programme principal� ce que fait la ligne main ��� 3 d�faut� la proc�duremain serait d��nie mais pas appel�e� et le programme ne ferait rien�

B�� Quelques �l�ments de Caml

Appel au compilateur

Sur la plupart des machines� le syst�me Caml Light propose un compilateur ind��pendant camlc qui produit de fa�on traditionnelle un programme ex�cutable � partir

Page 238: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ANNEXE B� CAML

d�un programme source� contenu dans un �chier ayant l�extension �ml� On pr�cise lenom de l�ex�cutable produit en donnant l�option �o nom�de�programme au compilateur�� d�faut� il produit le programme a�out� Voici un exemple de compilation obtenue sousle syst�me Unix�

poly� cat fact�ml

let rec fact x � if x �� � then � else x � fact �x � ����

print�int �fact ��� print�newline ����

poly� camlc fact�ml

poly� a�out

�����

En dehors du compilateur proprement dit� les syst�mes Caml o�rent une interfaceinteractive de dialogue avec le compilateur� Dans cette interface� on entre successivementdes phrases qui sont compil�es� puis ex�cut�es au vol� Voici une session obtenue sur unemachine Unix en lan�ant le syst�me interactif par la commande camllight�

poly� camllight

Caml Light version �"�

�let rec fact x � if x �� � then � else x � fact �x � ����

fact � int � int � �fun

�fact ���

� � int � �����

�quit����

poly�

Dans cette utilisation� Caml indique le r�sultat des calculs et le type des objets d��nis�Il trouve automatiquement ces types par un algorithme d�inf�rence de type� Au lieu detaper directement les programmes� on peut charger les �chiers qui les contiennent parla fonction include� Les phrases du �chier sont alors compil�es et ex�cut�es � la vol�e�exactement comme si on les avait tap�es dans le syst�me interactif� Ainsi� le chargementdu �chier fact�ml ex�cute les phrases dans l�ordre la �n du programme� On peut alorsreprendre l�interaction comme avant le chargement�

�include �fact�ml���

fact � int � int � �fun

�����

� � unit � ��

Le syst�me interactif est donc plut)t r�serv� � l�apprentissage du langage� Lorsqu�onma�trise Caml et qu�on d�veloppe de gros programmes� on privil�gie le compilateur ind��pendant qui s�int�gre plus facilement aux outils de gestion automatique des logiciels� Onr�serve alors le syst�me interactif au test rapide des programmes� et dans une moindremesure � la mise au point�

B���� Fonctions

On utilise la notation A � B pour d�noter les fonctions de l�ensemble A dansl�ensemble B et par exemple int �� int est le type de la fonction fact ci�dessus� Lavaleur d�une fonction est une valeur fonctionnelle� not�e conventionnellement �fun��Remarquons � nouveau que toute d��nition lie un identi�cateur � une valeur� ainsifact poss�de une valeur et il s��value normalement�

�fact��

� � int � int � �fun

Page 239: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

B��� QUELQUES �L�MENTS DE CAML ���

3 l�occasion de la d��nition de fact� on observe aussi que les fonctions r�cursivesdoivent �tre introduites par le mot�cl� let rec� pour signaler au syst�me qu�on faitr�f�rence � leur nom avant leur d��nition e�ective�

Les fonctions r�cursives doivent �tre introduites par le mot�cl� let rec�

Pour terminer sur les fonctions� citons l�existence des fonctions anonymes� c�est���dire des valeurs fonctionnelles qui n�ont pas de nom� On les introduit avec le nouveaumot cl� function et la construction function x �� ��� Par exemple�

��function x � x � ����

� � int � int � �fun

��function x � x � �� ���

� � int � �

Lorsqu�on donne un nom � une fonction anonyme� on d��nit alors tr�s logiquement unefonction �normale �

�let successeur � �function x � x � ����

successeur � int � int � �fun

�successeur ���

� � int � �

On utilise la plupart du temps les fonctions anonymes en argument des fonctionnellesque nous d�crivons maintenant�

Fonctionnelles

Il n�y a pas de contraintes sur les arguments et r�sultats des proc�dures et des fonc�tions� les arguments et r�sultats fonctionnels sont donc autoris�s� Une bonne illustrationconsiste � �crire une proc�dure de recherche d�une racine d�une fonction sur un inter�valle donn�� La proc�dure z(ro prend une fonction f en argument !et pour cette raisonon dit que z(ro est une fonctionnelle"� D��nissons d�abord une fonction auxiliaire quicalcule la valeur absolue d�un �ottant�

let abs x � if x � � then x else �� x��

Nous notons � l�occasion que les nombres �ottants comportent obligatoirement un point�m�me �� Les op�rations sur les nombres �ottants sont �galement distinctes de celles desnombres entiers� puisqu�elles sont syst�matiquement su%x�es par un point !sauf lescomparaisons"� Notre fonctionnelle s��crit alors�

let trouve�z(ro f a b epsilon max�iterations �

let rec trouve x y n �

if abs �y �� x� � epsilon �� n � max�iterations then x

else

let m � �x �� y� �� �� in

if �f m �� � �f x ��

then trouve m y �n � ��

else trouve x m �n � �� in

trouve a b ���

let z(ro f a b � trouve�z(ro f a b ��E�" ���

Remarquons la d��nition locale de la fonction r�cursive trouve� qu�on applique ensuiteavec les arguments a� b et � Si on a des di%cult�s � comprendre ce style fonctionnel�voici la m�me fonction en version imp�rative !avec une boucle while que nous verronsplus loin"�

Page 240: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE B� CAML

let z(ro f a b �

let epsilon � ��E�"

and nmax � � in

let n � ref �

and m � ref ��a �� b� �� ��� in

let x � ref a

and y � ref b in

while abs �&y �� &x� epsilon %% &n � nmax do

m �� �&x �� &y� �� ���

if �f &m �� � �f &x ��

then x �� &m

else y �� &m�

n �� &n � �

done�

&x��

Le type inf�r� par Caml pour z(ro est �float ��float ��float ��float ��floatqui indique bien que le premier argument est une fonction des �ottants dans les �ottants�Utilisons la fonctionnelle z(ro pour trouver un z�ro de la fonction logarithme entre ���et ���

�open �printf���

�let log� x � log x �� log ����

log� � float � float � �fun

�printf �le z(ro de log� est �f�n� �z(ro log� �! ��!���

le z(ro de log� est ��

� � unit � ��

Les arguments fonctionnels sont naturels et rendent souvent l��criture plus �l�gante� Ilfaut noter que l�e%cacit� du programme n�en sou�re pas forc�ment� surtout dans leslangages fonctionnels qui optimisent la compilation des fonctions et de leurs appels�

B���� Symboles� s�parateurs� identi�cateurs

Les identi�cateurs sont des s�quences de lettres� de chi�res� d�apostrophes et desoulign�s commen�ant par une lettre� Les identi�cateurs sont s�par�s par des espaces�des caract�res de tabulation� des retours � la ligne ou par des caract�res sp�ciaux comme�� �� �� Certains identi�cateurs sont r�serv�s pour des mots cl�s de la syntaxe� commeand� type� begin� end� while� � � �

Nous abandonnons la convention adopt�e en Pascal et C dans ce cours qui consiste� commencer par une majuscule les noms de constantes et par une minuscule les nomsde variables� En Caml� toutes les variables ont une valeur constante !au sens de Pascalet de C" et devraient donc commencer par une majuscule� Nous pr�f�rons utiliser lesminuscules comme premi�re lettre des variables� !Seuls les noms de constructeurs destypes somme et les exceptions commenceront par une majuscule�"

B���� Types de base

L�unique valeur rien a le type pr�d��ni unit� elle est not�e � et est lue �vo.de � Lavaleur rien sert � compl�ter une conditionnelle � une seule branche !par else �"� �d�clencher les proc�dures !print�newline �"� et comme instruction vide dans le corpsd�une boucle�

Les bool�ens ont le type pr�d��ni bool� qui contient deux constantes true et false�

Page 241: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

B��� QUELQUES �L�MENTS DE CAML ���

Les entiers ont le type pr�d��ni int� Les constantes enti�res sont une suite de chi�resd�cimaux� �ventuellement pr�c�d�e d�un signe �� comme ���� ���� � � � Les valeurs ex�tr�males d�pendent de l�impl�mentation�

Les �ottants ont le type pr�d��ni float� Les constantes �ottantes sont une suite dechi�res d�cimaux comprenant un point� �ventuellement suivie d�une indication d�expo�sant� comme �� $ % ou � $ �%E�� pour d�signer ���� � � �����

Les caract�res ont le type pr�d��ni char� Une constante caract�re est une lettre en�tour�e du symbole )� comme )a)� )b)� � � � � )�)� )!)� Certains caract�res sont cod�s sp��cialement comme )&n) pour le changement de ligne� )&r) pour le retour charriot� )&t)pour la tabulation� )&)) pour le caract�re apostrophe� et )&&) pour la barre oblique�En�n� on d�note n�importe quel caract�re en le d�signant par son num�ro d�cimal dansle code ASCII !American Standard Codes for Information Interchange" !ISO�latin"� surtrois chi�res et pr�c�d� d�une barre oblique� Ainsi )&���) d�signe le caract�re espaceet )&���) est �quivalent � )()� La fonction int�of�char donne la valeur entre � et��� dans le code ASCII du caract�re� Inversement� la fonction char�of�int donne lecaract�re par son code ASCII�

Les cha$nes de caract�res ont le type pr�d��ni string� Ce sont des suites de ca�ract�res rang�s cons�cutivement en m�moire� Une constante cha�ne est une suite decaract�res entour�e de guillemets� Dans une cha�ne� le caract�re guillemet se note &�en ajoutant une barre oblique devant le guillemet� et les caract�res sp�ciaux ob�issentaux m�mes conventions que pour les constantes caract�res� Les �l�ments d�une cha�nede caract�res sont num�rot�s � partir de �� On acc�de � l��l�ment i de la cha�ne s �l�aide de la notation s��i�� On remplace l��l�ment i de la cha�ne s par la valeur c� �l�aide de la notation s��i� �� c� En �valuant make�string l c� on obtient une cha�nede caract�res de longueur l� initialis�e avec des caract�res c� L�op�rateur in�xe ' sert �concat�ner deux cha�nes� la fonction sub�string permet d�extraire une sous�cha�ne� etla proc�dure blit�string de transf�rer des caract�res d�une cha�ne � une autre� Pourplus d�information� voir le module string de la librairie�

Les vecteurs ont le type pr�d��ni vect� Ce sont des suites d��l�ments de m�me type�rang�s cons�cutivement en m�moire� Une constante vecteur est une suite d��l�mentss�par�s par des � et entour�e de �parenth�ses �# et #�� Par exemple�

�let v � #� �� �� � �$��

v � int vect � #��� �� ��$

Remarquons la notation su%xe pour le constructeur de type des vecteurs� Le type d�unvecteur d�entiers s��crit int vect� et le type d�une matrice d�entiers int vect vect� Les�l�ments d�un vecteur sont num�rot�s � partir de �� On acc�de � l��l�ment i du vecteurv � l�aide de la notation v��i� On remplace l��l�ment i du vecteur v par la valeur c�� l�aide de la notation v��i �� c� En �valuant make�vect l c� on obtient un vecteurde longueur l� initialis� avec l��l�ment c� On dispose aussi des fonctions sub�vect pourextraire des sous�cha�nes et blit�vect pour transf�rer des �l�ments d�un vecteur � unautre� Pour plus d�information� voir le module vect de la librairie�

Les r�f�rences ont le type pr�d��ni ref� Comme les vecteurs le constructeur de typedes r�f�rences ref utilise la notation su%xe� Une r�f�rence est construite par l�applica�tion du constructeur !de valeur" ref � sa valeur initiale� En �valuant ref v� on obtientune r�f�rence� initialis�e avec la valeur v� On acc�de au contenu d�une r�f�rence r � l�aidede la notation �r� On remplace le contenu de la r�f�rence r par la valeur c� � l�aide dela notation r !� c�

Les paires d��l�ments de type t et t� ont le type t � t�� On �crit la paire desvaleurs v� et v� de la mani�re math�matique classique� �v� v�� La notation s��tend auxn�uplets� Il n�y a pas de limitation � l�usage des n�uplets� qui peuvent �tre librement prisen argument et rendus en r�sultat des fonctions� Par exemple� la sym�trie par rapport� l�origine du rep�re s��crit�

Page 242: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE B� CAML

�let sym(trie �x� y� � ��x� �y���

sym(trie � int � int � int � int � �fun

Attention� les n�uplets ne sont pas associatifs et ��� �� � � ���� ��� ��

B���� Expressions

Les expressions arithm�tiques font intervenir les op�rateurs classiques sur les entiers� !addition"� � !soustraction"� � !multiplication"� � !division enti�re"� mod !modulo"� Onutilise les parenth�ses comme en math�matiques� Ainsi� si x et y sont deux entiers� on�crit � � �x � � � y � � � x � x pour �x� �y� � �x��

Les m�mes op�rateurs� su%x�s par un point� servent pour les expressions �ottantes�Donc� si z est un �ottant� on �crit ��� �� �z �� �� ��� pour �z � ����� Lesfonctions int�of�float et float�of�int autorisent les conversions des �ottants dansles entiers� la premi�re donne la partie enti�re� la seconde convertit un entier en �ottant�Contrairement � Pascal ou � C� les conversions ne sont jamais automatiques� par exemple��� � � est toujours mal typ��

En Caml les conversions sont explicites�

Une expression conditionnelle ou alternative s��crit�

if e then e� else e�

o$ la condition e est une expression bool�enne du type bool� et e�� e� sont deux expres�sions de m�me type qui est celui du r�sultat�

Les expressions bool�ennes sont construites � partir des op�rateurs ##� ""� not� desbool�ens et des op�rateurs de comparaison� Ainsi� si b et c sont deux identi�cateurs detype bool� l�expression

�b %% not c� �� �not b %% c�

repr�sente le ou�exclusif de b et c� Les deux op�rateurs ## et "" se comportent exacte�ment comme une construction �if then else � Par d��nition� a "" b signi�e if a then b

else false et a ## b signi�e if a then true else b� Parfois ces op�rateurs rendentun r�sultat sans �valuer certains de leurs arguments� Si a s��value en faux� alors a "" brend false sans que l�expression b soit �valu�e� Les op�rateurs de comparaison �� ������ �� �� �� rendent aussi des valeurs bool�ennes� On peut comparer des entiers� des�ottants� des bool�ens� des caract�res !dans ce dernier cas� l�ordre est celui du codeASCII" et m�me deux valeurs quelconques� pourvu qu�elles soient du m�me type�

La pr�c�dence des op�rateurs est naturelle� Ainsi � est plus prioritaire que �� lui�m�me plus prioritaire que �� Si un doute existe� il ne faut pas h�siter � mettre desparenth�ses� De mani�re g�n�rale� seules les parenth�ses vraiment signi�catives sontn�cessaires� Par exemple� dans

if �x �� %% �y � �� then ���

la signi�cation ne change pas si l�on )te toutes les parenth�ses� De m�me� dans l�expres�sion du ou�exclusif

�b %% not c� �� �not b %% c�

les parenth�ses sont super�ues� En e�et les pr�c�dences respectives de ""� ## et notsont analogues � celles de �� � et �� On �crit donc plus simplement b "" not c ##not b "" c� !Encore plus simple� b �� c'" �videmment� certaines parenth�ses sontimp�ratives pour grouper les expressions� L�exemple des arguments de fonctions estplus particuli�rement fr�quent� comme en math�matiques f �x � est essentiellementdi��rent de f �x � � Et comme on omet souvent les parenth�ses autour des arguments

Page 243: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

B��� QUELQUES �L�MENTS DE CAML ���

tr�s simples !variables ou constantes"� il faut aussi noter que f �x � est synonymede f x � � De toutes fa�ons� les parenth�ses sont indispensables pour les argumentsde fonctions compliqu�s� Pour la m�me raison les parnth�ses sont n�cessaires autourdes arguments n�gatifs f �� � f � � car f � est synonyme de f � qui est unesoustraction�

f �x � � f x � �

L�ordre d��valuation des op�rateurs dans les expressions respecte les conventions ma�th�matiques lorsqu�elles existent !priorit� de l�addition par rapport � la multiplicationpar exemple"� En ce qui concerne l�application des fonctions� on �value les argumentsavant de rentrer dans le corps de la fonction !appel par valeur"� Comme en C� il n�ya pas d�appel par r�f�rence mais on peut pratiquement le simuler en utilisant des r��f�rences !c�est le cas pour la fonction decr d�crite page ���"� L�ordre d��valuation desarguments des op�rateurs et des fonctions n�est pas sp�ci�� par le langage� C�est pour�quoi il faut imp�rativement �viter de faire des e�ets dans les arguments de fonctions� Enr�gle g�n�rale� il ne faut pas m�langer les e�ets !impressions� lectures ou modi�cationde la m�moire� d�clenchement d�exceptions" avec l��valuation au sens math�matique�

En Caml l�ordre d��valuation des arguments n�est pas sp�ci��

L�op�rateur d��galit� s��crit avec le symbole usuel �� C�est un op�rateur polymorphe�c�est���dire qu�il s�applique sans distinction � tous les types de donn�es� En outre� c�estune �galit� structurelle� c�est���dire qu�elle parcourt compl�tement ses arguments pourd�tecter une di��rence ou prouver leur �galit�� L�habitu� de C peut �tre surpris� si parm�garde il utilise le symbole �� au lieu de �� car il existe aussi un op�rateur �� enCaml !et son contraire ��"� Cet op�rateur teste l��galit� physique des valeurs !identit�des adresses m�moire en cas de valeurs allou�es"� Deux objets physiquement �gaux sontbien s#r �gaux� La r�ciproque n�est pas vraie�

��ok� � �ok���

� � bool � true

��ok� �� �ok���

� � bool � false

L��galit� physique est indispensable pour comparer directement les r�f�rences� plut)tque leur contenu !ce que fait l��galit� structurelle"� On s�en sert par exemple dans lesalgorithmes sur les graphes�

�let x � ref ���

x � int ref � ref �

�let y � ref ���

y � int ref � ref �

�x � y��

� � bool � true

�x �� y��

� � bool � false

�x �� x��

� � bool � true

�x �� ���

� � unit � ��

�x � y��

� � bool � false

Page 244: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE B� CAML

B��� Blocs et port�e des variables

Dans le corps des fonctions� on d��nit souvent des valeurs locales pour calculerle r�sultat de la fonction� Ces d��nitions sont introduites par une construction letident � expression in ���� Il n�y a pas de restriction sur les valeurs locales� et lesd��nitions de fonctions sont admises� Ces fonctions locales sont elles�m�mes susceptiblesde comprendre de nouvelles d��nitions de fonctions si n�cessaire et ce ad libitum�Lorsqu�on cite un identi�cateur x dans un programme� il fait n�cessairement r�f�renceau dernier identi�cateur de nom x li� par une d��nition let� ou introduit comme pa�ram�tre d�une fonction apr�s le mot�cl� function� En g�n�ral� il est plus �l�gant degarder les variables aussi locales que possible et de minimiser le nombre de variablesglobales� Ce mode de liaison des identi�cateurs !qu�on appelle la port�e statique" estsurprenant dans le syst�me interactif� En e�et� on ne peut jamais modi�er la d��nitiond�un identi�cateur� en particulier� la correction d�une fonction incorrecte n�a aucun e�etsur les utilisations ant�rieures de cette fonction dans les fonctions d�j� d��nies�

let successeur x � x � ���

let plus�deux x � successeur �successeur x���

�plus�deux ���

� � int � ��

Ici� on constate la b�vue dans la d��nition de successeur� on corrige la fonction� maiscela n�a aucun e�et sur la fonction plus�deux�

�let successeur x � x � ���

successeur � int � int � �fun

�plus�deux ���

� � int � ��

La solution � ce probl�me est de recharger compl�tement les �chiers qui d��nissent leprogramme� En cas de doute� quitter le syst�me interactif et recommencer la session�

B��� Correction des programmes

Le suivi de l�ex�cution des fonctions est obtenu � l�aide du mode trace qui permetd�a%cher les arguments d�une fonction � l�entr�e dans la fonction et le r�sultat � lasortie� Dans l�exemple du paragraphe pr�c�dent� le m�canisme de trace nous renseigneutilement� en tra�ant la fonction successeur on constate qu�elle n�est jamais appel�ependant l��valuation de plus�deux !puisque c�est l�ancienne version de successeurqui est appel�e"�

�trace �successeur���

La fonction successeur est dor(navant trac(e�

� � unit � ��

�successeur ���

successeur ��� �

successeur �� �

� � int � �

�plus�deux ���

� � int � ��

Le mode trace est utile pour suivre le d�roulement des calculs� mais moins int�ressantpour pister l��volution de la m�moire� En ce cas� on imprime des messages pendant led�roulement du programme�

Page 245: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

B��� QUELQUES �L�MENTS DE CAML ���

B���� Instructions

Caml n�a pas � proprement parler la notion d�instructions� puisqu�en dehors desd��nitions� toutes les constructions syntaxiques sont des expressions qui donnent lieu� une �valuation et produisent un r�sultat� Parmi ces expressions� la s�quence joue unr)le particulier� elle permet d��valuer successivement les expressions� Une s�quence estform�e de deux expressions s�par�es par un �� par exemple e� � e�� La valeur d�unes�quence est celle de son dernier �l�ment� les r�sultats interm�diaires sont ignor�s� Danse� � e�� on �value e�� on oublie le r�sultat obtenu� puis on �value e� qui donne ler�sultat �nal de la s�quence� Comme en Pascal� on peut entourer une s�quence desmots�cl� begin et end�

begin e�� e�� ���� en end

Dans une s�quence� on admet les alternatives sans partie else�

if e then e�

qui permet d��valuer e� seulement quand e est vraie� alors que l�alternative compl�te

if e then e� else e�

�value e� quand e est faux� En r�alit�� la conditionnelle partielle est automatiquementcompl�t�e en une alternative compl�te avec else �� Cela explique pourquoi le syst�merapporte des erreurs concernant le type unit� en cas de conditionnelle partielle dontl�unique branche n�est pas de type unit�

�if true then ���

Entr(e interactive�

if true then ���

Cette expression est de type int�

mais est utilis(e avec le type unit�

�if true then printf �Hello world&�n���

Hello world&

� � unit � ��

On l�ve les ambiguit�s dans les cascades de conditionnelles en utilisant begin et end�Ainsi

if e then if e� then e� else e�

�quivaut �

if e then begin if e� then e� else e� end

Filtrage

Caml fournit d�autres m�thodes pour aiguiller les calculs� match permet d��viter unecascade d�expressions if et op�re un aiguillage selon les di��rentes valeurs possiblesd�une expression� Ce m�canisme s�appelle le �ltrage� il est plus riche qu�une simplecomparaison avec l��galit�� car il fait intervenir la forme de l�expression et op�re desliaisons de variables� 3 la �n d�un �ltrage� un cas � se comporte comme un cas pard�faut� Ainsi

match e with

� v� � e�� v� � e����

� vn � en

Page 246: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ANNEXE B� CAML

� � � d�faut

permet de calculer l�expression ei si e � vi� ou d�faut si e � vi pour tout i� Nousreviendrons sur ce m�canisme plus tard�

Boucles

Les autres constructions imp�ratives servent � l�it�ration� ce sont les boucles foret while� Dans les deux cas� le corps de la boucle est parenth�s� par les mot cl�s doet done� La boucle for permet d�it�rer� sans risque de non terminaison� avec un indicede boucle� un identi�cateur dont la valeur augmente automatiquement de � ou de �� �chaque it�ration� Ainsi

for i � e� to e� do e done

�value l�expression e avec i valant successivement e�� e� � �� � � � jusqu�� e� compris� Sie� est sup�rieur � e�� le corps de la boucle n�est jamais �valu�� De m�me

for i � e� downto e� do e done

it�re de e� � e� en d�croissant� Dans les deux cas� l�indice de boucle est introduit par laboucle et dispara�t � la �n de celle�ci� En outre� cet indice de boucle n�est pas li� � uner�f�rence mais � un entier� sa valeur ne peut �tre modi��e par une a�ectation dans lecorps de la boucle� Les seuls pas d�it�ration possibles sont � et ��� Pour obtenir d�autrespas� il faut multiplier la valeur de la variable de contr)le ou employer une boucle while�

On ne peut pas a�ecter l�indice de boucle d�une boucle for�

La construction while�

while e� do e done

�value r�p�titivement l�expression e tant que la condition bool�enne e� est vraie� !Si e�est toujours fausse� le corps de la boucle n�est jamais ex�cut��" Lorsque le corps d�uneboucle while est vide� on la remplace par la valeur rien� �� qui joue alors le r)le d�uneinstruction vide� Par exemple�

while not button�down �� do �� done�

attend que le bouton de la souris soit enfonc��

B���� Exceptions

Il existe un dispositif de gestion des cas exceptionnels� En appliquant la primitiveraise � une valeur exceptionnelle� on d�clenche une erreur� De fa�on sym�trique� laconstruction syntaxique try calcul with �ltrage permet de r�cup�rer les erreurs qui seproduiraient lors de l��valuation de calcul� La valeur renvoy�e s�il n�y a pas d�erreurdoit �tre du m�me type que celle renvoy�e en cas d�erreur dans la partie with de laconstruction� Ainsi� le traitement des situations exceptionnelles !dans la partie with"est disjoint du d�roulement normal du calcul� En cas de besoin� le programmeur d��nitses propres exceptions � l�aide de la construction exception nom�de�l�exception�� pourles exceptions sans argument� ou exception nom�de�l�exception of type�de�l�argument��pour les exceptions avec argument� L�argument des exceptions permet de v�hiculer unevaleur� de l�endroit o$ se produit l�erreur � celui o$ elle est trait�e !voir plus loin"�

Page 247: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

B��� QUELQUES �L�MENTS DE CAML ��

B���� Entr�es � Sorties

On lit sur le terminal !ou la fen�tre texte" � l�aide de la fonction pr�d��nie read�linequi renvoie la cha�ne de caract�res tap�e�

Pour les impressions simples� on dispose de primitives pour les types de base�print�int� print�char� print�float et print�string� la proc�dure print�newlinepermet de passer � la ligne� Pour des impressions plus sophistiqu�es� on emploie lafonction d�impression format�e printf !de la biblioth�que printf"�

La lecture et l��criture sur �chiers a lieu par l�interm�diaire de canaux d�entr�es�sorties� Un canal est ouvert par l�une des primitives open�in ou open�out� L�appelopen�in nom%de%�chier cr�e un canal d�entr�e sur le �chier nom%de%�chier� ouverten lecture� L�appel open�out nom%de%�chier cr�e un canal de sortie sur le �chiernom%de%�chier� ouvert en �criture� La lecture s�op�re principalement par les primitivesinput�char pour lire un caract�re� ou input� input�line pour les cha�nes de caract�res�En sortie� on utilise output�char� output�string et output� Il ne faut pas oublierde fermer les canaux ouverts lorsqu�ils ne sont plus utilis�s !� l�aide de close�in ouclose�out"� En particulier� pour les �chier ouverts en �criture� la fermeture du canalassure l��criture e�ective sur le �chier !sinon les �critures sont r�alis�es en m�moire�dans des tampons"�

Copie de �chiers

Le traitement des �chiers nous permet d�illustrer le m�canisme d�exception� Parexemple� l�ouverture d�un �chier inexistant se solde par le d�clenchement d�une erreurpar le syst�me d�exploitation� l�exception sys��Sys�error est lanc�e avec pour argu�ment la cha�ne de caract�res 5�chier! No such file or directory5�

�open�in �essai���

Exception non rattrap(e� sys��Sys�error �essai� No such file or directory�

On remarque qu�une exception qui n�est pas rattrap�e interrompt compl�tement lescalculs�Supposons maintenant que le �chier de nom essai existe� Apr�s avoir ouvert un canalsur ce �chier et l�avoir lu enti�rement� toute tentative de lecture provoque aussi led�clenchement d�une exception� l�exception pr�d��nie End�of�file�

�let ic � open�in �essai� in

while true do input�line ic done��

Exception non rattrap(e� End�of�file

3 l�aide d�une construction try� on r�cup�rerait facilement l�erreur pour l�imprimer !et�ventuellement continuer autrement le programme"� Nous illustrons ce m�canisme en�crivant une proc�dure qui copie un �chier dans un autre� On utilise une boucle in�niequi copie ligne � ligne le canal d�entr�e et ne s�arr�te que lorsqu�on atteint la �n du �chier� copier� qu�on d�tecte par le d�clenchement de l�exception pr�d��nie End�of�file� Icile d�clenchement de l�exception n�est pas une erreur� c�est au contraire l�indicationattendue de la �n du traitement�

�open �printf���

let copie�channels ic oc �

try

while true do

let line � input�line ic in

output�string oc line�

output�char oc )�n)

done

Page 248: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ANNEXE B� CAML

with

� End�of�file � close�in ic� close�out oc��

La proc�dure de copie elle�m�me se contente de cr�er les canaux sur les �chiers d�entr�eet de sortie� puis d�appeler la proc�dure copie�channels� Comme les ouvertures des�chiers d�entr�e et de sortie sont susceptibles d��chouer� la proc�dure utilise deux tryimbriqu�s pour assurer la bonne gestion des erreurs� En particulier� le canal d�entr�en�est pas laiss� ouvert quand il y a impossibilit� d�ouvrir le canal de sortie� Dans le tryint�rieur qui prot�ge l�ouverture du �chier de sortie et la copie� on remarque le traitementde deux exceptions� La deuxi�me� sys��Break� est d�clench�e quand on interrompt leprogramme� En ce cas un message est �mis� les canaux sont ferm�s et l�on d�clenche� nouveau l�interruption pour pr�venir la fonction appelante que la copie ne s�est pasd�roul� normalement�

let copie origine copie �

try

let ic � open�in origine in

try

let oc � open�out copie in

copie�channels ic oc

with

� sys��Sys�error s �

close�in ic�

printf �Impossible d'ouvrir le ficher �s �n� copie�

raise �sys��Sys�error s�

� sys��Break �

close�in ic�

close�out oc�

printf �Interruption pendant la copie de �s dans �s�n� origine copie�

raise �sys��Break�

with

� sys��Sys�error s �

printf �Le ficher �s n'existe pas�n� origine�

raise �sys��Sys�error s���

B����� D��nitions de types

Types sommes� types �num�r�s

L�utilisateur peut d��nir ses propres types de donn�es� Par exemple� les types �nu�m�r�s couleur et sens d��nissent un ensemble de constantes qui d�signent des objetssymboliques�

type couleur � Bleu � Blanc � Rouge

and sens � Gauche � Haut � Droite � Bas��

let c � Bleu

and s � Droite in

���

end�

couleur est l��num�ration des trois valeurs Bleu� Blanc� Rouge� On aura remarqu� quele symbole # signi�e �ou � Le type bool est aussi un type �num�r� pr�d��ni tel que�

type bool � false � true��

Par exception � la r�gle et pour la commodit� du programmeur� les constructeurs dutype bool ne commencent pas par une majuscule�

Page 249: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

B��� QUELQUES �L�MENTS DE CAML ���

Types sommes� unions

Les types sommes sont une g�n�ralisation des types �num�r�s� au lieu de d��nir desconstantes� on d��nit des constructeurs qui prennent des arguments pour d��nir unevaleur du nouveau type� Consid�rons par exemple un type d�expressions contenant desconstantes !d��nies par leur valeur enti�re"� des variables !d��nies par leur nom"� desadditions et des multiplications !d��nies par le couple de leurs deux op�randes"� et desexponentiations d��nies par le couple d�une expression et de son exposant� On d��nirale type expression par�

type expression �

� Const of int

� Var of string

� Add of expression � expression

� Mul of expression � expression

� Exp of expression � int��

On cr�e des valeurs de type somme en appliquant leurs constructeurs � des argumentsdu bon type� Par exemple le polyn)me � � �x� est repr�sent� par l�expression�

let p � Add �Const �� Mul �Const �� Exp �Var �x�� ������

Les types somme permettent de faire du �ltrage !pattern matching"� a�n de distinguerles cas en fonction d�une valeur �ltr�e� Ainsi la d�rivation par rapport � une variable xse d��nirait simplement par�

let rec d(rive x e �

match e with

� Const � � Const

� Var s � if x � s then Const � else Const

� Add �e�� e�� � Add �d(rive x e�� d(rive x e��

� Mul �Const i� e�� � Mul �Const i� d(rive x e��

� Mul �e�� e�� � Add �Mul �d(rive x e�� e��� Mul �e�� d(rive x e���

� Exp �e� i� � Mul �Const i� Mul �d(rive x e� Exp �e� i � ������

Nous ne donnerons ici que la signi�cation intuitive du �ltrage sur notre exemple par�ticulier� La construction match du corps de d(rive signi�e qu�on examine la valeur del�argument e et selon que c�est�

� Const � � une constante quelconque !�"� alors on retourne la valeur ��

� Var s � une variable que nous nommons s� alors on retourne � ou � selon que c�estla variable par rapport � laquelle on d�rive�

� Add �e e� � une somme de deux expressions que nous nommons respective�ment e et e�� alors on retourne la somme des d�riv�e des deux expressions e ete��

� les autres cas sont analogues au cas de la somme�

On constate sur cet exemple la puissance et l��l�gance du m�canisme� Combin� � lar�cursivit�� il permet d�obtenir une d��nition de d(rive qui se rapproche des d��nitionsmath�matiques usuelles�On obtient la d�riv�e du polyn)me p � � � �x� en �valuant�

�d(rive �x� p��

� � expression �

Add

�Const �

Mul �Const �� Mul �Const �� Mul �Const �� Exp �Var �x�� ������

Page 250: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE B� CAML

On constate que le r�sultat obtenu est grossi�rement simpli�able� On �crit alors unsimpli�cateur !na.f" par �ltrage sur les expressions�

let rec puissance i j �

match j with

� � �

� � � i

� n � i � puissance i �j � ����

let rec simplifie e �

match e with

� Add �Const � e� � simplifie e

� Add �Const i� Const j� � Const �i � j�

� Add �e� Const i� � simplifie �Add �Const i� e��

� Add �e�� e�� � Add �simplifie e�� simplifie e��

� Mul �Const � e� � Const

� Mul �Const �� e� � simplifie e

� Mul �Const i� Const j� � Const �i � j�

� Mul �e� Const i� � simplifie �Mul �Const i� e��

� Mul �e�� e�� � Mul �simplifie e�� simplifie e��

� Exp �Const � j� � Const

� Exp �Const �� j� � Const �

� Exp �Const i� j� � Const �puissance i j�

� Exp �e� � � Const �

� Exp �e� �� � simplifie e

� Exp �e� i� � Exp �simplifie e� i�

� e � e��

Pour comprendre le �ltrage de la fonction simplifie� il faut garder � l�esprit que l�ordredes clauses est signi�catif puisqu�elles sont essay�es dans l�ordre� Un exercice int�ressantconsiste aussi � prouver formellement que la fonction simplifie termine toujours� Onobtient maintenant la d�riv�e du polyn)me p � � � �x� en �valuant�

�simplifie �d(rive �x� p���

� � expression � Mul �Const �� Mul �Const �� Exp �Var �x�� ����

Types produits� enregistrements

Les enregistrements !records en anglais" permettent de regrouper des informationsh�t�rog�nes� Ainsi� on d�clare un type date comme suit�

type mois �

� Janvier � F(vrier � Mars � Avril � Mai � Juin � Juillet

� Aout � Septembre � Octobre � Novembre � D(cembre��

type date � j� int� m� mois� a� int���

let berlin � j � �� m � Novembre� a � �����

and bastille � j � ��� m � Juillet� a � �"�����

Un enregistrement contient des champs de type quelconque� donc �ventuellement d�au�tres enregistrements� Supposons qu�une personne soit repr�sent�e par son nom� et sa datede naissance� le type correspondant comprendra un champ contenant un enregistrementde type date�

type personne � nom� string� naissance� date���

let poincar( �

Page 251: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

B��� QUELQUES �L�MENTS DE CAML ���

nom � �Poincar(�� naissance � j � ��� m � Avril� a � ��!�����

Les champs d�un enregistrement sont �ventuellement mutables� c�est���dire modi�ablespar a�ectation� Cette propri�t� est sp�ci�que � chaque champ et se d�clare lors dela d��nition du type� en ajoutant le mot cl� mutable devant le nom du champ� Pourmodi�er le champ label du record r en y d�posant la valeur v� on �crit r�label �� v�

�type point � mutable x � int� mutable y � int���

Le type t est d(fini�

�let origine � x � � y � ���

origine � point � x � � y � �

�origine�x �� ���

� � unit � ��

�origine��

� � point � x � �� y � �

En combinaison avec les types somme� les enregistrements mod�lisent des types dedonn�es complexes�

type complexe �

� Cart(sien of cart(siennes

� Polaire of polaires

and cart(siennes � re� float� im� float�

and polaires � rho� float� theta� float���

let pi � �� �� atan ����

let x � Cart(sien re � �� im � ���

and y � Polaire rho � ��� theta � pi �� �����

Une rotation de ��� s��crit alors�

let rotation�pi�sur�deux � function

� Cart(sien x � Cart(sien re � �� x�im� im � x�re�

� Polaire x � Polaire rho � x�rho� theta � x�theta �� pi �� �����

Types abr�viations

On donne un nom � une expression de type � l�aide d�une d��nition d�abr�viation�C�est quelquefois utile pour la lisibilit� du programme� Par exemple�

type compteur �� int��

d��nit un type compteur �quivalent au type int�

Types abstraits

Si� dans l�interface d�un module !voir ci�dessous"� on exporte un type sans rien enpr�ciser !sans donner la liste de ses champs s�il s�agit d�un type enregistrement� ni laliste de ses constructeurs s�il s�agit d�un type somme"� on dit qu�on a abstrait ce type�ou qu�on l�a export� abstraitement� Pour exporter abstraitement le type t� on �critsimplement

type t��L�utilisateur du module qui d��nit ce type abstrait n�a aucun moyen de savoir commentle type t est impl�ment� s�il n�a pas acc�s au source de l�impl�mentation du module�Cela permet de changer cette impl�mentation !par exemple pour l�optimiser" sans quel�utilisateur du module n�ait � modi�er ses propres programmes� C�est le cas du typedes piles dans l�interface du module stack d�crit ci�dessous�

Page 252: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE B� CAML

�galit� de types

La concordance des types se fait par nom� Les d��nitions de type sont quali��es deg�n�ratives� c�est���dire qu�elles introduisent toujours de nouveaux types !� la mani�redes let embo�t�s qui introduisent toujours de nouveaux identi�cateurs"� Ainsi� deuxtypes sont �gaux s�ils font r�f�rence � la m�me d��nition de type�Attention� ce ph�nom�ne implique que deux types de m�me nom coexistent parfois dansun programme� Dans le syst�me interactif� cela arrive quand on red��nit un type qui�tait erron�� Le compilateur ne confond pas les deux types� mais il �nonce �ventuellementdes erreurs de type bizarres� car il n�a pas de moyen de nommer di��remment les deuxtypes� �trangement� il indique alors qu�un type t !l�ancien" n�est pas compatible avecun type t !mais c�est le nouveau"� Consid�rons les d��nitions

�type t � C of int��

Le type t est d(fini�

�let int�of�t x �

match x with C i � i��

int�of�t � t � int � �fun

Jusque l� rien d�anormal� Mais d��nissons t � nouveau !pour lui ajouter un nouveauconstructeur par exemple"� l�argument de la fonction int�of�t est de l�ancien typet et on ne peut pas l�appliquer � une valeur du nouveau type t� !Voir aussi l�URLhttp���pauillac�inria�fr�caml�FAQ�FAQ�EXPERT�fra�html�"

�type t � C of int � D of float��

Le type t est d(fini�

�int�of�t �C ����

Entr(e interactive�

int�of�t �C ����

���

Cette expression est de type t�

mais est utilis(e avec le type t�

Ce ph�nom�ne se produit aussi avec le compilateur ind�pendant !en cas de gestionerron�e des d�pendances de modules"� Si l�on rencontre cet �trange message d�erreur�il faut tout recommencer� soit quitter le syst�me interactif et reprendre une nouvellesession� soit recompiler enti�rement tous les modules de son programme�

Structures de donn�es polymorphes

Toutes les donn�es ne sont pas forc�ment d�un type de base� Certaines sont po�lymorphes c�est���dire qu�elles poss�dent un type dont certaines composantes ne sontpas compl�tement d�termin�es mais comporte des variables de type� L�exemple le plussimple est la liste vide� qui est �videmment une liste d�entiers !int list" ou une listede bool�ens !bool list" et plus g�n�ralement une liste de �n�importe quel type � ce queCaml symbolise par �a !et la liste vide polymorphe est du type �a list"�

On d��nit des structures de donn�es polymorphes en faisant pr�c�der le nom de leurtype par la liste de ses param�tres de type� Par exemple�

type 'a liste �

� Nulle

� Cons of 'a � 'a liste��

ou encore pour des tables polymorphes�

type �'a� 'b� table � nb�entr(es � int� contenu � �'a � 'b� vect���

Page 253: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

B��� QUELQUES �L�MENTS DE CAML ���

Les listes pr�d��nies en Caml forment le type list et sont �quivalentes � notretype liste� La liste vide est symbolis�e par �� et le constructeur de liste est not� !!�et correspond � notre constructeur Cons� Pour plus de commodit�� l�op�rateur !! estin�xe� x !! l repr�sente la liste qui commence par x� suivi des �l�ments de la liste l�En outre� on dispose d�une syntaxe l�g�re pour construire des listes litt�rales� on �critles �l�ments s�par�s par des point�virgules� le tout entre crochets � et ��

�let l � #�� �� �$��

l � int list � #�� �� �$

�let ll � �� l��

ll � int list � #� �� �� �$

Les listes sont munies de nombreuses op�rations pr�d��nies� dont les fonctionnelles deparcours ou d�it�ration� map� do�list ou it�list� ou encore la concat�nation *� 3titre d�exemple embl�matique de fonction d��nie sur les listes� nous red��nissons lafonctionnelle map qui applique une fonction sur tous les �l�ments d�une liste�

�let print�list l � do�list print�int l��

print�list � int list � unit � �fun

�print�list l��

���� � unit � ��

�let rec map f l �

match l with

� #$ � #$

� x �� rest � f x �� map f rest��

map � �'a � 'b� � 'a list � 'b list � �fun

�let succ�l � map �function x � x � �� ll��

succ�l � int list � #�� �� �� �$

�print�list succ�l��

����� � unit � ��

�let somme l � it�list �function x � function y � x � y� l��

somme � int list � int � �fun

�somme ll��

� � int � �

�somme succ�l��

� � int � �

La manipulation des listes est grandement facilit�e par la gestion automatique de lam�moire� puisque l�allocation et la d�sallocation sont prises en charge par le gestionnairede m�moire et son programme de r�cup�ration automatique des structures devenuesinutiles !le ramasse�miettes� ou glaneur de cellules� ou GC !garbage collector""�

En Caml la gestion m�moire est automatique�

B����� Modules

On dispose d�un syst�me de modules simple qui d��nit un module comme un couplede �chiers� Le �chier d�interface sp�ci�e les fonctionalit�s o�ertes par le module� et le�chier d�impl�mentation contient le code source qui cr�e ces fonctionalit�s� Le �chierd�interface a l�extension �mli !ml interface" et le �chier d�impl�mentation l�extension�ml� Prenons l�exemple d�un module stack impl�mentant les piles� Son �chier d�interfaceest le �chier stack�mli suivant�

�� Stacks ��

�� This module implements stacks �LIFOs�� with in�place modification� ��

Page 254: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� ANNEXE B� CAML

type 'a t��

�� The type of stacks containing elements of type #'a$� ��

exception Empty��

�� Raised when #pop$ is applied to an empty stack� ��

value new� unit � 'a t

�� Return a new stack� initially empty� ��

and push� 'a � 'a t � unit

�� #push x s$ adds the element #x$ at the top of stack #s$� ��

and pop� 'a t � 'a

�� #pop s$ removes and returns the topmost element in stack #s$�

or raises #Empty$ if the stack is empty� ��

and clear � 'a t � unit

�� Discard all elements from a stack� ��

and length� 'a t � int

�� Return the number of elements in a stack� ��

and iter� �'a � 'b� � 'a t � unit

�� #iter f s$ applies #f$ in turn to all elements of #s$� from the

element at the top of the stack to the element at the

bottom of the stack� The stack itself is unchanged� ��

��

L�interface d�clare les signatures des objets fournis par le module� types� exceptions ouvaleurs� Une impl�mentation r�pondant � cette sp�ci�cation est�

type 'a t � mutable c � 'a list ���

let new �� � c � #$ ���

let clear s � s�c �� #$��

let push x s � s�c �� x �� s�c��

let pop s �

match s�c with

� hd��tl � s�c �� tl� hd

� #$ � raise Empty��

let length s � list�length s�c��

let iter f s � do�list f s�c��

La compilation de l�interface du module stack produit un �chier stack�zi et celle del�impl�mentation le �chier stack�zo� Quand le module stack est compil�� on disposede ses fonctionalit�s en �crivant la ligne

open �stack���en t�te du �chier qui l�utilise� L�appel direct des identi�cateurs fournis par le moduleutilise la notation quali��e� qui consiste � su%xer le nom du module par le symbole ��suivi de l�identi�cateur� Ainsi stack��pop d�signe la fonction pop du module stack�Nous avons d�j� utilis� la notation dans nos programmes pour d�signer les exceptionssys��Break et sys��Sys�error du module sys� De m�me� il est courant de ne pasouvrir le module printf pour un simple appel � la fonction d�impression format�e� onappelle directement la fonction printf par son nom quali�� printf��printf�Pour qu�on puisse acc�der aux identi�cateurs du module stack� il faut que ce modulesoit accessible� c�est���dire r�sidant dans le r�pertoire de travail actuel ou bien dans labiblioth�que standard de Caml Light� ou bien encore dans l�un des r�pertoires indiqu�s

Page 255: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

B��� QUELQUES �L�MENTS DE CAML ���

sur la ligne de commande du compilateur avec l�option �I� Lors de la cr�ation de l�ex��cutable� il faut �galement demander l��dition des liens de tous les modules utilis�s dansl�application !autres que les modules de la biblioth�que standard"�Les modules permettent �videmment la compilation s�par�e� ce qui sous le syst�meUnix s�accompagne de l�utilisation de l�utilitaire make� Nous donnons donc un make�leminimum pour g�rer un programme d�coup� en modules� On s�inspirera de ce �chierpour cr�er ses propres make�les� Dans ce squelette de �chier make� la variable OBJS estla liste des modules� et EXEC contient le nom de l�ex�cutable � fabriquer� Pour simpli�er�on suppose qu�il y a deux modules seulement module et module�� et que l�ex�cutables�appelle prog�

CAMLC�camlc �W �g �I �

OBJS� module��zo module��zo

EXEC� prog

all� *�OBJS�

*�CAMLC� �o *�EXEC� *�OBJS�

clean�

rm �f ��z#io$ ��zix �, ���

depend�

mv Makefile Makefile�bak

�sed �n �e '������� DO NOT DELETE THIS LINE�p' Makefile�bak� �

camldep ��mli ��ml� Makefile

rm Makefile�bak

�SUFFIXES�

�SUFFIXES� �ml �mli �zo �zi

�mli�zi�

*�CAMLC� �c *�

�ml�zo�

*�CAMLC� �c *�

��� EVERYTHING THAT GOES BEYOND THIS COMMENT IS GENERATED

��� DO NOT DELETE THIS LINE

La commande make all ou simplement make� refabrique l�ex�cutable et make cleane�ace les �chiers compil�s� Les d�pendances entre modules sont automatiquement re�calcul�es en lan�ant make depend� La commande camldep est un perl script qui setrouve � l�adressehttp���pauillac�inria�fr�caml�FAQ�FAQ�EXPERT�fra�html�make�

Biblioth�ques

Les biblioth�ques du syst�me Caml r�sident dans le r�pertoire lib de l�installa�tion pour les biblioth�ques de base indispensables� Les biblioth�ques auxiliaires sontinstall�es au m�me endroit� leur source se trouve dans le r�pertoire contrib de la dis�tribution� Une documentation minimale est incluse dans les �chiers d�interface� sous laforme de commentaires� Sous Unix� il est tr�s utile d�utiliser la commande camlbrowser!d�habitude cr��e lors de l�intallation du syst�me"� pour parcourir les librairies ou sespropres sources� Parmi les biblioth�ques� nous citons simplement la biblioth�que du g��n�rateur de nombres al�atoires� celle de traitement de grammaires et celle des utilitairesgraphiques�

Page 256: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ANNEXE B� CAML

Nombres al�atoires

Pour les essais� il est souvent pratique de disposer d�un g�n�rateur de nombres al�a�toires� La biblioth�que random propose la fonction random��int qui renvoie un nombreal�atoire compris entre � inclus et son argument exclus� random��float est analoguemais renvoie un nombre �ottant� La fonction random��init permet d�initialiser le g��n�rateur avec un nombre entier�

Analyse syntaxique et lexicale

Il existe une interface avec les g�n�rateurs d�analyseurs syntaxiques et lexicauxd�Unix !Yacc et Lex"� Les �chiers d�entr�e de camllex et camlyacc ont les extensions�mll et �mly� Sur le fonctionnement de ces traits avanc�s� consulter la documentationdu langage�

B����� Fonctions graphiques

Les primitives graphiques sont ind�pendantes de la machine� Sur les micros�ordinateursle graphique est int�gr� � l�application� sur les machines Unix� il faut appeler une versioninteractive sp�ciale� qui s�obtient par la commande camllight camlgraph� On acc�deaux primitives graphiques en ouvrant le module graphics� On cr�e la fen�tre de dessinen appelant la fonction open�graph qui prend en argument une cha�ne de description dela g�om�trie de la fen�tre !par d�faut� une cha�ne vide assure un comportement raison�nable"� La description de la fen�tre d�pend de la machine et n�est pas obligatoirementprise en compte par l�impl�mentation de la biblioth�que�

Un programme qui utilise le graphique commence donc par ces deux lignes�

�open �graphics���

open�graph ����

La taille de l��cran graphique d�pend de l�impl�mentation� mais l�origine du syst�mede coordonn�es est toujours en bas et � gauche� L�axe des abscisses va classiquementde la gauche vers la droite et l�axe des ordonn�es du bas vers le haut� Il y a une notionde point courant et de crayon avec une taille et une couleur courantes� On d�place lecrayon� sans dessiner ou en dessinant des segments de droite par les fonctions suivantes�

moveto x y d�place le crayon aux coordonn�es absolues !x� y"�

lineto x y trace une ligne depuis le point courant jusqu�au point de coordonn�es !x�y"�

plot x y trace le point !x� y"�

set�color c �xe la couleur du crayon� !Les couleurs sont obtenues par la fonction rgb�on dispose aussi des constantes black� white� red� green� blue� yellow� cyan etmagenta�"

set�line�width n change la largeur du trait du crayon�

draw�arc x y rx ry a a� trace un arc d�ellipse de centre !x� y" de rayon horizontalrx� vertical ry� de l�angle a � l�angle a� !en degr�s"�

draw�ellipse x y rx ry trace une ellipse de centre !x� y" de rayon horizontal rx� etde rayon vertical ry�

draw�circle x y r trace un cercle centre !x� y" et de rayon r�

Page 257: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

B��� QUELQUES �L�MENTS DE CAML ��

On peint l�int�rieur de ces courbes avec fill�rect� fill�arc� fill�ellipse� fill�circle�Dans la fen�tre graphique� on imprime avec les fonctions�

draw�char c a%che le caract�re c au point courant dans la fen�tre graphique�

draw�string s a%che la cha�ne de caract�res s�

close�graph � d�truit la fen�tre graphique�

clear�graph � e�ace l��cran�

size�x � renvoie la taille de l��cran en abscisses�

size�y � renvoie la taille de l��cran en ordonn�es��

background et foreground sont respectivement les couleurs du fond et du crayon�

point�color x y renvoie la couleur du point !x� y"�

current�point � renvoie la position du point courant�

button�down renvoie vrai si le bouton de la souris est enfonc�� faux sinon�

mouse�pos � renvoie les cordonn�es du curseur de la souris�

read�key � attend l�appui sur une touche� la renvoie�

key�pressed � renvoie vrai si une touche est enfonc�e� faux sinon�

Plus g�n�ralement� un certain nombre d��v�nements observent l�interaction entre lamachine et l�utilisateur�

wait�next�event evl attend jusqu�� ce que l�un des �v�nements de la liste evl se pro�duise� et renvoie le statut de la souris et du clavier � ce moment�l�� Les �v�nementspossibles sont�

� Button�down� le boutton de la souris a �t� press��

� Button�up� le boutton de la souris a �t� relach��

� Key�pressed� une touche a �t� appuy�e�

� Mouse�motion� la souris a boug��

� Poll� ne pas attendre� retourner de suite�

Nous ne d�crirons pas ici les primitives de manipulation des images qu�on trouve dansle module graphics�

Un exemple

Nous faisons rebondir une balle dans un rectangle� premi�re �tape vers un jeu deping�pong�

�open �graphics���

open�graph ����

let c � !�� �� Le rayon de la balle ��

let draw�balle x y �

set�color foreground� fill�circle x y c��

Page 258: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ANNEXE B� CAML

let clear�balle x y �

set�color background� fill�circle x y c��

let get�mouse �� �

while not �button�down ��� do �� done�

mouse�pos����

let wait �� � for i � to � do �� done��

let v�x � � �� Vitesse de dplacement de la balle ��

and v�y � ���

let x�min � � � c � v�x�� �� Cadre autoris ��

let x�max � size�x �� � x�min��

let y�min � � � c � v�y��

let y�max � size�y �� � y�min��

let rec pong�aux x y dx dy �

draw�balle x y�

let new�x � x � dx

and new�y � y � dy in

let new�dx �

if new�x �� x�min �� new�x � x�max then �� dx� else dx

and new�dy �

if new�y �� y�min �� new�y � y�max then �� dy� else dy in

wait ���

clear�balle x y�

pong�aux new�x new�y new�dx new�dy��

let pong �� � clear�graph��� pong�aux � � v�x v�y��

pong ����

Les adeptes du style imp�ratif �criraient plut)t la proc�dure pong ainsi�

let dx � ref v�x

and dy � ref v�y��

let pong �� �

clear�graph���

let x � ref �

and y � ref � in

while true do

let cur�x � &x

and cur�y � &y in

draw�balle cur�x cur�y�

x �� cur�x � &dx�

y �� cur�y � &dy�

if &x �� x�min �� &x � x�max then dx �� � &dx�

if &y �� y�min �� &y � y�max then dy �� � &dy�

wait ���

clear�balle cur�x cur�y

done��

Documentation

La documentation de Caml se trouve �videmment dans le manuel de r�f�rence ����On trouve aussi de la documentation en anglais� sous forme d�aide en ligne sur les micros

Page 259: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

B��� SYNTAXE BNF DE CAML ���

ordinateurs Macintosh et PC� Beaucoup d�informations sont disponibles directement surla toile ou World Wide Web�

http���pauillac�inria�fr�caml�index�fra�html� site principal de Caml�http���pauillac�inria�fr�caml�man�caml�index�html� manuel en anglais�http���pauillac�inria�fr�caml�contribs�fra�html� biblioth�que et outils�http���pauillac�inria�fr�caml�FAQ�index�fra�html� la FAQ de Caml� les questions

et r�ponses fr�quemment pos�es au sujet du langage�

B�� Syntaxe BNF de Caml

Nous donnons une syntaxe BNF �Backus Naur Form� tendue� Chaque r�gle de la gram�maire d�nit un non�terminal par une production� Le non�terminal d�ni est � gauche dusymbole � � �� la production � droite� Un non�terminal est crit ainsi� les mots cls et symbolesterminaux ainsi� Dans les membres droits de r�gles� le symbole j signi�e lalternative� les cro�chets indiquent une partie optionnelle ainsi �� les accolades une partie qui peut �tre rpte unnombre quelconque de fois f ainsi g� tandis quun symbole � en exposant des accolades indiqueune partie rpte au moins une fois� f ainsi g�� Dans les r�gles lexicales les trois points � � � �situs entre deux caract�res a et b� indiquent lensemble des caract�res entre a et b dans lordredu code ASCII� Finalement� les parenth�ses servent au groupement �ainsi��

R�gles de grammaires

implementation � � � fimpl�phrase ��g

impl�phrase � � � expression j value�de�nition

j type�de�nition j exception�de�nition j directive

value�de�nition � � � let rec� let�binding fand let�bindingg

let�binding � � � pattern � expression j variable pattern�list � expression

interface � � � fintf�phrase ��g

intf�phrase � � � value�declaration j type�de�nition j exception�de�nition j directive

value�declaration � � � value ident � type�expression fand ident � type�expressiong

expression � � � primary�expression

j construction�expression

j nary�expression

j sequencing�expression

primary�expression � � � ident j variable j constant j � expression �

j begin expression end j � expression � type�expression �

construction�expression � � � ncconstr expression

j expression � expression f� expressiongj expression �� expression j # expression f� expressiong $j #� expression f� expressiong �$j label � expression f� label � expressiong �j function simple�matching j fun multiple�matching

Page 260: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ANNEXE B� CAML

nary�expression � � � expression expression

j pre�x�op expression j expression in�x�op expression

j expression % expression j expression or expression

j expression � label j expression � label �� expression

j expression �� expression � j expression �� expression � �� expression

j expression �# expression $ j expression �# expression $ �� expression

sequencing�expression � � � expression � expression

j if expression then expression else expression�j match expression with simple�matching

j try expression with simple�matching

j while expression do expression done

j for ident � expression �to j downto� expression do expression done

j let rec� let�binding fand let�bindingg in expression

simple�matching � � � pattern � expression f� pattern � expressiong

multiple�matching � � � pattern�list � expression f� pattern�list � expressiong

pattern�list � � � pattern fpatterng

pre�x�op � � � � j �� j &

in�x�op � � � � j � j � j � j mod j �� j �� j �� j �� j . j � j & j ��j � j � j �� j &� j � j �� j j �� j �� j ��� j � j ���

pattern � � � ident j constant j � pattern � j � pattern � type�expression �

j ncconstr pattern

j pattern � pattern f� patterngj pattern �� pattern j # pattern f� patterng $j label � pattern f� label � patterng �j pattern � pattern

j � j pattern as ident

exception�de�nition � � � exception constr�decl fand constr�declg

type�de�nition � � � type typedef fand typedef g

typedef � � � type�params ident � constr�decl f� constr�declgj type�params ident � label�decl f� label�declg �j type�params ident �� type�expression

j type�params ident

type�params � � � nothing j ' ident j � ' ident f� ' identg �

constr�decl � � � ident j ident of type�expression

label�decl � � � ident � type�expression j mutable ident � type�expression

type�expression � � � ' ident j � type�expression �

j type�expression � type�expression j type�expression f� type�expressiong�

j typeconstr j type�expression typeconstr

j � type�expression f� type�expressiong � typeconstr

constant � � � integer�literal j �oat�literal j char�literal j string�literal j cconstr

global�name � � � ident j ident �� ident

variable � � � global�name j prefix operator�name

Page 261: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

B��� SYNTAXE BNF DE CAML ��

operator�name � � � � j � j � j � j mod j �� j �� j �� j ��j . j � j & j �� j � j � j �� j &� j &j � j �� j j �� j �� j ��� j � j ���

cconstr � � � global�name j #$ j ��

ncconstr � � � global�name j prefix ��

typeconstr � � � global�name

label � � � global�name

directive � � � � open string j � close string j � ident string

Pr�c�dences

Les prcdences relatives des oprateurs et des constructions non fermes sont donnes danslordre dcroissant� Chaque nouvelle ligne indique une prcdence dcroissante� Sur chaque ligneles oprateurs de m�me prcdence sont cits spars par des blancs$ ou spars par une virgulesuivie du mot puis� en cas de prcdence plus faible� La dcoration �droite� ou �gauche� signi�eque le ou les oprateurs qui prcdent poss�dent lassociativit correspondante�

Les prcdences relatives des oprations dans les expressions sont les suivantes�Acc�s� &� puis � �� �#

Applications� application de fonction �droite�� puis application de constructeur

Arithmtique� � �� �unaire�� puis mod �gauche�� puis � �� � �� �gauche�� puis � �� � ��

�gauche�Oprations non arithmtiques� �� �droite�� puis . � �droite�Conditions� �� �� � etc�� �gauche�� puis not� puis % �gauche�� puis or �gauche�Paires� �A ectations� �� �� �droite�Constructions� if� puis � �droite�� puis let match fun function try�

Les prcdences relatives des oprations dans les �ltres sont les suivantes�application de constructeur� puis �� �droite�� puis �� puis � �gauche�� puis as�

Les prcdences relatives des oprations dans les types sont les suivantes�application de constructeur de type� puis �� puis � �droite��

R�gles lexicales

ident � � � letter fletter j � � �� j �g

letter � � � A � � � Z j a � � � z

integer�literal � � � �� f � � ��g�

j �� �x j X� f � � �� j A � � �F j a � � � fg�

j �� �o j O� f � � �"g�

j �� �b j B� f � � ��g�

�oat�literal � � � �� f � � � �g� � f � � ��g� �e j E� � j �� f � � � �g��

char�literal � � � ) regular�char )

j ) � �� j ) j n j t j b j r� )j ) � � � � ��� � � � � �� � � � � �� )

string�literal � � � � fstring�characterg �

Page 262: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ANNEXE B� CAML

string�character � � � regular�char

j � �� j � j n j t j b j r�j � � � � ��� � � � � �� � � � � ��

Ces identi�cateurs sont des mots�cls rservs�

and as begin do done downto

else end exception for fun function

if in let match mutable not

of or prefix rec then to

try type value where while with

Les suites de caract�res suivantes sont aussi des mots cls�

� & &� % � � � �� � ��

� � �� � � �� �# � �� �

�� �� � �� � �� �� �� ��� �

�� � �� �� � � �� . #

#� $ � � �� � �$ � '

Les ambiguits lexicales sont rsolues par la r�gle du plus long pr�xe �ou %longest match&��quand une suite de caract�res permet de trouver plusieurs lex�mes� le plus long est choisi�

Bibliographie

�� Le langage Caml� Pierre Weis et Xavier Leroy� InterEditions� ����� ISBN �� ���������

�� Manuel de R�f�rence du langage Caml� Xavier Leroy et Pierre Weis� InterEditions������ ISBN �� ���������

� Approche fonctionnelle de la programmation� Guy Cousineau et Michel Mauny�Ediscience !Collection Informatique"� ����� ISBN ���� �������

�� Concepts et outils de programmation ! le style fonctionnel� le style imp�ratif avecCAML et Ada Th�r�se Accart Hardin et V�ronique Donzeau�Gouge Vigui�� Inter�Editions� ����� ISBN �� �������� �

�� Option informatique� Denis Monasse� Vuibert !Enseignement sup�rieur et Infor�matique"� ���� ISBN �� �� ����

�� Lawrence C� Paulson� ML for the working programmer� Cambridge UniversityPress� �����

�� Edinburgh LCF� M�J� Gordon� R� Milner� C� Wadsworth� LNCS � �� ��

�� Elements of ML programming� Je�rey D� Ullman� Prentice Hall� �����

� The de�niton of Standard ML� Robin Milner� Mads Tofte� Robert Harper� TheMIT Press� �����

Page 263: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��

Annexe C

Initiation au syst�me Unix

Le syst�me Unix fut d�velopp� � Bell laboratories !research" de �� � � ���� puis �l�universit� de Berkeley� C�est un syst�me maintenant standard dans le milieu scienti��que� Les machines de l�X en Unix sont des serveurs Dec Alpha ou HP et des stationsDec� HP� PC� MacIntosh pour les �l�ves� Linux est une variante du syst�me Unix quifonctionne sur les PC� Cette annexe reprend des notes de cours du magist�re de l�ENS�crites par Damien Doligez et Xavier Leroy� Son adaptation pour l�X est due � Domi�nique Moret� Il y a deux parties� une trousse de survie pour conna�tre les manipulationssimples� un approfondissement pour apprendre les commandes �l�mentaires� En�n� leb�aba du r�seau �gure dans une troisi�me section�

C�� Trousse de Survie

C���� Se connecter

� Depuis les stations Alpha� Hp� PC� Mac et les terminaux X des salles de TD� taperson nom d�utilisateur login�� puis son mot de passe�

� Depuis une autre machine� interne � l�Ecole� taper telnet ���������"��� ousimplement telnet poly puis r�pondre � login�password comme pr�c�demment�

� Depuis une machine externe � l�Ecole mais reli�e au r�seau Internet il faut alorstaper telnet ���������"��� ou simplement telnet sil�polytechnique�fr �� puislogin�password comme pr�c�demment�

� Par Minitel !il faut un Minitel mod�le �B ou �"� se connecter au �� � �� �� ���Appuyer sur fnct�T� puis A pour passer le Minitel en mode � colonnes avecd��lement� Appuyer plusieurs fois sur la touche retour chariot !��� pas Envoi"�jusqu�� obtenir le prompt

Entrez dans Communication Server���

#� $CS

R�pondre c poly� puis retour chariot� !On peut mettre le nom d�une autre ma�chine des salles Dec� Hp ou Pc � la place de poly�" Puis login&password commepr�c�demment�

� Par terminal ou �mulation terminal� on peut aussi appeler le �� � �� � �� ilfaut r�gler ses param�tres de communication � bits� sans parit�� sans Xon&Xo��� bit stop� puis login�passwd comme pr�c�demment�

�� sil signie passerelle en breton

Page 264: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ANNEXE C� INITIATION AU SYST�ME UNIX

C���� Se d�connecter

� Depuis un terminal ou une autre machine� taper exit

� Depuis un minitel� taper exit puis logout�

� Depuis une station ou un terminal X� appuyer sur le bouton droit ou gauche de lasouris� le pointeur �tant sur le fond d��cran� et s�lectionner DECONNEXION dans lemenu qui appara�t alors� !Taper exit dans une fen�tre shell ferme cette fen�tre�mais ne vous d�connecte pas de la machine�"

� Ne jamais �teindre une station ou un terminal X�

C���� Le syst�me de fen�tres par d�faut

Ce paragraphe ne concerne que les stations !postes de travail" ou les terminaux X�

Boutons Souris

Bouton de la SourisPosition de la souris Gauche Milieu Droite

Titre de fen�tre dplacer menu oprationsTitre �bouton gauche� menu oprationsTitre �bouton milieu� iconi�erTitre �bouton droite� maximiserFen�tre Shell �xterm� slectionner coller modi�er la slectionAscenseur descendre positionner monterIc'ne dplacer ouvrir

SessionsFond dcran xterm

polyrafra�chir ecran�re�dmarrer FvwmDECONNEXION

Fen�tre Emacs positionner curseur coller

Par d�faut� la fen�tre active est celle contenant le pointeur de la souris� �

Quelques outils du syst�me de fen�tres

xterm ouverture d�une fen�tre shell sur la station o$ on travaillepoly ouverture d�une fen�tre shell sur polyRefresh Screen redessine l��cranRestart Fvwm red�marre le gestionaire de fen�tres

C���� Obtenir de laide

man commande Montre page par page le manuel de commande� Faire Espace pour passer� la page suivante� q pour quitter avant la �n� Pour quitter� on peut aussi faireCtrl�C� qui interrompt la plupart des commandes Unix�

�� Cet environnement est celui qui a �t� install� par le SITX� mais il est bien s�r enti�rementrecongurable avec un peu d�habilet�� ce que nous d�conseillons vivement aux d�butants�

Page 265: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

C��� TROUSSE DE SURVIE ��

man �k mot Donne la liste des commandes index�es sur le mot�cl� mot� avec un r�sum�de ce qu�elles font en une ligne�

Dans les programmes interactifs !elm� maple"� on peut souvent obtenir de l�aide entapant+ ou h� En�n� on peut aussi poser des questions aux utilisateurs habituels dessalles informatiques� certains en savent tr�s long�

C��� Changer son mot de passe

La commande est passwd� Crit�res de choix d�un mot de passe�

� utiliser caract�res !si vous en proposez plus� seuls les premiers caract�res sontpris en compte"�

� ni un pr�nom� ni un nom propre� ni un mot du dictionnaire�

� au moins une lettre majuscule� ou un chi�re� ou un caract�re sp�cial !non alpha�b�tique"�

� Pas de caract6re accentu� !comme �"�

C��� Courrier �lectronique

La commande elm permet de lire son courrier et d�en envoyer� R�sum� des com�mandes de elm�

Espace A#che le message slectionn �Espace pour a#cher la page sui�vante� i pour sortir du message�

� � Slectionne un messagem Compose et envoie un messager Compose et envoie une rponse au message slectionns Sauve le message slectionn dans un �chierd E ace le message slectionnq Pour sortir

En jargon elm� un folder est simplement le nom d�un �chier qui contient des messages�

Les adresses de courrier

Une adresse de courrier �lectronique est de la forme la forme pr(nom�nom�*machine"�La machine est le nom complet de la machine de destination� Il ne faut pas mettred�espaces dans une adresse de courrier� truc * machine ne marche pas� Votre adressede courrier sur les machines de l�X est�

pr�nom�nom.polytechnique�fr

ou

nom�de�login.poly�polytechnique�fr

On omet les accents� on met un tiret � pour les pr�noms ou noms compos�s� Exemples!purement imaginaires"�

Henri Poincar poincare.poly�polytechnique�fr

Henri�Poincare.polytechnique�fr

Anne(Sophie de Barreau de Chaise barreau.poly�polytechnique�fr

Anne�Sophie�de�Barreau�de�Chaise.polytechnique�fr

Fulgence lH'pital lhopital.poly�polytechnique�fr

Fulgence�l�Hopital.polytechnique�fr

Page 266: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� ANNEXE C� INITIATION AU SYST�ME UNIX

Pour du courrier destin� � un utilisateur de poly vous pouvez utiliser une adresse plussimple� r�duite au nom d�utilisteur !ou nom de login"� Pour envoyer du courrier � unutilisateur d�une marchine connect�e au r�seau de l�X� vous pouvez utiliser l�adresse�nom�utilisateur*nom�de�machine par exemple � mail cori.lix

Si vous n��tes pas s#r de votre adresse� exp�rimentez en vous envoyant du courrier� vous�m�me�

Pour ce qui est des noms complets de machines� ils sont g�n�ralement en trois parties�machine�institution�pays� Quelques exemples de noms complets�

poly�polytechnique�fr la machine principale de lXclipper�ens�fr la machine des %fr�res& de lENSftp�inria�fr une machine avec du logiciel � lINRIAresearch�att�com une machine � courrier des AT)T Bell Laboratoriescs�princeton�edu le dpartement dinformatique de Princetonsrc�dec�com un labo de Digital Equipmentjpl�nasa�gov le Jet Propulsion Laboratory

Quelques exemples de noms de �pays �au Australie br Brsil ca Canada de Allemagnedk Danemark fi Finlande fr France it Italiejp Japon nl Hollande nz Nouvelle�Zlande se Su�desu CEI th Tha*lande uk Royaume�Uni za Afrique du Sudcom Etats�Unis� rseau des entreprises privsedu Etats�Unis� rseau des universitsgov Etats�Unis� rseau des labos gouvernementauxmil Etats�Unis� rseau de larmebitnet Un rseau de machines IBM

C���� �diteur de texte

Plusieurs �diteurs sont disponibles� emacs vi textedit � � � � Nous recommandonschaudement emacs� On le lance par emacs ou emacs nom�de��chier� Les commandesvitales sont��� �� � � dplace le curseurDelete e ace le caract�re prcdentControl�V avance dune pageMeta�V recule dune page �Meta� ce sont les touches marques � ou escou Alt�Control�X Control�S crit le �chier modi�Control�G interruption �arr�t� de la commande en coursControl�X Control�C quitte Emacs

Pour apprendre � se servir d�Emacs� on peut lancer emacs et taper Control�h� puis t��a a%che un petit cours assez bien fait�

C���� Manipulations simples de �chiers

� ls a%che la liste des �chiers�

� more nom a%che le contenu du �chier nom� page par page� La touche espace passe� la page suivante� q quitte�

� cp nom� nom� copie le �chier nom� dans un �chier nom��

� mv nom� nom� change le nom d�un �chier de nom� en nom��

� rm nom d�truit le �chier nom�

Page 267: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

C��� APPROFONDISSEMENT �

C���� Cycles de mise au point

Programmes Java

emacs prog�java On cre le texte source�javac prog�java On compile le source prog�java en lexcutable NomClasse�classjava NomClasse On excute le programme�emacs prog�java On corrige le source et on recommence jusqu� ce que +a marche�

Programmes C

emacs prog�c On cre le texte source�cc �o prog prog�c On compile le source prog�c en lexcutable prog�prog On excute le programme�

Textes LATEX

emacs memoire�tex On cre le texte source�latex memoire�tex On transforme le source memoire�tex� le rsultat est dans memoire�dvixdvi memoire�dvi On regarde � quoi le rsultat ressemble�emacs memoire�tex On corrige le source et on recommence jusqu� ce quils oit satisfaisant�

���dvips �o memoire�ps memoire�dvi On transforme memoire�dvi en un �chier PostScript�lpr �Pqms memoire�ps On imprime le rsultat sur limprimante recto�verso�lprm �Pqms imprimante user Pour stopper limpression de user

C����� Types de machines

Il y a deux types de machines Unix � l�X� des HP et des sations PC Linux� Chacunea un processeur di��rent� HP�PA pour les premi�res et Pentium II ou III pour lesPC� les �chiers ex�cutables sont donc di��rents sur ces deux types de machines� Toutl�environnement par d�faut fait que les commandes vont ex�cuter les ex�cutables debon type� Il faut noter que les �chiers des �l�ves eux se trouvent toujours au m�meendroit� car Unix permet de partager les �chiers entre machines di��rentes gr(ce � NFS!Network File System"� De m�me� toutes les imprimantes sont accessibles depuis toutemachine� En�n� il existe aussi des terminaux X qui n�ont pas de processeur !autre quela gestion locale de l��cran" et qui peuvent atteindre toute machine sur le r�seau�

C�� Approfondissement

C���� Syst�me de �chiers

R�pertoires

On les appelle aussi directories� Un r�pertoire est une bo�te qui peut contenir des�chiers et d�autres r�pertoires !comme les catalogues de MS�DOS� ou les dossiers duMacintosh"� Exemples de r�pertoires�

�users �bin �usr�local�bin

On d�signe les �chiers !et les r�pertoires" contenus dans un r�pertoire par� nom de r�per�toire�nom de �chier� Exemple� �bin�sh est le �chier sh contenu dans le r�pertoire �bin�Les r�pertoires sont organis�s en arbre� c�est���dire qu�ils sont tous contenus dans un

Page 268: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� ANNEXE C� INITIATION AU SYST�ME UNIX

r�pertoire appel� la racine� et d�sign� par �� Chaque r�pertoire contient deux r�pertoiressp�ciaux�

� dsigne le rpertoire lui�m�me�� dsigne le p�re du rpertoire

Exemples� �users�cie �� est le m�me r�pertoire que �users�cie � �users�cie ���est le m�me r�pertoire que �users�

Chaque utilisateur a un home�directory� C�est l�endroit ou il range ses �chiers� Lehome�directory a pour nom �users�cien�nom�Exemples� �users�cie��joffre� �users�cie��foch�

On peut aussi d�signer le home�directory d�un autre utilisateur par le nom de loginde l�utilisateur pr�c�d� d�un tilde !le caract�re �"� Exemple� �foch�

Noms de �chiers

Un nom de �chier qui commence par � est dit absolu� Il est interpr�t� en partant dela racine� et en descendant dans l�arbre� Un nom de �chier qui ne commence pas par �est relatif� Il est interpr�t� en partant du r�pertoire courant� Le r�pertoire courant estinitialement !au moment o$ vous vous connectez" votre home�directory�

Exemples� �users�cie��joffre�foo est un nom !ou chemin" absolu� bar est unnom relatif� Il d�signe un �chier appel� bar et situ� dans le r�pertoire courant� Le�chier exact dont il s�agit d�pend donc de votre r�pertoire courant�

Remarque� Le seul caract�re sp�cial dans les noms de �chiers est le slash �� Un nomde �chier peut avoir jusqu�� ��� caract�res� et contenir un nombre quelconque de points�

Commandes pour manipuler le syst�me de �chiers

� pwd a%che le r�pertoire courant� Exemple�

poly� pwd

�users�cie!�foch

� cd change le r�pertoire courant� Si on ne lui donne pas d�argument� on retournedans le home�directory� Exemple�

poly� cd ��

poly� pwd

�users�cie!

poly� cd

poly� pwd

�users�cie!�foch

� mkdir cr�e un nouveau r�pertoire� !presque" vide� Il ne contient que � et ��

� rmdir supprime un r�pertoire vide� Si le r�pertoire contient autre chose que � et�� �a ne marche pas�

� mv renomme un �chier� mais peut aussi le d�placer d�un r�pertoire � un autre�Exemple�

poly� cd

poly� mkdir foo

poly� emacs bar

Page 269: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

C��� APPROFONDISSEMENT ��

poly� mv bar foo�bar�

poly� cd foo

poly� pwd

�users�cie!�foch�foo

poly� ls

bar�

� rm �i foo supprime le �chier foo� attention il faut manipuler cette commandeavec pr�caution car on risque de d�truire un �chier utile et il est alors impossiblede le r�cup�rer par la suite�

� ls liste les �chiers et les r�pertoires qu�on lui donne en arguments� ou le r�pertoirecourant si on ne lui donne pas d�argument� ls ne liste pas les �chiers dont le nomcommence par � C�est pourquoi � et �� n�apparaissent pas ci�dessus�

Les droits d�acc�s

Chaque �chier a plusieurs propri�t�s associ�es� le propri�taire� le groupe propri�taire�la date de derni�re modi�cation� et les droits d�acc�s� On peut examiner ces propri�t�sgr(ce � l�option �lg de ls� Exemple�

poly� ls �lg

drw�r��r�� � foch cie! !�� Sep � �"�!� foo

�rw�r��r�� � foch cie! " Sep � �"�!� bar

nom du �chierdate de derni�re modif�

taillegroupe propritaire

propritairedroits des autres

droits du groupedroits du propritaire

type

Type � pour les �chiers� d pour les r�pertoires�

Droits du propri�tairer ou � droit de lire le �chier !r pour oui� � pour non"w ou � droit d��crire dans le �chierx ou � droit d�ex�cuter le �chier ou de visite pour un r�pertoire

Droits du groupe Comme les droits du propri�taire� mais s�applique aux gens quisont dans le groupe propri�taire�

Droits des autres Comme les droits du propri�taire� mais s�applique aux gens quisont ni le propri�taire� ni dans le groupe propri�taire�

Propri�taire Le nom de login de la personne � qui appartient ce �chier� Seul le pro�pri�taire peut changer les droits ou le groupe d�un �chier�

Groupe propri�taire Le nom du groupe du �chier� Les groupes sont des ensemblesd�utilisateurs qui sont �x�s par l�administrateur du syst�me�

Taille En octets�

Page 270: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� � ANNEXE C� INITIATION AU SYST�ME UNIX

Pour changer les droits d�un �chier� la commande est chmod� Exemples�chmod a�x foo ajoute !�" le droit d�ex�cution !x" pour tout le monde !all" au

�chier foochmod g�r bar enl�ve !�" le droit de lecture !r" pour les gens du groupe !group"

sur le �chier barchmod u�w gee enl�ve !�" le droit d��criture !w" pour le propri�taire !user" sur le

�chier gee

C���� Raccourcis pour les noms de �chiers

Il est ennuyeux d�avoir � taper un nom complet de �chier comme nabuchodonosor�Il est encore plus ennuyeux d�avoir � taper une liste de �chier pour les donner en argu�ments � une commande� comme� cc �o foo bar�c gee�c buz�c gog�c� Pour �viterces probl�mes� on peut utiliser des jokers !wildcards en anglais�"

Une �toile � dans un nom de �chier est interpr�t�e par le shell comme �n�im�porte quelle s�quence de caract�res qui ne commence pas par un point� Exemple�cc �o foo ��c�

Pour interpr�ter l��toile� le shell va faire la liste de tous les noms de �chiers du r�per�toire courant qui ne commencent pas par � et qui �nissent par �c Ensuite� il remplace��c par cette liste !tri�e par ordre alphab�tique" dans la ligne de commande� et ex�cutele r�sultat� c�est���dire par exemple� cc �o foo bar�c buz�c foo�c gee�c gog�c�

On a aussi le +� qui remplace un !et exactement un" caract�re quelconque� Parexemple� ls +� liste tous les �chiers� y compris ceux dont le nom commence par unpoint�

La forme �abcd� remplace un caract�re quelconque parmi a� b� c� d� En�n� �'abcd�remplace un caract�re quelconque qui ne se trouve pas parmi a� b� c� d�

Exemple� echo �users�� a%che la m�me chose que ls �users� !La commande echose contente d�a%cher ses arguments�"

Attention�

� C�est le shell qui fait le remplacement des arguments contenant un joker� Onne peut donc pas faire mv ��c ��bak� car le shell va passer � mv les argumentsfoo�c bar�c foo�bak bar�bak� et mv ne sait pas quel �chier remplacer�

� Attention aux espaces� Si vous tapez rm � �� le shell remplace l��toile par la listedes �chiers pr�sents� et ils seront tous e�ac�s� Si vous tapez rm ��� seuls les �chiersdont le nom �nit par un tilde seront e�ac�s�

Interlude� comment e�acer un �chier nomm� +�- On ne peut pas taper rm +� carle shell remplace +� par la liste de tous les �chiers du r�pertoire courant� On peut taperrm �i � qui supprime tous les �chiers� mais en demandant con�rmation � chaque �chier�On r�pond no � toutes les questions sauf rm! remove +�+� Autre m�thode� utiliser lesm�canismes de quotation !voir ci�dessous"�

C���� Variables

Le shell a des variables� Pour d�signer le contenu d�une variable� on �crit le nom dela variable pr�c�d� d�un dollar� Exemple� echo �HOME a%che le nom du home�directoryde l�utilisateur�

On peut donner une valeur a une variable avec la commande setenv�

poly� setenv foo bar

Page 271: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

C��� APPROFONDISSEMENT � �

poly� echo *foo

bar

Les valeurs des variables sont accessibles aux commandes lanc�es par le shell� L�en�semble de ces valeurs constitue l�environnement� On peut aussi supprimer une variablede l�environnement avec unsetenv�

Quelques variables d�environnement�

PRINTER Pour les commandes d�impression� Contient le nom de l�imprimante sur la�quelle il faut envoyer vos �chiers�

EDITOR Utilis�e par elm� polyaf� et beaucoup d�autres commandes� Contient le nom devotre �diteur de textes pr�f�r��

VISUAL La m�me chose qu�EDITOR�

SHELL Contient le nom de votre shell pr�f�r��

HOME Contient le nom de votre home�directory�

USER Contient votre nom de login�

LOGNAME La m�me chose que USER�

PATH Contient une liste de r�pertoires dans lesquels le shell va chercher les commandesex�cutables�

DISPLAY Contient le nom de la machine qui a%che�

C���� Le chemin dacc�s aux commandes

La variable PATH contient le chemin d�acc�s aux commandes� Le shell l�utilise pourtrouver les commandes� Il s�agit d�une liste de r�pertoires s�par�s par des !� La plupartdes commandes sont en fait des programmes� c�est���dire des �chiers qu�on trouve dansle syst�me de �chiers� Quand vous tapez ls� par exemple� le shell ex�cute le �chier�bin�ls� Pour trouver ce �chier� il cherche dans le premier r�pertoire du PATH un �chierqui s�appelle ls� S�il ne trouve pas� il cherche ensuite dans le deuxi�me r�pertoire etainsi de suite� S�il ne trouve la commande dans aucun r�pertoire du PATH� le shell a%cheun message d�erreur� Exemple�

poly� sl

sl� Command not found�

Exercice� Assurez�vous que �usr�games se trouve bien dans votre PATH�

C��� Quotation

Avec tous ces caract�res sp�ciaux� comment faire pour passer des arguments bizarres� une commande- Par exemple� comment faire a%cher un point d�interrogation suivid�une �toile et d�un dollar par echo- Le shell fournit des m�canismes pour ce faire� Cesont les quotations� Le plus simple est le backslash &� Il su%t de pr�c�der un caract�resp�cial d�un backslash� et le shell remplace ces deux caract�res par le caract�re sp�cialseul� Evidemment� le backslash est lui�m�me un caract�re sp�cial�

Attention� tout ceci est tr�s d�pendant de la machine et les exemples ci�dessous nesont pas garantis�

Exemples�

poly� echo ���*

Page 272: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� � ANNEXE C� INITIATION AU SYST�ME UNIX

�*

poly� echo ���������*

����*

Un autre moyen est d�inclure une cha�ne de caract�res entre apostrophes !simple quotes"�� Tout ce qui se trouve entre deux apostrophes sera pass� tel quel par le shell � lacommande� Exemple�

poly� echo '* ��'

* ��

En�n� on peut utiliser des guillemets !double quotes" �� Les guillemets se com�portent comme les apostrophes� � une exception pr�s� les dollars et les backslashes sontinterpr�t�s entre les guillemets� Exemple�

poly� echo �*HOME���

�users�cie!�foch��

Une technique utile� Quand on juxtapose deux cha�nes de caract�res quot�es� le shellles concat�ne� et elles ne forment qu�un argument� Exemple�

poly� echo �'�'�'

'�

Quant aux interactions plus compliqu�es !backslashes � l�int�rieur des guillemets�guillemets � l�int�rieur des apostrophes� etc�"� le meilleur moyen de savoir si �a donnebien le r�sultat attendu est d�essayer� La commande echo est bien utile dans ce cas�

Derni�re forme de quotation� )commande)� Le shell ex�cute la commande� lit lasortie de la commande mot par mot� et remplace )commande) par la liste de ces mots�Exemple�

poly� echo )ls)

Mail News bin foo g" lib misc marne�aux marne�dvi marne�log marne�tex

poly� ls �lg )which emacs)

�rwxr�xr�x � root system "�!�!� Dec �" ���� �usr�local�bin�emacs

La commande which cmd employ�e ci�dessus a%che sur sa sortie le nom absolu du�chier ex�cut� par le shell quand on lance la commande cmd�

poly� which emacs

�usr�local�bin�emacs

C��� Redirections et �ltres

Chaque commande a une entr�e standard� une sortie standard� et une sortie d�erreur�Par d�faut� l�entr�e standard est le clavier� la sortie standard est l��cran� et la sortied�erreur est aussi l��cran�

On peut rediriger la sortie standard d�une commande vers un �chier !caract�re �"�Le r�sultat de la commande sera plac� dans le �chier au lieu de s�a%cher sur l��cran�Exemple�

poly� ls �l foo

Le r�sultat de ls �l ne s�a%che pas � l��cran� mais il est plac� dans le �chier foo� Onpeut alors taper

poly� more foo

pour lire le �chier page par page�

Page 273: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

C��� APPROFONDISSEMENT � �

On peut aussi rediriger l�entr�e standard d�une commande !caract�re �"� La com�mande lira alors le �chier au lieu du clavier� Exemple�

poly� elm joffre �foo

envoie par mail � Joseph Jo�re le r�sultat de la commande ls �l de tout � l�heure�On peut aussi taper more �foo qui est �quivalent � more foo car more sans argu�

ment lit son entr�e standard et l�a%che page par page sur le terminal�

On peut aussi se passer du �chier interm�diaire gr(ce � un pipe !caract�re #"� Unpipe connecte directement la sortie standard d�une commande sur l�entr�e standardd�une autre commande� Exemple� pour a%cher page par page la liste des �chiers dur�pertoire courant� faire

ls �l � more

La panoplie compl�te des redirections est la suivante�

� change la sortie standard de la commande pour la placer dans un �chier�

� change l�entr�e standard de la commande pour la prendre dans un �chier�

�" place la sortie standard et la sortie erreur dans un �chier�

# branche la sortie standard de la commande de gauche sur l�entr�e standard de lacommande de droite�

#" branche la sortie standard et la sortie erreur de la commande de gauche sur l�entr�estandard de la commande de droite�

�� change la sortie standard pour l�ajouter � la �n d�un �chier existant�

��� place la sortie standard et la sortie erreur � la �n d�un �chier existant�

Remarques� Normalement� une redirection avec � sur un �chier qui existe d�j� e�acele contenu du �chier avant d�y placer le r�sultat de la commande� Il existe une optionqui dit au shell tcsh de refuser d�e�acer le �chier�

Le pipe avec #" est utile pour capturer tout ce qui sort d�une commande� Exemple�ls �R � #" more a%che page par page la liste de tous les �chiers du syst�me� sans queles messages d�erreur d�rangent l�a%chage�

Une ligne de commandes contenant des # s�appelle un pipe�line� Quelques com�mandes souvent utilis�es dans les pipe�lines sont�

more � la �n du pipe�line� a%che le r�sultat page par page� pour laisser le temps de lelire�

wc compte le nombre de caract�res� de mots et de lignes de son entr�e�

grep cherche dans son entr�e les lignes contenant un mot donn�� et les �crit sur sasortie�

sort lit toutes les lignes de son entr�e� les trie� et les �crit dans l�ordre sur sa sortie

tail �crit sur sa sortie les derni�res lignes de son entr�e�

head �crit sur sa sortie les premi�res lignes de son entr�e�

cat copie plusieurs �chiers sur sa sortie�

fold coupe les lignes de son entr�e � � caract�res et �crit le r�sultat sur sa sortie�

Page 274: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� � ANNEXE C� INITIATION AU SYST�ME UNIX

Exemples�

poly� cat glop buz toto

Concat�ne les �chiers glop et buz et place le r�sultat dans toto�

poly� wc �w �usr�dict�words

A%che le nombre de mots du dictionnaire Unix�

poly� grep gag �usr�dict�words � tail

A%che les �� derniers mots du dictionnaire qui contiennent la cha�ne gag�

C���� Processus

Si on lance une commande qui prend beaucoup de temps� on peut l�interrompre parControl�C� Ceci interrompt !d��nitivement" la commande� On peut aussi ex�cuter unecommande en t&che de fond� Le shell rend alors la main avant la �n de la commande�Pour le faire� on ajoute un " � la �n de la commande�

poly� cc �o grosprogramme grosfichier�c %

Cette commande lance le compilateur cc en parall�le avec le shell� On reprend la mainimm�diatement� sans attendre la �n de l�ex�cution de la commande� On peut donc taperd�autres commandes pendant que la pr�c�dente d�ex�cute� La commande ps ou ps �xmontre o$ en sont les t(ches de fond�

poly� ps

PID TT STAT TIME COMMAND

��! p� S � �usr�local�bin�tcsh

�"�� p� S �� cc �o grosprogramme grosfichier�c

���� p� R � ps

Unix est un syst�me multi�t&ches� c�est���dire qu�il peut ex�cuter plusieurs programmes� la fois� Un processus est un programme en train de s�ex�cuter� La commande psa%che la liste des processus que vous avez lanc�s� Chaque processus a un num�ro� C�estla colonne PID ci�dessus� Le shell cr�e un nouveau processus pour ex�cuter chaquecommande� Pour une commande �normale !sans ""� il attend que le processus termine�indiquant que la commande a �ni de s�ex�cuter� Pour une commande en t(che de fond!avec ""� le shell n�attend pas� On peut interrompre !�tuer " un processus avant la �n�avec la commande kill �� !plus le num�ro du processus"�

poly� kill �� �"��

poly� ps

PID TT STAT TIME COMMAND

��! p� S � �usr�local�bin�tcsh

��!� p� R � ps

C���� Programmation du shell

Le shell peut aussi ex�cuter des commandes prises dans un �chier� Un �chier conte�nant des commandes pour le shell est appel� un script� C�est en fait un programme �critdans le langage du shell� Ce langage comprend non seulement les commandes que nousavons d�j� vues� mais aussi des structures de contr)le !constructions conditionnelles etboucles"� � Pour �tre un script� un �chier doit commencer par la ligne�

�� Il existe en fait plusieurs shells� ayant des langages de commandes di��rents� Jusqu�ici� on a priscomme exemple le shell csh et sa variante tcsh� Pour la programmation du shell� nous allons utiliserle shell sh� qui a un meilleur langage de commandes� Ce que nous avons vu jusqu�ici s�applique aussibien � sh qu�� csh� � l�exception de setenv et de certaines redirections�

Page 275: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

C��� APPROFONDISSEMENT � �

�&�bin�sh

Il doit aussi avoir le droit d�ex�cution !bit x"� !Le ��bin�sh sur la premi�re ligneindique que ce script doit �tre ex�cut� par le shell sh�"

Structures de contr�le

� for var in liste de cha$nes � do commandes � doneA�ecte successivement � la variable de nom var chaque cha�ne de caract�res dansla liste de cha$nes� et ex�cute les commandes une fois pour chaque cha�ne� Rappel��var acc�de � la valeur courante de var� La partie commandes est une suite decommandes� s�par�es par des � ou des retours � la ligne� !Tous les � dans cettesyntaxe peuvent aussi �tre remplac�s par des retour � la ligne�"

Exemple� for i in �� do echo �i� done a%che tous les �chiers du r�pertoirecourant� un par ligne�

� if commande � then commandes � else commandes � fiEx�cute l�une ou l�autre des listes de commandes� suivant que la premi�re com�mande a r�ussi ou non !voir ci�dessous"�

� while commande � do commande � doneEx�cute les commandes de mani�re r�p�t�e tant que la premi�re commande r�ussit�

� case cha$ne inpattern commande ��� � �pattern commande ��

esacEx�cute la premi�re commande telle que la cha$ne est de la forme pattern� Unpattern est un mot contenant �ventuellement les constructions �� +� �a�d�� avecla m�me signi�cation que pour les raccourcis dans les noms de �chiers� Exemple�

case *var in

#��$� � echo 'Nombre'��

#a�zA�Z$� � echo 'Mot'��

� � echo 'Autre chose'��

esac

Code de retour

On remarque que la condition des commandes if et while est une commande�Chaque commande renvoie un code de retour !qui est ignor� en utilisation normale"�Si le code est �� la commande a r�ussi� sinon� la commande a �chou�� Par exemple� lecompilateur cc renvoie un code d�erreur non nul si le �chier compil� contient des erreurs�ou s�il n�existe pas�

Les commandes if et while consid�rent donc le code de retour � comme �vrai � ettout autre code comme �faux �

Il existe une commande test� qui �value des expressions bool�ennes pass�es enargument� et renvoie un code de retour en fonction du r�sultat� Elle est bien utile pourles scripts� Exemple�

if test *var � foo

then echo 'La variable vaut foo'

else echo 'La variable ne vaut pas foo'

fi

Page 276: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� ANNEXE C� INITIATION AU SYST�ME UNIX

Variables

Dans les scripts� on peut utiliser des variables d��nies � l�ext�rieur !avec setenv"�mais aussi d��nir ses propres variables locales au script� On donne une valeur � unevariable avec une commande de la forme nom�de�variable � valeur�

On a aussi des variables sp�ciales� initialis�es automatiquement au d�but du script��� La liste de tous les arguments pass�s au script�� Le nombre d�arguments pass�s au script�� � ��� � � � Les arguments pass�s au script��+ Le code de retour de la derni�re commande lanc�e��� Le num�ro de process de la derni�re commande en t(che de fond��� Le num�ro de process du shell lui�m�me�

Commandes internes

Certaines commandes du shell ne sont pas des programmes mais des commandesinternes� Elles sont directement reconnues et ex�cut�es par le shell� Un exemple decommande interne est cd� C�est le r�pertoire courant du shell qui est modi�� par cd� cequi signi�e que le script suivant�

�& �bin�sh

cd *�

ne marche pas� car le shell lance un autre shell pour ex�cuter le script� C�est ce sous�shell qui change son r�pertoire courant� et ce changement est perdu quand le sous�shellmeurt�

Fichier de d�marrage

Il existe un script sp�cial� qui est ex�cut� au moment o$ on se connecte� Ce script estcontenu dans le �chier �HOME��login� C�est ce �chier qui vous dit s�il y a de nouveauxmessages dans polyaf� si vous avez du courrier� etc � � � � Chacun peut ainsi personna�liser son environnement au d�but de chaque session� On a quelques informations surla �customization en utilisant le menu Aide !bouton de droite de la souris sur fondd��cran"�

C�� Unix et le r�seau de l�X

Le r�seau Internet relie pr�s de ��� millions d�utilisateurs dans le monde en juillet��� ce nombre est en croissance tr�s rapide il a �t� multipli� par � en � ans� Avec lesyst�me Unix� les machines s�interfacent facilement � l�Internet� certains services sontaussi disponibles sur Macintosh ou PC� Le r�seau local de l�X contient plusieurs sous�r�seaux pour les �l�ves� pour les laboratoiress et pour l�administration� Le r�seau des�l�ves relie les chambres� les salles de TD !salles Dec� Sun ou Hp"� la salle DEA� lamachine sil !passerelle vers l�Internet"�

Physiquement� dans une chambre� on connecte sa machine par un petit cable munid�une prise RJ��� Une ligne en paires torsad�es ��Base&T part de la chambre vers unebo�te d�interconnexion avec une �bre optique FDDI !Fiber Data Distributed Interface"qui arrive dans chaque casert� La �bre repart des caserts vers les salles de TD et les autresmachines centrales� Le tout est certi�� � �� M�ga bit&s� et fonctionne vraisemblablement� ��� Mbit&s� Dans une salle de TD� les stations Unix et les imprimantes sont connect�esau r�seau� Pour les Mac ou PC� une prise di��rente existe devant chaque chaise�

Logiquement� la partie ��Base&T supporte le protocole Ethernet � �� Mbit&s !pourles PC" ou le protocole PhoneNet � ��� kbit&s !pour les Mac"� Tout est transparent pour

Page 277: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

C��� UNIX ET LE R�SEAU DE L X �

l�utilisateur� qui signale en d�but d�ann�e au Centre Info s�il d�sire une prise PhoneNetou Ethernet dans sa chambre� L�interconnexion avec la �bre optique sera alors positionn�correctement�

Toute machine a une adresse Internet� de chi�res !���������"��� pour poly� ousymbolique !poly�polytechnique�fr" qui sont les m�mes adresses que pour le courrier�lectronique� A l�int�rieur de l�X� le su%xe polytechnique�fr est inutile� Les PC de lasalle �� ont des noms d�os !radius� cubitus� � � � "� les stations Hp de la salle �� desnoms de poissons !carpe� lieu� � � � "� celles de la salle � des noms de voitures !ferrari�bugatti� � � � " Les PC de la salle �� ont des noms de d�partement !loire� marne� � � � "�Les Mac obtiennent leur adresse Internet dynamiquement de la boite d�interconnexion �Ethernet� C�est en principe automatique� Il peut �tre n�cessaire de se servir de l�utilitaireMacTCP pour donner la zone � laquelle on appartient� par exemple son nom de casert� le num�ro d��tage� Pour les PC� il faut rentrer l�adresse Internet manuellement� Dansles salles TD� elle est �crite en face de chaque chaise�

Voici une liste de services courants !cf� la r�f�rence ��� pour beaucoup plus ded�tails"�

telnet Pour se connecter sur une autre machine et y ex�cuter des commandes�

rlogin Idem�

ftp Pour transf�rer des �chiers depuis une autre machine� Sur certaines machines� onpeut faire des transferts sans y avoir un compte� en se connectant sous le nomanonymous� d�o$ le nom de �anonymous FTP � ou �FTP anonyme � donn� � cettem�thode de transfert de �chiers�

xrn Pour lire les �News !le forum � l��chelle mondiale"�

xwais Pour interroger des bases de donn�es par mots�cl��

xarchie Pour obtenir les sources domaine public sur le r�seau�

netscape Pour consulter les sites multi�media du World Wide Web� Quelques adressesqui peuvent vous �tre utiles

http���www�polytechnique�fr� le serveur o#ciel de lX�http���www�polytechnique�fr�eleves� le serveur des l�ves de lX�http���www�polytechnique�fr�bibliotheque�html� la biblioth�que de lX�http���www�ens�fr� le serveur de lENS�http���www�stanford�edu� Stanford University�http���www�labri�u�bordeaux�fr� le Labri de Bordeaux�http���www�meteo�fr� Mto France�http���www�sncf�fr� la SNCF�http���www�delta�air�com� Delta Air Lines�http���www�airfrance�fr� Air France�http���pauillac�inria�fr�caml� les langages Caml�http���www�research�digital�com�SRC�modula���html� Modula���http���java�sun�com� et Java�http���inferno�bell�labs�com�inferno� syst�me Inferno�http���www�lmet�fr�Homefr�html la librairie Le Monde en Tique�http���www�technical�powells�portland�or�us� Powell�s Technical Books�http���www�radio�france�fr� Radio France�http���www�sdv�fr�orthonet�recherche�html Dictionnaire de langue fran+aise�http���www�msnbc�com� MSNBC�

Page 278: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� ANNEXE C� INITIATION AU SYST�ME UNIX

http���www�groups�dcs�st�and�ac�uk��"Ehistory�Mathematicians�Godel�html

une biographie de Kurt G,del�http���www�cs�faculty�stanford�edu� knuth� la page de D� Knuth�http���www�netfrance�com�Libe� le journal Libration�http���www�mapquest�com� un atlas interactif des USA�http���www�apple�com� Apple computers�http���www�cern�ch� le CERN � Gen�ve�http���www�culture�fr�louvre� le Louvrehttp���www�bordeaux�wines�com�CIVB�Francais�Encyclopedie�

Les vins de Bordeauxhttp���www�yahoo�com� un logiciel de recherche de siteshttp���webcrawler�com� une belle araigne chercheuse�http���altavista�digital�com� lindex automatique de lInternet

irc Pour perdre son �nergie � discuter avec le monde entier�

eudora Pour lire son courrier sur Mac�

fetch Pour faire ftp depuis les Mac�

Certains services !connexions internes� courrier� news" sont disponibles depuis toutemachine du r�seau des �l�ves� Les autres !et en particulier les connexions � l�Internet"ne sont disponibles que depuis la machine sil� Il convient donc d�ouvrir une session sursil pour acc�der � tous les services de l�Internet�

C� Bibliographie Unix

� Utiliser Unix

�� Documentation Ultrix� Une dizaine de volumes� deux exemplaires� en salle Sun ouDec� Contient des manuels de r�f�rence tr�s techniques� mais aussi de bon guidespour d�butants� �Getting started with Unix � �Doing more with Unix � �SunView �beginner�s guide � �Mail and messages� beginner�s guide � �Basic troubleshooting �

�� Steve Bourne� �The Unix system � Addison�Wesley� Traduction fran�aise� �Le sys�t�me Unix � Inter�ditions� Une vue d�ensemble du syst�me Unix� Les chapitres surl��dition et le traitement de texte sont d�pass�s�

� Programmer sous Unix

� Brian Kernighan� Rob Pike� �The Unix programming environment � Addison�Wesley� Traduction fran�aise� �L�environnement de la programmation Unix � In�ter�ditions� Une autre vue d�ensemble du syst�me Unix� plus orient�e vers la pro�grammation en C et en shell�

�� Jean�Marie Ri7et� �La programmation sous Unix � Programmation en C et enshell !pas mal"�

� Traitement de texte

�� Leslie Lamport� �LATEX user�s guide and reference manual � Addison�Wesley� ���Tout sur le traitement de texte LATEX� Un exemplaire se trouve dans la salle Sun�

�� Donald E� Knuth� �The TEXbook � Addison�Wesley� ���� Tout� absolument toutsur le traitement de texte TEX� LATEX est en fait une extension de TEX� un peuplus simple � utiliser� mais beaucoup de commandes sont communes aux deux� etnon document�s dans ��� Un exemplaire se trouve dans la salle Sun�

Page 279: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

C�� BIBLIOGRAPHIE UNIX � �

�� Raymond Seroul� �Le petit livre de TEX � Inter�ditions� Petit sous�ensemble de ���plus accessible� cependant�

�� Francis Borceux� �LATEX� la perfection dans le traitement de texte � !Hum-" Edi�tions Ciaco� Resuc�e de ��� Moins complet et gu�re plus accessible�

� Le langage C

� Brian Kernighan� Dennis Ritchie� �The C programming language � Prentice�Hall�Traduction fran�aise� �Le langage C � Inter�ditions� Le livre de r�f�rence sur lelangage C�

��� Samuel Harbison� Guy Steele� �C� a reference manual � Une autre bonne descrip�tion du langage C�

� Utiliser le r�seau

��� Brendan P� Kehoe� �Zen and the art of the Internet + A beginner�s guide to theInternet � !Non publi��" Un exemplaire se trouve en salle Sun�

��� Ed Krol� �The whole Internet user�s guide * catalog � O�Reilly * Associates� �����

Page 280: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� ANNEXE C� INITIATION AU SYST�ME UNIX

Page 281: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

BIBLIOGRAPHIE ��

Bibliographie

��� Harold Abelson� Gerald J� Sussman� Structure and Interpretation of ComputerPrograms� MIT Press� ����

��� Adobe Systems Inc�� PostScript Language� Tutorial and Cookbook� Addison Wesley�����

��� Al V� Aho� Ravi Sethi� Je� D� Ullman� Compilers� Principles� Techniques� andTools� Addison Wesley� ��� En fran�ais� Compilateurs � principes� techniques etoutils� trad� par Pierre Boullier� Philippe Deschamp� Martin Jourdan� Bernard Lo�rho� Monique Mazaud� Inter�ditions� ����

��� Henk Barendregt� The Lambda Calculus� Its Syntax and Semantics� North Holland�����

��� Dani�le Beauquier� Jean Berstel� Philippe Chr�tienne� El�ments d�algorithmique�Masson� Paris� �����

�� Jon Bentley� Programming Pearls� Addison Wesley� ���

� � Claude Berge� La th�orie des graphes et ses applications� Dunod� Paris� ���

�� Jean Berstel� Jean�Eric Pin� Michel Pocchiola� Math�matiques et Informatique�McGraw�Hill� �����

��� Noam Chomsky� Marcel Paul Sch0tzenberger� The algebraic theory of context freelanguages dans Computer Programming and Formal Languages� P� Bra�ort� D� Hir�schberg ed� North Holland� Amsterdam� ���

���� Thomas H� Cormen� Charles E� Leiserson� Ronald L� Rivest� Algorithms� MITPress� �����

���� Patrick Cousot� Introduction � l�algorithmique et � la programmation� Ecole Poly�technique� Cours d�Informatique� ���

���� Shimon Even� Graph Algorithms� Computer Science Press� Potomac� Md� �� ��

���� Adele Goldberg� Smalltalk��'� the language and its implementation� Addison�Wesley ����

���� David Goldberg� What Every Computer Scientist Should Know About Floating�Point Arithmeticc� Computing Surveys� ��!�"� Mars �����

���� Gaston H� Gonnet� Riccardo Baeza�Yates� Handbook of Algorithms and Data Struc�tures� In Pascal and C� Addison Wesley� �����

Page 282: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� BIBLIOGRAPHIE

��� Mike J� C� Gordon� Robin Milner� Lockwood Morris� Malcolm C� Newey� Ch�ris P� Wadsworth� A metalanguage for interactive proof in LCF� In �th ACM Sym�posium on Principles of Programming Languages� �� � ACM Press� New York�

�� � Ron L� Graham� Donald E� Knuth� Oren Patashnik� Concrete mathematics� a foun�dation for computer science� Addison Wesley� ����

��� Samuel P� Harbison� Modula��� Prentice Hall� �����

���� John H� Hennessy� David A� Patterson� Computer Architecture� A QuantitativeApproach� Morgan Kaufmann Publishers� Inc� � �����

���� Kathleen Jensen� Niklaus Wirth� PASCAL user manual and report � ISO PASCALstandard� Springer� ����� !��re �dition en �� �"�

���� Gerry Kane� Mips� RISC Architecture� MIPS Computer Systems� Inc�� PrenticeHall� �� �

���� Brian W� Kernighan� Dennis M�Ritchie� The C programming language� PrenticeHall� �� � En fran�ais� Le Langage C� trad� par Thierry Bu�enoir� Manuels infor�matiques Masson� �me tirage� �����

���� Brian W� Kernighan� PIC!a language for typesetting graphics� Software Practice *Experience �� !���"� �����

���� Dick B� Kieburtz� Structured Programming And Problem Solving With Algol W�Prentice Hall� �� ��

���� Stephen C� Kleene� Introduction to Metamathematics� North Holland� �me �dition��� �� !��re en ����"�

��� Donald E� Knuth� The TEXbook� Addison Wesley� ����

�� � Donald E� Knuth� The Metafont book� Addison Wesley� ���

��� Donald E� Knuth� Fundamental Algorithms� The Art of Computer Programming�vol �� Addison Wesley� ���

���� Donald E� Knuth� Seminumerical algorithms� The Art of Computer Programming�vol �� Addison Wesley� ����

���� Donald E� Knuth� Sorting and Searching� The Art of Computer Programming� vol�� Addison Wesley� �� ��

���� Leslie Lamport� LATEX� User�s guide ( Reference Manual� Addison Wesley� ���

���� Butler W� Lampson et Ken A� Pier� A Processor for a High�Performance PersonalComputer� Xerox Palo Alto Research Center Report CSL����� ��� !aussi dansProceedings of Seventh Symposium on Computer Architecture� SigArch&IEEE� LaBaule� Mai ���� pp� ������

���� Jan van Leeuwen� Handbook of theoretical computer science� volumes A et B� MITpress� �����

���� M� Lothaire� Combinatorics on Words� Encyclopedia of Mathematics� CambridgeUniversity Press� ����

���� Udi Manber� Introduction to Algorithms� A creative approach� Addison Wesley� ���

Page 283: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

BIBLIOGRAPHIE ��

��� Bob Metcalfe� D� Boggs� Ethernet� Distributed Packet Switching for Local ComputerNetworks� Communications of the ACM ��� � Juillet �� � pp ��������

�� � Robin Milner� A proposal for Standard ML� In ACM Symposium on LISP andFunctional Programming� pp ����� � ���� ACM Press� New York�

��� Robin Milner� Mads Tofte� Robert Harper� The de�niton of Standard ML� TheMIT Press� �����

���� Greg Nelson� Systems Programming with Modula��� Prentice Hall� �����

���� Eric Raymond� The New Hacker�s Dictionary� dessins de Guy L� Steele Jr�� MITPress �����

���� Brian Randell� L� J� Russel� Algol �' Implementation� Academic Press� New York�����

���� Martin Richards� The portability of the BCPL compiler� Software Practice andExperience ���� pp� ������� �� ��

���� Martin Richards� Colin Whitby�Strevens� BCPL � The Language and its Compiler�Cambride University Press� �� ��

���� Denis M� Ritchie et Ken Thompson� The UNIX Time�Sharing System� Communi�cations of the ACM� � � � Juillet �� �� pp ���� � !aussi dans The Bell SystemTechnical Journal� � �� Juillet�Aout �� "�

���� Hartley Rogers� Theory of recursive functions and e�ective computability� MITpress� �� � !�dition originale McGraw�Hill� �� "�

��� A� Sainte�Lagu1� Les r�seaux ou graphes�� M�moire des Sciences Math�matiques!�"� ����

�� � Bob Sedgewick� Algorithms� �nd edition� Addison�Wesley� ��� En fran�ais� Algo�rithmes en langage C� trad� par Jean�Michel Moreau� InterEditions� �����

��� Ravi Sethi� Programming Languages� Concepts and Constructs� Addison Wesley�����

���� Bjarne Stroustrup� The C)) Programming Language� Addison Wesley� ���

���� Robert E� Tarjan� Depth First Search and linear graph algorithms� Siam Journal ofComputing� �� pages ������ �� ��

���� Chuck P� Thacker� Ed M� McCreight� Butler W� Lampson� R� F� Sproull�D� R� Boggs� Alto� A Personal Computer� Xerox�PARC� CSL� ����� �� � !aussidans Computer Structures� Readings and Examples� nd edition� par Siewoiorek�Bell et Newell"�

���� Pierre Weis� The Caml Reference Manual� version ����� Rapport technique ����INRIA� Rocquencourt� �����

���� Pierre Weis� Xavier Leroy� Le langage Caml� InterEditions� �����

Page 284: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

�� BIBLIOGRAPHIE

Page 285: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

TABLE DES FIGURES ��

Table des �gures

� Bornes sup�rieures des nombres entiers � � � � � � � � � � � � � � � � � � � ��� Valeurs sp�ciales pour les �ottants IEEE � � � � � � � � � � � � � � � � � � ��� Formats des �ottants IEEE � � � � � � � � � � � � � � � � � � � � � � � � � ��

��� Exemple de tri par s�lection � � � � � � � � � � � � � � � � � � � � � � � � � ����� Exemple de tri bulle � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��� Exemple de tri par insertion � � � � � � � � � � � � � � � � � � � � � � � � � ����� Un exemple de table pour la recherche en table � � � � � � � � � � � � � � ����� Hachage par collisions s�par�es � � � � � � � � � � � � � � � � � � � � � � � ���� Hachage par adressage ouvert � � � � � � � � � � � � � � � � � � � � � � � � �

��� Appels r�cursifs pour fib��� � � � � � � � � � � � � � � � � � � � � � � � � � ���� Les tours de Hanoi � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ����� Flocons de von Koch � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ����� La courbe du Dragon � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ����� Partition de Quicksort � � � � � � � � � � � � � � � � � � � � � � � � � � � � ��

��� Ajout d�un �l�ment dans une liste � � � � � � � � � � � � � � � � � � � � � � ���� Suppression d�un �l�ment dans une liste � � � � � � � � � � � � � � � � � � ���� File g�r�e par un tableau circulaire � � � � � � � � � � � � � � � � � � � � � ���� File d�attente impl�ment�e par une liste � � � � � � � � � � � � � � � � � � ���� Pile d��valuation de l�expression dont le r�sultat est ��� � � � � � � � � � �� Queue d�une liste � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �� Concat�nation de deux listes par Append � � � � � � � � � � � � � � � � � � �� Concat�nation de deux listes par Nconc � � � � � � � � � � � � � � � � � � ��� Transformation d�une liste au cours de nReverse � � � � � � � � � � � � � � ����� Liste circulaire gard�e � � � � � � � � � � � � � � � � � � � � � � � � � � � � �

��� Un exemple d�arbre � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���� Repr�sentation d�une expression arithm�tique par un arbre � � � � � � � � ����� Repr�sentation en arbre d�un tas � � � � � � � � � � � � � � � � � � � � � � ����� Repr�sentation en tableau d�un tas � � � � � � � � � � � � � � � � � � � � � ����� Ajout dans un tas � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���� Suppression dans un tas � � � � � � � � � � � � � � � � � � � � � � � � � � � ���� Exemple d�arbre de d�cision pour le tri � � � � � � � � � � � � � � � � � � � ���� Ajout dans un arbre de recherche � � � � � � � � � � � � � � � � � � � � � � ����� Rotation dans un arbre AVL � � � � � � � � � � � � � � � � � � � � � � � � � ������� Double rotation dans un arbre AVL � � � � � � � � � � � � � � � � � � � � � ������� Exemple d�arbre ����� � � � � � � � � � � � � � � � � � � � � � � � � � � � � ������� Eclatement d�arbres ����� � � � � � � � � � � � � � � � � � � � � � � � � � � ������� Arbres bicolores � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���

��� Le graphe de De Bruijn pour k � � � � � � � � � � � � � � � � � � � � � � ���

Page 286: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� TABLE DES FIGURES

��� Le graphe des diviseurs� n � �� � � � � � � � � � � � � � � � � � � � � � � � ������ Un exemple de graphe et sa matrice d�adjacence � � � � � � � � � � � � � � ������ Un graphe et sa fermeture transitive � � � � � � � � � � � � � � � � � � � � ������ L�e�et de l�op�ration �x� les arcs ajout�s sont en pointill� � � � � � � � � ���� Une arborescence et son vecteur pere � � � � � � � � � � � � � � � � � � � � ����� Une arborescence pr��xe � � � � � � � � � � � � � � � � � � � � � � � � � � � ����� Emboitement des descendants dans une arborescence pr��xe � � � � � � � ������ Une arborescence des plus courts chemins de racine �� � � � � � � � � � � ������� Ex�cution de l�algorithme de Tr�maux � � � � � � � � � � � � � � � � � � � ������� Les arcs obtenus par Tr�maux � � � � � � � � � � � � � � � � � � � � � � � � �� ���� Composantes fortement connexes du graphe de la �gure ���� � � � � � � � ������ Un exemple de sous�arborescence � � � � � � � � � � � � � � � � � � � � � � ������� Les points d�attaches des sommets d�un graphe � � � � � � � � � � � � � � ���

�� Arbre de d�rivation de aabbabab � � � � � � � � � � � � � � � � � � � � � � � ���� Arbre de d�rivation d�une expression arithm�tique � � � � � � � � � � � � �� �� Arbre de syntaxe abstraite de l�expression � � � � � � � � � � � � � � � � � ��

�� File de caract�res � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �� �� Adresse d�un caract�re par base et d�placement � � � � � � � � � � � � � � �� �� Compilation s�par�e � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �� D�pendances dans une compilation s�par�e � � � � � � � � � � � � � � � � � �� D�pendances dans un Make�le � � � � � � � � � � � � � � � � � � � � � � � �� � Un exemple de graphe acyclique � � � � � � � � � � � � � � � � � � � � � � � � � � D�pendances entre modules Caml � � � � � � � � � � � � � � � � � � � � � � � �

�� Un graphe sym�trique et l�un de ses arbres recouvrants � � � � � � � � � � ���� Un arbre recouvrant de poids minimum � � � � � � � � � � � � � � � � � � ���� Huit reines sur un �chiquier � � � � � � � � � � � � � � � � � � � � � � � � � ���� Un graphe aux arcs valu�s � � � � � � � � � � � � � � � � � � � � � � � � � � ��

A�� Conversions implicites � � � � � � � � � � � � � � � � � � � � � � � � � � � � ���

Page 287: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

INDEX �

Index

� � ���� � ����� � �� , � �� � � ���� � �� � ��� � ���

abs� ���Ackermann� � a�ectation� �� ajouter

dans une �le� �dans une liste� �

al�atoire� ��� ��Alto� ��analyse

ascendante� ���descendante� ��

analyse syntaxique� ���anc�tre� ���appel par valeur� �� ���arborescence� ���

de Tr�maux� ���des plus courts chemins� ���pr��xe� ���sous�arborescence� ���

arbre� �impl�mentation� ��impression� �

arbre binaire� �arbre de recherche� �arbres �quilibr�s� ���

arbres ���� ���arbres ������ ���arbres AVL� ���arbres bicolores� ���rotations� ���

arc� ���de retour� ��� ���transverse� ��� ���

argument fonctionnel� ���attache� ���

begin� ���

Bentley� ��binaires relogeables� �bloc� ���BNF

Caml� ���Java� ���

bonjour� ���bool� ���boolean� ���bool�ens� ���� ���break� ���byte� ���

C,,� ��Caml� �� ���� ��canRead� ���canWrite� ���caract�res� ���� ���carr� magique� ���� ���cast� ��catch� ���cha�nage� �cha�ne de caract�res� ��� ���� ���� ���char� ���char� ���chemin� ���

calcul� ��plus court� ���

class� ���classe� ���

clone� ��copie� ��sous�classe� ��

close� ���collision� ��commentaire� ���� ���compilation� ���compilation s�par�e� �composante

fortement connexe� �� � ���constante� ���conversions� ��� ���

explicites� ��courbe du dragon� ��

Page 288: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

� INDEX

De Bruijn� ���Depth First Search� ���d�rivation� ���descendant� ���dessins� ��� ��Divide and Conquer� �� � do� ���double� ���dragon� ��

e�et de bord� ��end� ���End�of�file� �� enregistrement� ���ensembles� �entiers� ��� ���� ���EOF� ���Eratosth�ne� erreurs� ��espacement� ����valuation d�expressions� �exceptions� ��exit� ���expressions� ���

a�ectation� �� bits� ���valuation� ���incr�mentation� ��

expressions arithm�tiques� ���

factorielle� ��false� ���fermeture transitive� ���

calcul� �� exemple� ���

feuille� �Fibonacci� ��

it�ratif� ��chier� ���� �� File� ����le� �� ���

d�attente� �de caract�res� ���de priorit�� ��gard�e� �vide� �

�ls� ���finally� ���float� ���float� ����ocon de von Koch� ��fonction� ���� ��fonction ��� �fonction de Morris� �

for� ���� ��fractales� ��fusion� �

glouton� � G/del� �goto� ���grammaires� ���graphe� ���

de De Bruijn� ���fortement connexe� ��orient�� ���sym�trique� ���

graphique� ��� ��

hachage� ��adressage ouvert� �multiple� �

hacker� ��Hanoi� ��heap� ��Heapsort� ��Hennessy� ��Hoare� ��

identi�cateur� ���� ���IEEE� ��if� ���incr�mentation� �� ind�cidable� �int� ���int� ���interclassement� �interface� �� ��� ��

Kernighan� ��� ��Kleene� ��Knuth� ��Koch� ��Kruskal� � �

LATEX� ��let rec� ���librairies� �liste

de successeurscha�n�e� ��

liste� �de successeurs� �� des nombres premiers� gard�e� image miroir� vide� �

litt�ral� ���

Page 289: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

INDEX ��

LL!�"� ���long� ���LR!�"� ���

MacCarthy� �Make�le� �Maple� �� �� ��match� ���� ���matrice

d�adjacence� ���produit� ���

maxint� ��m�thode� ���Milner� ���ML� ���module� �� ��� ��Morris� �mots cl�s� ���mots r�serv�s� ���mutable� ���

n�tuplets� ���Nelson� ��noeud� �noeud interne� �nombre al�atoire� ��� ��nombres �ottants� ��num�rotation

de Tr�maux� ���pr��xe� ���

Objet� ���Omega� �� �� �� op�rateurs� ���ordre in�xe� ���ordre post�xe� ���ordre pr��xe� ���

parcoursen largeur� ���en profondeur� ���

Patterson� ��p�re� ���pile� �� ��plus courts chemins� ��point d�attache� ���� ���point�virgule� �� point�virgule en Java� ��polymorphisme� ���port�e des variables� ���post�x�e

notation� �PostScript� ��

pr�d�cesseur� ���printf� �� � �� proc�dure� ���� �� profondeur� ���programmation dynamique� ��

QuickDraw� ��Quicksort� ��

racine� �� ���raise� ��rand� ��random� ��read� ���read�line� �� recherche

dans une liste� �dichotomique� ��en table� ��par interpolation� ��

record� ���� ���r�cursivit� crois�e� ��r�els� ��� ���� ���ref� ���� ���ref

a�ectation� ���r�f�rences� ���r�sultat d�une fonction� ���return� ���rien� ���RISC� ��Ritchie� ��Rogers� ��

sac � dos� ��Scheme� ��Sedgewick� ��sentinelle� ��� ��s�parateur� ���short� ���sommet� ���sous�s�quences� �spell� ��srand� ��Stallman� ��String� ���string� ���successeur� ���super� �� supprimer

dans une �le� �dans une liste� dans une pile� �

surcharge� ��

Page 290: Algorithmes et Programmation - Ecole Polytechniquemast.free.fr/Fiifo5_06/Algo/Algo et Programmation... · Indcidabilit de la terminaison Pro cdures rcursiv es F ractales Quic ksort

��� INDEX

switch� ���syntaxe

abstraite� ��Caml� ���concr�te� ��Java� ���

tableauxdimension� ���taille� ���� ��

Tarjan� ���� �� tas� ��TEX� ��TGiX� ��this� ���throw� ���throws� ���tours de Hanoi� ��trace� ���Tr�maux� ���tri

borne inf�rieure� ��bulle� �fusion� �Heapsort� ��insertion� �Quicksort� ��s�lection� ��Shell� ��topologique� ��

triangle de Pascal� ��true� ���try� ��try� ���Turing� �type� ���type

d�clar�� ���enregistrement� ����num�r�� ���chier� ���polymorphe� ���somme� ���string� ���union� ���

type abstraits� ���

union� ���unit� ���Unix� ��

variablesglobales� ���� ���locales� ���� ���

vect� ���vecteur

pere� ���vecteurs� ���virgule �xe� ��virgule �ottante� ��void� ���

while� ��while� ���Wirth� ��World Wide Web� �� � write� ���