Arbres tournois, tas-max

Documents pareils
Les arbres binaires de recherche

Les deux points les plus proches

1 Recherche en table par balayage

ARBRES BINAIRES DE RECHERCHE

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Arbres binaires de recherche

Java Licence Professionnelle CISII,

Ensimag 1ère année Algorithmique 1 Examen 2ième session 24 juin Algorithmique 1

I- Définitions des signaux.

Examen Médian - 1 heure 30

Recherche dans un tableau

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

Quelques Algorithmes simples

Chapitre 7. Récurrences

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

SUPPORT DE COURS. Dr. Omari Mohammed Maître de Conférences Classe A Université d Adrar Courriel : omarinmt@gmail.com

Distribution Uniforme Probabilité de Laplace Dénombrements Les Paris. Chapitre 2 Le calcul des probabilités

Initiation à la programmation en Python

Limites finies en un point

INF601 : Algorithme et Structure de données

1. Structure d'un programme FORTRAN 95

MATLAB : COMMANDES DE BASE. Note : lorsqu applicable, l équivalent en langage C est indiqué entre les délimiteurs /* */.

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

Travaux Pratiques de Commande par ordinateur 1 TRAVAUX PRATIQUES

Programmation linéaire

Reconstruction de bâtiments en 3D à partir de nuages de points LIDAR

Chapitre 5 : Flot maximal dans un graphe

Les structures de données. Rajae El Ouazzani

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

Représentation d un entier en base b

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

Cours de Probabilités et de Statistique

Corrigé des TD 1 à 5

La NP-complétude. Johanne Cohen. PRISM/CNRS, Versailles, France.

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

Compilation (INF 564)

Image d un intervalle par une fonction continue

Découverte de Python

Résolution de systèmes linéaires par des méthodes directes

Présentation du PL/SQL

Souad EL Bernoussi. Groupe d Analyse Numérique et Optimisation Rabat http ://

Algorithmes de recherche d itinéraires en transport multimodal

Organigramme / Algorigramme Dossier élève 1 SI

TP 2 Réseaux. Adresses IP, routage et sous-réseaux

TS 35 Numériser. Activité introductive - Exercice et démarche expérimentale en fin d activité Notions et contenus du programme de Terminale S

Bases de programmation. Cours 5. Structurer les données

Cours Informatique Master STEP

Génie Logiciel avec Ada. 4 février 2013

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

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

CCP PSI Mathématiques 1 : un corrigé

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

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

L ALGORITHMIQUE. Algorithme

ALGORITHMIQUE II NOTION DE COMPLEXITE. SMI AlgoII

SERVEUR DE SAUVEGARDE POUR BCDI3. par. G.Haberer, A.Peuch, P.Saadé

chapitre 4 Nombres de Catalan

Projet de programmation (IK3) : TP n 1 Correction

Dualité dans les espaces de Lebesgue et mesures de Radon finies

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Initiation à LabView : Les exemples d applications :

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Algorithmes de recherche

CONCOURS D ENTREE A L ECOLE DE 2007 CONCOURS EXTERNE. Cinquième épreuve d admissibilité STATISTIQUE. (durée : cinq heures)

Chp. 4. Minimisation d une fonction d une variable

Algorithmique I. Algorithmique I p.1/??

BIRT (Business Intelligence and Reporting Tools)

FONCTIONS DE PLUSIEURS VARIABLES (Outils Mathématiques 4)

Algorithmes et programmation en Pascal. Cours

Cours de Programmation 2

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

Programmation Visual Basic. Visite guidée d'un programme Visual Basic 6.0

Analyse des Systèmes Asservis

Continuité en un point

Circuits RL et RC. Chapitre Inductance

Excel Avancé. Plan. Outils de résolution. Interactivité dans les feuilles. Outils de simulation. La valeur cible Le solveur

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Calcul intégral élémentaire en plusieurs variables

Cours d Analyse. Fonctions de plusieurs variables

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

2.4 Représentation graphique, tableau de Karnaugh

Cours d algorithmique pour la classe de 2nde

Fonctions de plusieurs variables, intégrales multiples, et intégrales dépendant d un paramètre

Pourquoi l apprentissage?

