• Aucun résultat trouvé

loga-rithmique, mais l'ajout et la suppression nécessitent de décaler les éléments du tableau, puisqu'il est impensable de laisser des trous (rappel) ; leur complexité est alors linéaire.

Il s'avère qu'un ABR est un bien meilleur choix. Les clés du dictionnaire, a priori des chaînes de caractère, sont les étiquettes des n÷uds, et comme on l'a vu, la recherche d'une clé se fait en temps logarithmique, de même que l'insertion et la suppression.

1.2 Tas

Dénition

Un tas est un arbre dont les n÷uds sont étiquetés par des clés, de sorte que la clé d'un n÷ud est supérieure à l'étiquette de chacun de ses ls.

Remarques :

La clé maximale d'un tas est donc à la racine.

La deuxième plus grande clé d'un tas est au niveau d'un ls de la racine.

Au moins un exemplaire de la clé minimale est sur une feuille.

Une recherche ne peut pas exclure a priori de branche tant que la valeur recherchée est inférieure à l'étiquette de la racine de la branche en question.

En particulier, on ne peut pas localiser les autres valeurs.

Une variante consiste à remplacer supérieure par inférieure . On a alors la notion de tas-min , par opposition aux tas-max .

La plupart du temps, on ajoute comme contraintes que l'arbre est binaire (on parle alors de tas binaire), complet sauf éventuellement des feuilles man-quantes le plus à droite possible2. Dans ce cas, on peut représenter un tas par un simple tableau, dont les éléments aux indices 2k−1 −1 à 2k−2 cor-respondent à la profondeur k (avec la convention k = 1 pour la racine et en faisant évidemment commencer les indices à 0). Les ls (s'il en existe, et potentiellement uniquement le ls gauche) d'un n÷ud d'indice m sont alors aux indices 2m+ 1 et2m+ 2.

Les opérations usuelles sur les tas sont :

Le tamisage, consistant à faire descendre une racine n'étant pas le maximum

2. Le terme habituel est arbre binaire presque complet .

d'un tas jusqu'à la place qui lui revient.3 Il s'agit de faire des échanges (en maintenant donc l'éventuel caractère presque complet de départ) de manière récursive : tant qu'on n'a pas une structure de tas, on échange la racine avec son ls de clé maximale et on tamise le sous-arbre qu'on vient de modier.

L'extraction, consistant à supprimer la racine, à récupérer la clé en dernière position dans le parcours en largeur et à tamiser.4

La suppression d'une clé quelconque, demandant à opérer un rééquilibrage.

On peut là aussi imaginer que la clé se situant à la dernière position dans le parcours en largeur remplace la clé supprimée, puis on la fait remonter ou redescendre jusqu'à la place qui lui convient.5

L'insertion en faisant remonter une nouvelle clé, insérée à la première posi-tion libre, jusqu'à la posiposi-tion qu'elle devrait occuper. Cette méthode marche bien pour les tableaux, mais son implémentation à l'aide d'un type spécique demande à savoir où l'insertion doit être faite. En fait, comme pour d'autres opérations, la diculté réside dans la recherche du dernier élément ou du pre-mier trou dans le parcours en largeur. Une solution peut être de mémoriser la taille de l'arbre quelque part, mais en prenant garde à respecter la structure dénie, ainsi qu'à ne pas sacrier la complexité en espace6. Une meilleure solution est d'utiliser une implémentation à l'aide d'un tableau et d'utiliser un tableau annexe indexé par les clés du tas7 et maintenant leur position.

L'augmentation d'une clé, suivi d'un replacement de ladite clé. Il est incon-tournable de disposer d'une structure permettant d'associer une clé et sa po-sition, an de pouvoir procéder à des échanges sans surcoût.

Enn, signalons l'existence d'un tri appelé tri par tas (heapsort), dont le principe est de construire un tas puis d'en extraire les racines successivement. La complexité

3. Cette opération est gratuite sur un tas auquel on n'impose pas d'être binaire : on cherche la clé maximale à la profondeur 1, on la met à la racine avec pour ls ses anciens ls, les ls de l'ancienne racine ainsi que cette dernière. En pratique, une telle astuce se retrouve pour les autres opérations et nous ne reviendrons pas dessus.

4. L'extraction peut se faire plus facilement en allégrant les contraintes sur le tas. S'il ne doit pas être presque complet, on peut faire une extraction récursive en faisant remonter le ls de clé maximale à chaque étape.

