structuredepiles · 12/2/2016 · définition applications implémentations files...
TRANSCRIPT
Définition Applications Implémentations Files Notation postfixée
Structure de piles
Émeric Tourniaire
15 novembre 2016
Définition Applications Implémentations Files Notation postfixée
Table of contents
Définition
Applications
Implémentations
Files
Notation postfixée
Définition Applications Implémentations Files Notation postfixée
Type abstrait
• Données à stocker• Lien logique• Définition mathématique• Opérations possibles
Définition Applications Implémentations Files Notation postfixée
Type abstrait
• Données à stocker• Lien logique• Définition mathématique• Opérations possibles
Exemple 1 :• Annuaire téléphonique• Ensemble de triplets (nom, adresses, numéros)• Recherche par nom ? Par adresse ? Par numéro ?• Changer un numéro ? Une adresse ?
Définition Applications Implémentations Files Notation postfixée
Type abstrait
• Données à stocker• Lien logique• Définition mathématique• Opérations possibles
Exemple 2 :• Ensemble de nombres entiers• A ⊂ Z• Créer {n} pour n ∈ Z• A ∪ B, A ∩ B, A− B, x ∈ A, . . .
Définition Applications Implémentations Files Notation postfixée
Type abstrait
• Données à stocker• Lien logique• Définition mathématique• Opérations possibles
Exemple 3 :• Système de fichiers• Structure d’arbre• Créer un répertoire, déplacer des fichiers• Renommer un fichier, gérer des permissions, . . .
Définition Applications Implémentations Files Notation postfixée
Structure de donnée
• Implémentation d’un type abstrait• Cahier des charges• Complexité des opérations• Confusion entre la structure et son type abstrait
Définition Applications Implémentations Files Notation postfixée
PileType abstrait
• Last In First Out• Créer une pile vide• Ajouter un élément• Retirer l’élément en tête
• Tester si la pile est vide14426
64214
Définition Applications Implémentations Files Notation postfixée
PileType abstrait
• Last In First Out• Créer une pile vide• Ajouter un élément• Retirer l’élément en tête
• Tester si la pile est vide
14
426
64214
Définition Applications Implémentations Files Notation postfixée
PileType abstrait
• Last In First Out• Créer une pile vide• Ajouter un élément• Retirer l’élément en tête
• Tester si la pile est vide
1442
6
64214
Définition Applications Implémentations Files Notation postfixée
PileType abstrait
• Last In First Out• Créer une pile vide• Ajouter un élément• Retirer l’élément en tête
• Tester si la pile est vide
14426
64214
Définition Applications Implémentations Files Notation postfixée
PileType abstrait
• Last In First Out• Créer une pile vide• Ajouter un élément• Retirer l’élément en tête
• Tester si la pile est vide
1442
6
6
4214
Définition Applications Implémentations Files Notation postfixée
PileType abstrait
• Last In First Out• Créer une pile vide• Ajouter un élément• Retirer l’élément en tête
• Tester si la pile est vide
14
426
6
42
14
Définition Applications Implémentations Files Notation postfixée
PileType abstrait
• Last In First Out• Créer une pile vide• Ajouter un élément• Retirer l’élément en tête
• Tester si la pile est vide14426
642
14
Définition Applications Implémentations Files Notation postfixée
PileType abstrait
• Last In First Out• Créer une pile vide• Ajouter un élément• Retirer l’élément en tête
• Tester si la pile est vide14426
64214
Définition Applications Implémentations Files Notation postfixée
PileType abstrait
• Créer une pile vide : new_stack()• Ajouter un élément : pile.push(a)• Retirer l’élément en tête : a = pile.pop()• Tester si la pile est vide : is_empty(pile)
Définition Applications Implémentations Files Notation postfixée
Compter les éléments d’une pile(sans la modifier)
14426
res = 0res = 1res = 2res = 3return(res)
14426
Définition Applications Implémentations Files Notation postfixée
Compter les éléments d’une pile(sans la modifier)
14426
res = 0
res = 1res = 2res = 3return(res)
14426
Définition Applications Implémentations Files Notation postfixée
Compter les éléments d’une pile(sans la modifier)
14426
res = 0
res = 1res = 2res = 3return(res)
14426
Définition Applications Implémentations Files Notation postfixée
Compter les éléments d’une pile(sans la modifier)
1442
6
res = 0
res = 1
res = 2res = 3return(res)
1442
6
Définition Applications Implémentations Files Notation postfixée
Compter les éléments d’une pile(sans la modifier)
14
426
res = 0res = 1
res = 2
res = 3return(res)
14
426
Définition Applications Implémentations Files Notation postfixée
Compter les éléments d’une pile(sans la modifier)
14426
res = 0res = 1res = 2
res = 3
return(res)
14426
Définition Applications Implémentations Files Notation postfixée
Compter les éléments d’une pile(sans la modifier)
14
426
res = 0res = 1res = 2
res = 3
return(res)
14
426
Définition Applications Implémentations Files Notation postfixée
Compter les éléments d’une pile(sans la modifier)
1442
6
res = 0res = 1res = 2
res = 3
return(res)
1442
6
Définition Applications Implémentations Files Notation postfixée
Compter les éléments d’une pile(sans la modifier)
14426
res = 0res = 1res = 2
res = 3
return(res)
14426
Définition Applications Implémentations Files Notation postfixée
Compter les éléments d’une pile(sans la modifier)
14426
res = 0res = 1res = 2res = 3
return(res)
14426
Définition Applications Implémentations Files Notation postfixée
Compter les éléments d’une pile(sans la modifier)
def nbr_elements(pile):temp = new_stack()res = 0while not is_empty(pile):
res = res+1temp.push(pile.pop())
while not is_empty(temp):pile.push(temp.pop())
return res
Définition Applications Implémentations Files Notation postfixée
Historique de navigation
• Empiler quand on clique sur un lien
• Dépiler quand on appuie sur• Pourquoi la pile n’est pas recopiée quand on ouvre un nouvelonglet ?
Définition Applications Implémentations Files Notation postfixée
Bouton undo sur un éditeur
• Pile des modifications d’un document• ˆZ permet d’annuler les dernières modifications
• Une annulation n’est pas une modification• Cette pile est-elle enregistrée dans le fichier ?
Définition Applications Implémentations Files Notation postfixée
Bouton undo sur un éditeur
• Pile des modifications d’un document• ˆZ permet d’annuler les dernières modifications• Une annulation n’est pas une modification
• Cette pile est-elle enregistrée dans le fichier ?
Définition Applications Implémentations Files Notation postfixée
Bouton undo sur un éditeur
• Pile des modifications d’un document• ˆZ permet d’annuler les dernières modifications• Une annulation n’est pas une modification• Cette pile est-elle enregistrée dans le fichier ?
Définition Applications Implémentations Files Notation postfixée
Aparté : gestionnaire de version
• diff évalue la différence entre deux fichiers, en trouvant leslignes identiques.
• rsync synchronise deux répertoires.• Systèmes de version (svn, git)• Problème si les fichiers diffèrent trop (PDF, wordlike, etc.)
Définition Applications Implémentations Files Notation postfixée
Aparté : gestionnaire de version
Définition Applications Implémentations Files Notation postfixée
Aparté : gestionnaire de version
• diff évalue la différence entre deux fichiers, en trouvant leslignes identiques.
• rsync synchronise deux répertoires.• Systèmes de version (svn, git)• Problème si les fichiers diffèrent trop (PDF, wordlike, etc.)
Définition Applications Implémentations Files Notation postfixée
Aparté : gestionnaire de version
• diff évalue la différence entre deux fichiers, en trouvant leslignes identiques.
• rsync synchronise deux répertoires.• Systèmes de version (svn, git)• Problème si les fichiers diffèrent trop (PDF, wordlike, etc.)
Définition Applications Implémentations Files Notation postfixée
Aparté : gestionnaire de version• diff évalue la différence entre deux fichiers, en trouvant leslignes identiques.
• rsync synchronise deux répertoires.• Systèmes de version (svn, git)• Problème si les fichiers diffèrent trop (PDF, wordlike, etc.)
Définition Applications Implémentations Files Notation postfixée
Problème de piles : tour de Hanoï
• n cylindres empilés.• Objectif : les changer de pile• Règles :
• On ne peut déplacerqu’un cylindre à la fois.
• On ne peut pas déplacerun cylindre sur un cylindreplus petit.
Définition Applications Implémentations Files Notation postfixée
Autres applications(spoiler alert)
• Récursivité• Notation postfixe• Files
Définition Applications Implémentations Files Notation postfixée
Liste simplement chainée
• Rien (None ou [])• Liste de 2 choses• Un élément (la tête)• Une liste simplement chainée
Définition Applications Implémentations Files Notation postfixée
En Python
def newpile():return([])
def push(elem,pile):return([elem,pile])
def pop(pile):if len(pile)==0:raise(IndexError)
else:return(pile[0],pile[1])
pile = newpile()pile = push(14,pile)pile = push(42,pile)a,pile = pop(pile)a
Définition Applications Implémentations Files Notation postfixée
Tableau dynamique
• Listes par défaut en python• Ajouter un élément ou l’enlever• Comment ça marche ?
• Fonctionnalités en plus : len(pile) ou pile[k]
Définition Applications Implémentations Files Notation postfixée
Tableau dynamique
• Listes par défaut en python• Ajouter un élément ou l’enlever• Comment ça marche ?• Fonctionnalités en plus : len(pile) ou pile[k]
Définition Applications Implémentations Files Notation postfixée
En Python
• Nouvelle pile :pile = []
• Ajouter un élément :pile.append(14)
• Tester si la pile est vide :pile == []len(pile) == 0
• Sortir la tête de la pile :a = pile.pop()
• Taille de la pile :len(pile)
• Indexation (peu utile) :pile[k]
ComplexitéToutes ces opérations sont en O(1) (éventuellement amorti)
Définition Applications Implémentations Files Notation postfixée
Exercices
• Écrire une fonction palindrome(chaine) qui détecte sichaine est un palindrome, en utilisant une pile.
• Écrire une fonction bien_parenthesee(chaine) qui doitrenvoyer True si et seulement si chaine est une suite de (, ),{, ou } bien parenthésée.
Définition Applications Implémentations Files Notation postfixée
Exercices
def palindrome(chaine):pile = []n = len(chaine)for i in range(n):
#print(pile)if i < n//2:
pile.append(chaine[i])if i > (n-1)//2:
if chaine[i] != pile.pop():return False
return True
Définition Applications Implémentations Files Notation postfixée
Les files
• First In First out• File d’attente (magasin, routeur, multitâches)• Sortir d’un labyrinthe
Définition Applications Implémentations Files Notation postfixée
Primitives
• Créer une file vide : new_queue()• Ajouter un élément : enqueue(file,a)• Retirer l’élément en tête : a = dequeue(file)Rappel : il s’agit de l’élément qui est depuis le plus longtempsdans la file.
• Tester si la file est vide : is_empty(file)
Définition Applications Implémentations Files Notation postfixée
Implémentation
• On utilise deux piles
• def new_queue():return([],[])
• enqueue(file,a)• dequeue(file)• is_empty(file)
Définition Applications Implémentations Files Notation postfixée
Implémentation
• On utilise deux piles
• def new_queue():return([],[])
• enqueue(file,a)• dequeue(file)• is_empty(file)
def is_empty(file):p0 = file[0]p1 = file[1]return len(p1)+len(p2) == 0
Définition Applications Implémentations Files Notation postfixée
Implémentation
• On utilise deux piles
• def new_queue():return([],[])
• enqueue(file,a)• dequeue(file)• is_empty(file)
def enqueue(a,file):p1 = file[1]p1.append(a)
Définition Applications Implémentations Files Notation postfixée
Implémentation
• On utilise deux piles
• def new_queue():return([],[])
• enqueue(file,a)• dequeue(file)• is_empty(file)
def flip(p1,p0):while len(p1)>0:
p0.append(p1.pop())
def dequeue(file):p0 = file[0]p1 = file[1]if len(p0) > 0:
return(p0.pop())else:
flip(p1,p0)return(p0.pop())
Définition Applications Implémentations Files Notation postfixée
Exercice
On dispose d’un labyrinthe de n cases décrit par le tableau laby àdeux dimensions : laby[i] est la liste des cases auxquelles onpeut aller depuis la i-ème. On commence toujours à la case 0, ongagne si on arrive à accéder à la case n-1
• Écrire un programme solvable(laby) qui détermine si labya une solution ou non.
• Améliorer le programme précédent pour qu’il détermine encombien de coups on peut gagner.
Définition Applications Implémentations Files Notation postfixée
def resoudre(laby):file = new_queue()n = len(laby)distance = [-1 for i in range(n)]distance[0] = 0predecesseur = [-1 for i in range(n)]enqueue(0,file)while not is_empty(file) > 0 and distance[-1] == -1:
case= dequeue(file)d = distance[case]for i in laby[case]:
if distance[i] == -1:distance[i]=d+1predecesseur[i]=caseenqueue(i,file)
return(distance,predecesseur)
resoudre([[1,2],[2],[3],[]])resoudre([[1],[2],[3],[]])
Définition Applications Implémentations Files Notation postfixée
Notation Polonaise Inverse
Si on a le temps...