• Aucun résultat trouvé

Comptage et énumération de structures de données: Algorithmes efficaces et implantations optimisées Florent Hivert

N/A
N/A
Protected

Academic year: 2022

Partager "Comptage et énumération de structures de données: Algorithmes efficaces et implantations optimisées Florent Hivert"

Copied!
45
0
0

Texte intégral

(1)

Comptage et énumération de structures de données:

Algorithmes efficaces et implantations optimisées

Florent Hivert

Mél : [email protected]

Adresse universelle :http://www.lri.fr/˜hivert

(2)

Références

Frank Ruskey, Combinatorial Generation doi:10.1.1.93.5967, 2003, non publié

A. Nijenhuis and H.S. Wilf, Combinatorial algorithms, 2nd ed., Academic Press, 1978

http://www.math.upenn.edu/~wilf/website/

CombinatorialAlgorithms.pdf The (Combinatorial) Object Server : http://sue.csc.uvic.ca/~cos/

The On-Line Encyclopedia of Integer Sequences http://oeis.org

Combinatorial Generation Combinatorial Generation

Combinatorial Generatio ombinatorial Generation

Combinatorial Generati mbinatorial Generation

Combinatorial Generat binatorial Generation

Combinatorial Genera inatorial Generation

Combinatorial Gener natorial Generation

Combinatorial Gene atorial Generation

Combinatorial Gen torial Generation

Combinatorial Ge orial Generation

Combinatorial G rial Generation

Combinatorial ial Generation

Combinatoria al Generation

Combinatori l Generation

Combinator Generation

Combinato eneration

Combinat neration

Combina eration

Combin ration

Combi ation

Comb tion

Com ion

Co on

C n

October 1, 2003

Combinatorial Generation Working Version (1j-CSC 425/520) no comments printed; pseudo-code version

Frank Ruskey Department of Computer ScienceUniversity of Victoria

Victoria, B.C. V8W 3P6 CANADA [email protected]

C n

Co on

Com ion

Comb tion

Combi ation

Combin ration

Combina eration

Combinat neration

Combinato eneration

Combinator Generation

Combinatori l Generation

Combinatoria al Generation

Combinatorial ial Generation

Combinatorial G rial Generation

Combinatorial Ge orial Generation

Combinatorial Gen torial Generation

Combinatorial Gene atorial Generation

Combinatorial Gener natorial Generation

Combinatorial Genera inatorial Generation

Combinatorial Generat binatorial Generation

Combinatorial Generati mbinatorial Generation

Combinatorial Generatio ombinatorial Generation

Combinatorial Generation Combinatorial Generation

(3)

Algorithmes combinatoires

Manipulation d’ensembles finis, mais souvent très grand...

Algorithmes et implantations efficacespour Compter, trouver la liste, itérer

recherche d’un élément Tirage aléatoire équitable

(4)

Exemple d’ensemble finis...

Suite den-bits :

0 1 00 01 10 11

000 001 010 011 100 101 110 111 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Cardinal (nombre d’éléments) :https://oeis.org/A000079

2n:1,2,4,8,16,32,64,128,256,512,1024,2048,4096. . .

(5)

Permutés de [1, 2, . . . , n]

1 12 21

123 132 213 231 312 321

1234 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4132 4213 4231 4312 4321 Cardinal (nombre d’éléments) :https://oeis.org/A000142 n! :1,2,6,24,120,720,5040,40320,362880,3628800,39916800. . .

(6)

Arbres binaires à n noeuds

(7)

Arbres binaires à n noeuds

Cardinal (nombre d’éléments) :https://oeis.org/A000142 Cat(n) :1,2,5,14,42,132,429,1430,4862,16796,58786,208012. . .

(8)

Les graphes à n noeuds :

Cardinal (nombre d’éléments) :https://oeis.org/A000088

Gr(n) :1,2,4,11,34,156,1044,12346,274668,12005168,1018997864. . .

(9)

Les graphes à 5 noeuds :

(10)

Manipulation d’ensembles finis :

... mais souvent très grand ...

suites de 64 bits : 0xce24762189cdef0d permutés d’un tableaux : [5,3,6,4,1,2]

arbres binaires à 7 noeuds :

graphes à 8-sommets :

document XML à n balises

programmes à n caractères en C, chemin d’execution

(11)

Algorithmes combinatoires

SoitS un ensemble fini.

On souhaite écrire les algorithmes suivants : count retourne le nombre d’éléments deS list retourne la liste des éléments de S iter itère sur les éléments de S

unrank retourne le i-ème élement de la liste des éléments deS rank étant donné s ∈S retourne sa position dans la liste first retourne le premier élément de la liste

next étant donné s ∈S retourne le suivant dans la liste random retourne uns ∈S au hasard de manière équitable

(12)

Applications

recherche de solution par la force brute analyse d’algorithme, complexité tests de programme, de système recherche de failles, fuzzing

bio-informaique, chimie, physique statistique

(13)

Algorithme list