5. Le fait de devoir remonter ou redescendre une clé soulève déjà une diculté possible si l'implémentation est sous la forme d'arbres où chaque n÷ud pointe vers ses ls, sans que l'on ne puisse accéder en temps constant à une clé quelconque ni identier sa position.

6. Ceci étant, il est alors également possible d'insérer par la racine et de faire descendre la nouvelle clé ou une ancienne clé qu'elle remplace jusqu'à la position libre en question, à condition de connaître la direction.

7. Les fonctions de hachage, c'est magique !

1.2. TAS 15 en temps du tri par tas est un O(nlogn), en raison de la répétition d'un nombre linéaire d'opérations de complexité logarithmique. En pratique, il s'avère que le tri rapide est meilleur que le tri par tas d'un facteur 2.

On rappelle qu'une le de priorité est une structure de données dont les éléments sont retirés dans l'ordre de leur priorité, et que les opérations de base sur les les de priorités sont :

L'insertion d'un élément assorti d'une certaine priorité (cas classique : la prio-rité maximale des éléments déjà présents plus un).

L'extraction de l'élément de tête.

L'augmentation de la priorité d'un élément, causant son déplacement en di-rection de la tête.8

Nous allons réaliser cette année une structure de le de priorité, précisément à l'aide de tas-min.

De même que pour un dictionnaire, on va distinguer la clé et l'information, de sorte que les éléments de la le seront représentés par des couples (position de l'élément , élément). Enler un élément revient à insérer dans le tas un couple (clé , élément), de sorte que la clé soit maximale parmi les clés existantes. La façon la plus naïve de faire ceci est de mémoriser la dernière clé ajoutée et de l'incrémenter. L'utilisation d'un tableau maintenant la position de chaque élément rend cette opération automatique, en fait, puisque la nouvelle clé sera alors la taille du tableau, dans la mesure où on ne libère pas la mémoire du tableau quand un élément sort de la le.

Une insertion intelligente dans la le prendra alors un temps logarithmique en sa taille, et l'extraction de l'élément de tête aussi, en notant que l'accès à cet élément est immédiat. La diminution d'une clé, augmentant alors sa priorité, consiste à faire remonter la clé jusqu'à la position qu'elle doit occuper dans le tas. La question de la présence de deux clés identiques se pose ; on peut choisir de laisser la priorité à l'élément dont la clé a été modiée le plus tôt.

8. Diminuer la priorité est aussi envisageable et ne causerait pas de dissymétrie de complexité en forçant à augmenter la priorité d'autres éléments.

Chapitre 2

Notions de logique

Ce chapitre présente la logique de manière plus approfondie que le simple calcul avec des booléens, en tant qu'un des fondements de l'informatique théorique. On note ici B l'ensemble {vrai, faux} des booléens.

2.1 Introduction au calcul propositionnel

La logique propositionnelle est le fragment de base de la logique et se limite à des opérations entre booléens. On le construit à l'aide des constantes vrai et faux, de variables propositionnelles (booléennes), prises dans un ensemble dénombrableV, et de connecteurs, fonctions de Bn dans B pour n≥11, formant les ensembles Fn. Ainsi, la syntaxe de la logique propositionnelle, c'est-à-dire la façon d'utiliser les constructeurs pour former des formules qui ont un sens, est la suivante : une formule est soit une constante, soit une variable, soit l'application d'un connecteur n-aire à n formules, ce qui s'écrit : ϕ::= vrai| faux | p∈ V | f(ϕ, . . . , ϕ

| {z }

n

) pour f ∈ Fn.

Un connecteur f est déni par sa table de vérité, dont une représentation est un tableau à2ncellules indiquant pour chaquen-uplet de booléens(x1, . . . , xn)la valeur de f(x1, . . . , xn).

L'ensemble des formules propositionnelles (avec nos connecteurs de base) peut en

1. On pourrait considérer vrai et faux comme des fonctions constantes deB0 dansB.

17

fait être déni de deux façons, qu'on appelle la dénition par le haut et la dénition par le bas.

Par le haut : c'est le plus petit sous-ensemble F des expressions que l'on peut en-gendrer avec la syntaxe précédente2.

Par le bas : c'est la réunion surNdes ensembles de formulesFndénis par récurrence, avec F0 =V, et pourn ∈N,

Fn+1 =Fn∪ {f(ϕ1, . . . , ϕn) | lesϕi ∈ Fn, f est un connecteur n-aire}.

On montre par récurrence que les deux ensembles dénis ici sont égaux.

