• Aucun résultat trouvé

Algorithmes combinatoires : comptage, génération et tirage aléatoire

N/A
N/A
Protected

Academic year: 2022

Partager "Algorithmes combinatoires : comptage, génération et tirage aléatoire"

Copied!
38
0
0

Texte intégral

(1)

Algorithmes combinatoires :

comptage, génération et tirage aléatoire

Florent Hivert

Mél : Florent.Hivert@lri.fr

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

(2)

Références

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

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

CombinatorialAlgorithms.pdf Frank Ruskey, Combinatorial Generation doi:10.1.1.93.5967, non publié The (Combinatorial) Object Server : http://sue.csc.uvic.ca/~cos/

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

(3)

Algorithmes combinatoires

Manipulation d’ensembles finis :

Exemples d’ensembles finis : suites de 64 bits permutés d’un tableaux arbres binaires àn-feuilles graphes à n-sommets

arbres couvrants d’un graphe donné programmes à n caractères en C document XML à n balises

(4)

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

(5)

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

(6)

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

(7)

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

(8)

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

(9)

Algorithme list

Version récursive :

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

Version Itérative en utilisant la base 2.

(10)

Algorithme list

Version récursive :

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

Version Itérative en utilisant la base 2.

(11)

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

(12)

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

(13)

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

(14)

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

(15)

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

(16)

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

(17)

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

(18)

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

(19)

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

(20)

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,0000) =Erreur ou Exception

(21)

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,0000) =Erreur ou Exception

(22)

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,0000) =Erreur ou Exception

(23)

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,0000) =Erreur ou Exception

(24)

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

(25)

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

(26)

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

(27)

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)

(28)

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)

(29)

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

(30)

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

(31)

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

(32)

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

(33)

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})<∞

(34)

Complexité de list

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

Proposition

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

(35)

Complexité de list

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

Proposition

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

(36)

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.

(37)

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.

(38)

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

La méthode de gradient à pas constant consiste à résoudre le système linéaire de manière itérative en cherchant un minimum de J par descente de gradient.. Programmer la méthode

Toutes les spécialités peuvent être concernées si elles répondent au projet médical partagé du territoire, mais une priorité sera donnée aux parcours prioritaires du PRS et

- Avoir la formation et certification Pompier I de l’École nationale des pompiers du Québec ou un DEP en sécurité incendie ou être disposé à suivre une de ces formations;. -

Dans le cas spatial, nous introduisons le boson sampling qui consiste à calculer quelles sont les corrélations spatiales d'une paire de photon à la sortie d'un réseau de

Il y a donc une ligne directe entre Bibliothèque et Archives nationales du Québec et le désormais loin- tain Institut canadien de Montréal (1844-1880), dont nous avons acquis

fréquentielle dans la bande passante pour les ltres de T chebyche de type I.. Les ltres ci-dessus sont des ltres dits tout pôles pour lesquels le

Résumé — La maximisation d'une fonction strictement concave sur un domaine convexe est remplacée par une suite de problèmes à contraintes linéaires, le nombre de ces

D´ eterminer la bonne valeur de seuil pour arrˆ eter la r´ ecursion au profit d’un tri par selection.. 7