CH.6 Propriétés des langages non contextuels

M a n u e l J o s é T r i n d a d e C o e l h o C o r r e i a M a r q u e s

Programmation en Caml pour Débutants

Programmation par contraintes. Laurent Beaudou

Algorithmique et Programmation

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Fonctions de plusieurs variables

aux différences est appelé équation aux différences d ordre n en forme normale.

MIS 102 Initiation à l Informatique

Débuter avec EXPRESS. Alain Plantec. 1 Schema 2

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

FctsAffines.nb 1. Mathématiques, 1-ère année Edition Fonctions affines

Traitement des données avec Microsoft EXCEL 2010

Qualité du logiciel: Méthodes de test

Améliorer les performances du site par l'utilisation de techniques de Web Mining

Transcription:

Arbres tournois, tas-max Judicaël Courant Le 5 septembre 2016 1 Arbres tournois 1.1 Introduction Définition 1 Un arbre binaire étiqueté par des nombres (ou plus généralement par les éléments d un ensemble ordonné) est dit arbre tournoi si l étiquette de tout nœud majore l ensemble de celles de ses descendants. Exercice 1 Voici trois affirmations : 1. On peut tester si un arbre est tournoi en temps quadratique en la taille de l arbre. 2. Un arbre est tournoi si et seulement si, pour chaque nœud de l arbre, chaque fils non-vide a une racine inférieure ou égale à celle du nœud considéré. 3. On peut tester si un arbre est tournoi en temps linéaire en la taille de l arbre. Combien de ces affirmations sont vraies? A Zéro B Une C Deux D Trois 1.2 Réalisation d une file de priorité Extraction du maximum : on réalise une percolation descendante ; Ajout d un élément : percolation montante. (on utilise également le terme tamisage ; en anglais sink) Complexité : O(h) où h est la hauteur de l arbre considéré. 2 Arbres quasi-complets 2.1 Introduction 2.1.1 Définition Définition 2 Un arbre (quasi-)complet est un arbre de hauteur h où toutes les feuilles sont à profondeur h 1 ou h, les feuilles de profondeur h étant bien tassées sur la gauche. Judicaël Courant- 5 septembre 2016 1/7 Document sous licence Creative Commons c b a