SoitS l’ensemble des suites de 4 bits Algorithme (list)

list(S) retourne la liste des éléments de S

Note : il faut fixer un ordre !

Par exemple pour l’ordre lexicographique :

0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111

(14)

Algorithme list

SoitS l’ensemble des suites de 4 bits Algorithme (list)

list(S) retourne la liste des éléments de S

Note : il faut fixer un ordre !

Par exemple pour l’ordre lexicographique :

0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111

(15)

Algorithme list

SoitS l’ensemble des suites de 4 bits Algorithme (list)

list(S) retourne la liste des éléments de S

Note : il faut fixer un ordre !

Par exemple pour l’ordre lexicographique :

0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111

(16)

Algorithme list

Version récursive :

Bn=0·Bn−1 ∪ 1·Bn−1

Version Itérative en utilisant la base 2.

(17)

Algorithme list

Version récursive :

Bn=0·Bn−1 ∪ 1·Bn−1

Version Itérative en utilisant la base 2.

(18)

Algorithme count

Algorithme (count)

count(S) retourne le nombre d’éléments de S (la cardinalité de S).

SoitS l’ensemble des suites de 4 bits count(S) =16

(19)

Algorithme count

Algorithme (count)

count(S) retourne le nombre d’éléments de S (la cardinalité de S).

SoitS l’ensemble des suites de 4 bits count(S) =16

(20)

Algorithme count

Algorithme (count)

count(S) retourne le nombre d’éléments de S (la cardinalité de S).

SoitS l’ensemble des suites de 4 bits count(S) =16

(21)

Algorithme unrank

Algorithme (unrank)

unrank(S,i) retourne le i -ème élement de la liste des éléments de S pour0≤i <count(S).

SoitS l’ensemble des suites de 4 bits dans l’ordre lexicographique 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 Alors :

unrank(S,11) =1011

(22)

Algorithme unrank

Algorithme (unrank)

unrank(S,i) retourne le i -ème élement de la liste des éléments de S pour0≤i <count(S).

SoitS l’ensemble des suites de 4 bits dans l’ordre lexicographique 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 Alors :

unrank(S,11) =1011

(23)

Algorithme rank

Algorithme (rank)

rank(S,s) retourne la position de s∈S dans la liste

SoitS l’ensemble des suites de 4 bits dans l’ordre lexicographique 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 Alors :

rank(S,1011) =11

(24)

Algorithme rank

Algorithme (rank)

rank(S,s) retourne la position de s∈S dans la liste

SoitS l’ensemble des suites de 4 bits dans l’ordre lexicographique 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 Alors :

rank(S,1011) =11

(25)

Algorithme first

Algorithme (first)

first(S) retourne le premier élément de la liste

SoitS l’ensemble des suites de 4 bits dans l’ordre lexicographique 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 Alors :

first(S) =0000

(26)

Algorithme first

Algorithme (first)

first(S) retourne le premier élément de la liste

SoitS l’ensemble des suites de 4 bits dans l’ordre lexicographique 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 Alors :

first(S) =0000

(27)

Algorithme next

Algorithme (next)

next(S,s) retourne l’élément qui suit s ∈S dans la liste

SoitS l’ensemble des suites de 4 bits dans l’ordre lexicographique 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 Alors :

next(S,1011) =1100 et

next(S,1111) =Erreur ou Exception

(28)

Algorithme next

Algorithme (next)

next(S,s) retourne l’élément qui suit s ∈S dans la liste

SoitS l’ensemble des suites de 4 bits dans l’ordre lexicographique 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 Alors :

next(S,1011) =1100 et

next(S,1111) =Erreur ou Exception

(29)

Algorithme next

Algorithme (next)

next(S,s) retourne l’élément qui suit s ∈S dans la liste

SoitS l’ensemble des suites de 4 bits dans l’ordre lexicographique 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 Alors :

next(S,1011) =1100 et

next(S,1111) =Erreur ou Exception

(30)

Algorithme next

Algorithme (next)

next(S,s) retourne l’élément qui suit s ∈S dans la liste

SoitS l’ensemble des suites de 4 bits dans l’ordre lexicographique 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 Alors :

next(S,1011) =1100 et

next(S,1111) =Erreur ou Exception

(31)

Algorithme random

Algorithme (random)

random(S,s) retourne un element de s au hasard de manière équitable

SoitS l’ensemble des suites de 4 bits dans l’ordre lexicographique 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 Alors :

random(S)peut retourner 0011

(32)

Algorithme random

Algorithme (random)

random(S,s) retourne un element de s au hasard de manière équitable

SoitS l’ensemble des suites de 4 bits dans l’ordre lexicographique 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 Alors :

random(S)peut retourner 0011

(33)

Algorithme random

Algorithme (random)

random(S,s) retourne un element de s au hasard de manière équitable

SoitS l’ensemble des suites de 4 bits dans l’ordre lexicographique 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 Alors :

random(S)peut retourner 0011

(34)