Conventionnellement, on va limiter le nombre de connecteurs (un théorème ultérieur justiera pourquoi), et utiliser une syntaxe simpliée et pratique, de sorte qu'on dira désormais que l'ensemble des formules propositionnelles est (par le haut) le plus petit sous-ensemble F des expressions utilisant les constantes booléennes, les éléments deV, les symboles de connecteurs{¬,∨,∧,⇒,⇔}et les parenthèses {(,)}, tel que V ⊆ F, siϕ∈ F, alors ¬ϕ∈ F et si ϕ, ψ ∈ F, alors (ϕ C ψ)∈F pour tout C ∈ {∨,∧,⇒,⇔}.

Par le bas, la caractérisation se déduit aisément.

Ici, les parenthèses sont encore nécessaires mais la donnée de la sémantique permettra d'en retirer.

On a alors un théorème de lecture unique de formules avec cette syntaxe restreinte.

Théorème

Pour toute formuleϕ∈ F, un et un seul des trois cas suivants se présentent : ϕ∈ V;

il existe une unique formuleψ ∈ F telle que ϕ=¬ψ;

il existe un unique couple de formules (ψ, θ) ∈ F2 et un unique connecteur C ∈ {∨,∧,⇒,⇔} tel que ϕ=ψ C θ.

2. On dit par le haut car cela équivaut à l'intersection de tous les ensembles contenant toutes les expressions qu'on peut engendrer ainsi, qui sont donc tous plus grands que l'ensemble des formules propositionnelles.

2.1. INTRODUCTION AU CALCUL PROPOSITIONNEL 19

La sémantique de la logique propositionnelle, c'est-à-dire le sens à donner à une formule, dépend d'une interprétation I, soit une aectation de chaque variable ap-paraissant dans la formule à un booléen, et permet de déduire la valeur de vérité de la formule.

On peut en pratique voir une interprétation comme une fonction V → B dont seule la restriction aux variables apparaissant dans la formule qu'on évalue importe.

La valeur de vérité d'une constante booléenne est la constante elle-même, la valeur de vérité d'une variable booléenne est donnée par l'interprétation, la valeur de vérité d'une formule obtenune par l'application d'un connecteur se lit dans la table de vérité de celui-ci en déterminant la valeur de vérité des sous-formules en argument.

Les connecteurs standards de la logique propositionnelle, présentés avec la syntaxe restreinte, sont¬(la négation, unaire),∧(la conjonction, binaire3),∨(la disjonction, binaire), ⇒ (l'implication, binaire) et ⇔ (l'équivalence, binaire).

La sémantique est donc4 :

I, b |= b si b =vrai ou b =faux

Une formule est une tautologie si elle s'évalue à vrai quelle que soit l'interprétation, une contradiction si elle s'évalue à faux quelle que soit l'interprétation, et satisfaisable s'il existe au moins une interprétation où elle s'évalue à vrai, donc une formule est satisfaisable si et seulement si elle n'est pas une contradiction. Deux formules sont équivalentes si elles s'évaluent au même booléen quelle que soit l'interprétation.

3. Les connecteurset sont associatifs, donc autant imposer qu'ils soient binaires.

4. toujours avec les parenthèses nécessaires vu que les connecteurs sont inxes

Pour déterminer si une formule est satisfaisable, il sut de l'évaluer avec toutes les interprétations possibles. Il n'existe pas à l'heure actuelle d'algorithme asymptoti-quement plus ecace (c'est aussi un problème NP-complet).

Les résultats dont l'intuition est présentée dans le cours ont pour fondement des théorèmes qui se démontrent par récurrence.5

Tout d'abord, le théorème d'unicité des interprétations : Théorème

Pour toute interprétation I, vue comme une fonction de V dans {vrai,faux}, il existe une unique application de F dans {vrai,faux} prolongeant I, c'est-à-dire respectant les règles de la sémantique des connecteurs telles que dénies plus tôt.

Ensuite, le théorème de substitution, qui a l'avantage (entre autres) de rendre valides nos règles de déduction pour n'importe quelle formule dès lors qu'on les prouve pour toutes les constantes booléennes :

Théorème

Soient I une interprétation, n un entier naturel, ϕ, ψ1, . . . , ψn des formules et p1, . . . , pndes variables propositionnelles deux à deux distinctes. On noteϕ0la formule obtenue en remplaçant tous lespi apparaissant dansϕpar desψi. La valeur de vérité de ϕ0 avec l'interprétation I est la même que la valeur de vérité de ϕ avec une interprétation qui correspond à I pour les variables propositionnelles hors p1, . . . , pn et qui aecte à chaque pi la valeur de vérité avec I duψi correspondant.

Dans le document Option informatique deuxième année (Page 13-20)

Documents relatifs