a b c d e f g h i j k l 2.2 Représentation par un tableau Numérotons les nœuds d un arbre quasi-complet par un parcours en largeur d abord puis de gauche à droite (parcours militaire) en commençant par 0. 0 1 2 3 4 5 6 7 8 9 10 11 2.3 Propriété de la numérotation Théorème 1 Notons h la hauteur du tas considéré et n son nombre de nœuds. Alors les numéros des nœuds situés à la profondeur k sont les éléments de [[2 k 1, 2 k+1 1[[ pour k [[0, h 1[[. [[2 h 1 1, n[[ pour k = h 1. En posant q = 2p + 1 (resp. 2p + 2), le fils gauche (resp. droit) du nœud numéro p : existe ssi q < n ; a pour numéro q s il existe. 2.4 Démonstration 1. c est vrai pour les nœuds les plus à gauche de chaque rangée (numéro de la forme 2 k 1) ; 2. on effectue une récurrence pour le reste des nœuds de la rangée. On peut alors représenter un tas de taille n par un tableau de taille n voire par un tableau de taille supérieure (seuls les n premiers éléments étant pris en compte). Notons que cette représentation est impérative : on peut modifier un arbre existant (contrairement aux arbres classiques en Caml). Judicaël Courant- 5 septembre 2016 2/7 Document sous licence Creative Commons c b a

type a t a s == { mutable nb_elem : i n t ; mutable donnees : a vect } ; ; ( cree_tas : i n t > a > a t a s ( cree_tas n x ) cr é e un t a s ( arbre quasi complet ) i n i t i a l e m e n t v i d e pouvant c o n t e n i r jusqu à n é l é ments du type de x. l e t cree_tas n x = { nb_elem = 0 ; donnees = make_vect n x } ; ; On peut représenter un sous-arbre par un couple (tas, numéro du noeud où s enracine le sous-arbre) ou tout simplement par le numéro du noeud. On choisit cette dernière solution : type noeud == i n t ; ; l e t r a c i n e = 0 ; ; l e t f i l s _ g a u c h e p = 2 p + 1 ; ; l e t f i l s _ d r o i t p = 2 p + 2 ; ; l e t pere p = ( p 1) / 2 ; ; ( d i v. e u c l i d i e n n e l e t e s t _ r a c i n e p = ( p = 0 ) ; ; ( elem : a t a s > noeud > a retourne l é t i q u e t t e d un noeud. l e t elem t p = t. donnees. ( p ) ; ; ( est_vide : noeud > a t a s > b o o l l e t est_vide p t = ( p >= t. nb_elem ) ; ; ( swap : a t a s > noeud > noeud > u n i t é change l e s é t i q u e t t e s des noeuds. l e t swap t n1 n2 = l e t u = t. donnees in l e t x1 = u. ( n1 ) and x2 = u. ( n2 ) in u. ( n1 ) < x2 ; u. ( n2 ) < x1 ; ; Il n est pas difficile de reconstituer un arbre_bin à partir d un tas binaire : ( arbre_de_tas : noeud > a t a s > a arbre_bin ( arbre_de_tas n t ) retourne l e sous arbre enracin é au noeud n du t a s t. l e t rec arbre_ de_ tas p t = i f est_vide p t then Vide else l e t f g = arbre_de_tas ( f i l s _ g a u c h e p ) t in l e t fd = arbre_de_tas ( f i l s _ d r o i t p ) t in N( t. ( p ), fg, fd ) ; ; Judicaël Courant- 5 septembre 2016 3/7 Document sous licence Creative Commons c b a

3 Structure de tas max Définition 3 Un tas max est un tas binaire qui est également un arbre tournoi. 3.1 Opérations usuelles ( maximum : a t a s > a pr é c o n d i t i o n : l e t a s n e s t pas v i d e e t v é r i f i e l a p r o p r i é t é de t a s max l e t maximum t = t. donnees. ( r a c i n e ) ; ; Percolation descendante sur un sous-arbre : ( percole_descendant : a t a s > i n t > u n i t ( percole_descendant t p ) r é o r g a n i s e l e sous arbre enracin é au noeud p par p e r c o l a t i o n, de f a çon qu i l r e s p e c t e l e s c o n d i t i o n s de t a s max. Pré c o n d i t i o n : l e noeud p e x i s t e e t l e s é v e n t u e l s f i l s de p r e s p e c t e n t l e s c o n d i t i o n s de tas max. l e t rec percole_descendant t p = l e t f g = f i l s _ g a u c h e p in l e t fd = f i l s _ d r o i t p in l e t m = i f not ( est_vide f g t)&&elem t fg>elem t p then f g else p in l e t m = i f not ( est_vide fd t)&&elem t fg>elem t m then fd else m in i f m <> p then begin swap t m p ; percole_descendant t m end ; ; NB : peut évidemment s écrire avec une boucle while. ( extrait_max : a t a s > u n i t Modifie l e t a s pour en e n l e v e r l e maximum. Le t a s r é s u l t a n t v é r i f i e encore l a p r o p r i é t é de tas max. Pré c o n d i t i o n : l e t a s n e s t pas v i d e e t l a p r o p r i é t é de tas max e s t v é r i f i é e. l e t rec extrait_ max t = l e t v = elem t ( t. nb_elem 1) in t. nb_elem < t. nb_elem 1 ; t. donnees ( r a c i n e ) < v ; percole_descendant t r a c i n e ; ; Percolation montante : ( percole_montant : i n t > a t a s > u n i t Ré o r g a n i s e l e t a s par p e r c o l a t i o n, de f a çon qu i l r e s p e c t e l e s c o n d i t i o n s de t a s max. Judicaël Courant- 5 septembre 2016 4/7 Document sous licence Creative Commons c b a

Pré c o n d i t i o n : l e t a s e s t non v i d e e t r e s p e c t e l e s c o n d i t i o n s de t a s max s a u f peut ê t r e e n t r e l e d e r n i e r noeud du t a s ( l e p l u s en bas à d r o i t e ) e t son pè re. l e t percole_montant t = l e t p = r e f ( t. nb_elem 1) in while! pos <> r a c i n e && elem t! pos > elem t ( pere! pos ) do ( l e s c o n t r a i n t e s de t a s sont v é r i f i é es partout, s a u f e n t r e! pos e t son pè re. l e t p = pere! pos in swap t p! pos ; pos := p ; done ; ; ( ajoute_elem : a t a s > a > u n i t Ajoute l é l ément donné au t a s. Conserve l a p r o p r i é t é de tas max. Pré c o n d i t i o n : l e nombre d é l é ments du t a s e s t s t r i c t e m e n t i n f é r i e u r à l a t a i l l e du t a b l e a u u t i l i s é l e t ajoute_elem t x = l e t n = t. nb_elem in t. donnees. ( n ) < x ; t. nb_elem < n + 1 ; percole_montant t ; ; 3.2 Réalisation d une file de priorité (impérative) l e t c r e e _ f i l e _ p r i o r i t e = tas_max cree_tas ; ; l e t i n s e r e = tas_max ajoute_elem ; ; l e t est_vide = tas_max est_vide ; ; l e t maximum = tas_max maximum ; ; l e t extrait_maximum = tas_max extrait_maximum ; ; 3.3 Construction en O(n) (par forêt) La construction naïve d un tas-max de n éléments (par ajout successifs) a un coût temporel O(n log n). NB : il est difficile d améliorer cette borne car n k=1 log k = Θ(n log n) (exercice : le montrer). Mais on peut faire mieux : on peut commencer par construire un tas de profondeur h à partir des n éléments (sans que ce soit un tas-max), puis effectuer des percolations sur les sous-arbres. Pour les nœuds situés profondeur h 1, il n y a rien à faire. On effectue des percolations descendantes des nœuds de numéros dans [[2 h 2 1, 2 h 1 1[[ (deux appels récursifs par nœud au maximum), puis des nœuds de numéros dans [[2 h 3 1, 2 h 2 [[ (trois appels récursifs au plus), etc. À une étape donnée du calcul, on a donc fait en sorte que les l ensemble des 2 k arbres enracinés à la profondeur k aient la propriété de tas-max. (Un ensemble d arbre est une forêt, d où le nom de la construction.) Judicaël Courant- 5 septembre 2016 5/7 Document sous licence Creative Commons c b a

Au total, le nombre total d appels sera donc majoré par h + k2 h k 2 h k2 k = O(2 h ) = O(n) k=2 On peut donc construire le tas en O(n). 3.4 Tri par tas 3.4.1 Principe k=2 Il consiste à trier un tableau par la méthode suivante : 1. Construire un tas à partir du tableau ; 2. Extraire de ce tas les maximums successifs et les mettre dans le tableau résultat. Fait remarquable : on peut utiliser le même tableau pour représenter le tableau de sortie et le tas. 3.4.2 Implantation On peut alors écrire tout le code sans même faire référence au type tas : l e t percole_descendant p t n = l e t pos = r e f p in l e t c = r e f f a l s e in while! c do l e t g = 2! pos + 1 in l e t d = g + 1 in l e t next = i f d<n && t. ( d)>t. ( g ) then d else g in i f next < n && t. ( next ) > t. (! pos ) then begin swap t! pos next ; pos := next ; end else c := true done ; ; l e t t r i _ t a s t = l e t n = vect_length t in for i from (n 2) / 2 ( pere (n 1) downto 0 do ( pour j>i, t [ j ] e s t un tas max percole_descendant i t n ; done ; for i from n 1 downto 1 do ( t [ i +1],..., t [ n 1] e s t t r i é, e t t [ 0 ],..., t [ i ] e s t un tas max d é l é ments p l u s p e t i t s swap t r a c i n e i ; percole_descendant r a c i n e t i done ; ; NB : Pas besoin de percoler montante. Complexité : O(n log n). Judicaël Courant- 5 septembre 2016 6/7 Document sous licence Creative Commons c b a

3.4.3 Avantages du tri par tas Rapide ; En place ; Raisonnablement court ; 3.4.4 Inconvénients Non stable ; Incompréhensible sans les concepts. Judicaël Courant- 5 septembre 2016 7/7 Document sous licence Creative Commons c b a