Algorithme iter

Algorithme (iter)

iter(S) permet d’itérer sur les éléments de S

Différents protocoles :

objet avec une méthode nextet exception (Python) objet avec méthodes nextet hasNext(Java)

objet avec passage au suivant ++, déréférencement* et garde de fin (C++)

fonction de rappel (callback)

modèle producteur-consommateur (par ex. threads)

(35)

Algorithme iter

Algorithme (iter)

iter(S) permet d’itérer sur les éléments de S

Différents protocoles :

objet avec une méthode nextet exception (Python) objet avec méthodes nextet hasNext(Java)

objet avec passage au suivant ++, déréférencement* et garde de fin (C++)

fonction de rappel (callback)

modèle producteur-consommateur (par ex. threads)

(36)

Algorithme iter

Retenir (iter vs. list)

Intérêts deiter par rapport à list:

liste trop grande pour tenir en mémoire

algorithme en place, meilleur utilisation des caches de la mémoire

peut avoir unecomplexité plus faible

(37)

Algorithme iter

Retenir (iter vs. list)

Intérêts deiter par rapport à list:

liste trop grande pour tenir en mémoire

algorithme en place, meilleur utilisation des caches de la mémoire

peut avoir unecomplexité plus faible

(38)

Algorithme iter

Retenir (iter vs. list)

Intérêts deiter par rapport à list:

liste trop grande pour tenir en mémoire

algorithme en place, meilleur utilisation des caches de la mémoire

peut avoir unecomplexité plus faible

(39)

Algorithme iter

Retenir (iter vs. list)

Intérêts deiter par rapport à list:

liste trop grande pour tenir en mémoire

algorithme en place, meilleur utilisation des caches de la mémoire

peut avoir unecomplexité plus faible

(40)

Notion de classe combinatoire

Définition (Classe combinatoire)

On appelleclasse combinatoireun ensemble C dont les éléments e ont une taille (nommée aussi degrée) noté|e|et tels que

l’ensemble Cn des éléments de taille n est fini :

count({e ∈C | |e|=n})<∞

(41)

Complexité de list

Problème : liste des éléments de taillen.

Proposition

La complexité delistne peut être meilleure que O(ncount(Cn)).

(42)

Complexité de list

Problème : liste des éléments de taillen.

Proposition

La complexité delistne peut être meilleure que O(ncount(Cn)).

(43)

Complexité de iter

En revanche pour iter on peut obtenir Définition

On dit qu’un algorithme est de complexité CAT (Constant

Amortized Time)temps constant amortis si en moyenne chaque appel prend un temps constant.

Ici, le nombre d’appel à la méthodenext de l’itérateur est count(Cn). Il faut donc que

Coût total des appels ànext

count(Cn) ∈O(1)

Note : il n’y a pas de borne au coût d’un appel à la méthodenext.

(44)

Complexité de iter

En revanche pour iter on peut obtenir Définition

On dit qu’un algorithme est de complexité CAT (Constant

Amortized Time)temps constant amortis si en moyenne chaque appel prend un temps constant.

Ici, le nombre d’appel à la méthodenext de l’itérateur est count(Cn). Il faut donc que

Coût total des appels ànext

count(Cn) ∈O(1)

Note : il n’y a pas de borne au coût d’un appel à la méthodenext.

(45)

Complexité de iter

En revanche pour iter on peut obtenir Définition

On dit qu’un algorithme est de complexité CAT (Constant

Amortized Time)temps constant amortis si en moyenne chaque appel prend un temps constant.

Ici, le nombre d’appel à la méthodenext de l’itérateur est count(Cn). Il faut donc que

Coût total des appels ànext

count(Cn) ∈O(1)

Note : il n’y a pas de borne au coût d’un appel à la méthodenext.

Références

Documents relatifs

En général, la programmation dynamique est plus efficace mais plus longue à mettre en oeuvre : il faut avoir planifié l’utilisation de la mémoire... Parenthèse : mémoization

Les algorithmes d’itérations vue en cours sont pour la plupart en temps constant amorti (CAT)!. On peut trouver des algoritmes réellement en

Le temps d'exécution n'est pas proportionnel à la taille de l'entrée mais la c'est à peine moins bien, on parle parfois de complexité quasi-linéaire.. Exemple : Le

Une méthode répond au critère de composabilité modulaire si elle favorise la production d’éléments de logiciels qui peuvent être combinés librement les uns avec les autres

- le programme se compose de plusieurs fichiers source et la variable doit être utilisée dans un autre fichier que celui dans lequel elle est définie. extern

- le programme se compose de plusieurs fichiers source et la variable doit être utilisée dans un autre fichier que celui dans lequel elle est définie. extern

l Même si vous pouvez écrire une solution itérative au problème, considérer la recherche dichotomique récursive du dictionnaire :?.

l La procédure WriteBinary possède le paramètre formel par valeur N comme la seule variable locale, cependant, chaque enregistrement d’activation doit avoir deux..