Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente | Dernière révision Les deux révisions suivantes | ||
combinaisons [2010/01/10 07:31] tyrtamos |
combinaisons [2010/01/10 09:23] tyrtamos |
||
---|---|---|---|
Ligne 213: | Ligne 213: | ||
</ | </ | ||
- | ===== Combinaisons avec répétition ===== | + | ===== Combinaisons |
- | Jusqu' | + | Pour la théorie, voir par exemple: |
- | Quand l'un des éléments au moins apparait plusieurs fois dans la liste des objets, | + | ici, on a n objets |
- | Par exemple | + | Par exemple, [1,2,3] => %%[[1, 1], [1, 2], [1, 3], [2, 2], [2, 3], [3, 3]]%% alors que sans répétitions: |
- | * présence | + | ==== Nombre |
- | * présence | + | Ce nombre est égal à la combinaison |
- | Que peut-on faire avec ça? Tout dépendra de ce qu'on obtenir par rapport au problème à résoudre: | + | D'ou la fonction: |
- | * on n'a pas de répétition | + | <code python> |
+ | def combinrep(n, k): | ||
+ | """ | ||
+ | return combin(n+k-1, | ||
+ | </ | ||
- | * on a des répétitions dans la liste des objets de départ et on veut éliminer ses effets dans les résultats | + | Exemple pour [1,2,3] pris 2 à 2 avec répétition: |
- | Voyons ces 2 cas. | + | <code python> |
+ | print combinrep(3, | ||
+ | 6 | ||
+ | </ | ||
- | **__On veut des combinaisons avec répétition__** | + | ==== Liste des combinaisons |
- | Par exemple: on a [1,2,3], mais on veut obtenir une combinaison | + | On va utiliser la liste des combinaisons " |
- | Il suffit | + | * expansion |
- | Combien cela va-t-il donner | + | * calcul |
- | < | + | * élimination du résultat des redondances de sorte que chaque séquence |
- | n étant le nombre d' | + | Ce qui donne comme code: |
<code python> | <code python> | ||
- | Combin(3+2-1, 2) | + | def combinlisterep(seq, k): |
- | 6 | + | """ |
+ | # ajoute chaque objet de seq pour quils apparaissent chacun k fois | ||
+ | seq2 = [] | ||
+ | for elem in seq: | ||
+ | if elem not in seq2: | ||
+ | for i in xrange(0, | ||
+ | seq2.append(elem) | ||
+ | # calcule la liste " | ||
+ | p = combinliste(seq2, | ||
+ | # élimine de cette liste les éléments identiques (comme [1,2] et [1,2]) | ||
+ | p2 = [] | ||
+ | for x in p: | ||
+ | if x not in p2: | ||
+ | p2.append(x) | ||
+ | # et renvoie le résultat | ||
+ | return p2 | ||
+ | </ | ||
+ | |||
+ | Exemple: | ||
+ | |||
+ | <code python> | ||
+ | print combinlisterep([1, | ||
+ | [[1, 1], [1, 2], [1, 3], [2, 2], [2, 3], [3, 3]] | ||
</ | </ | ||
- | Pour calculer | + | ==== Liste des combinaisons d'une chaine de n caractères pris k à k avec répétition ==== |
+ | |||
+ | On va simplement utiliser | ||
+ | |||
+ | <code python> | ||
+ | def combinchainerep(ch, | ||
+ | return ['' | ||
+ | </ | ||
+ | |||
+ | Exemple: | ||
+ | |||
+ | <code python> | ||
+ | ch = ' | ||
+ | print combinchainerep(ch, | ||
+ | [' | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Combinaisons | ||
+ | |||
+ | Ici, on va généraliser tout ce qu'on a vu jusqu' | ||
+ | |||
+ | Par exemple, on a [1, | ||
+ | |||
+ | On voit qu'on a 8 objets, avec 5 objets distincts (le 2 apparait 2 fois, et le 4 apparait 3 fois). | ||
+ | |||
+ | Le fait que certains objets se retrouvent à plusieurs exemplaires va entrainer 2 conséquences dans la liste des résultats: | ||
+ | |||
+ | * présence | ||
+ | |||
+ | * présence de répétition de séquences dans la liste. Exemple: [2,4,5] et [2,4,5] | ||
+ | |||
+ | On va donc créer du code pour, selon le problème à résoudre, supprimer des résultats l'une ou l' | ||
+ | |||
+ | Suppression de la liste résultat des séquences comportant des répétitions d' | ||
<code python> | <code python> | ||
- | def repet(seq, m=-1): | + | def sansrepetelem(p): |
- | """ | + | """ |
- | si m==0, renvoie seq sans rien changer | + | |
- | si m==-1 (défaut), chaque élément de seq apparait len(seq) fois | + | |
- | | + | |
- | if m == 0: | + | |
- | return seq[:] | + | |
- | if m == -1: | + | |
- | m = len(seq) | + | |
r = [] | r = [] | ||
- | for elem in seq: | + | for seq in p: |
- | | + | |
- | | + | |
- | r.append(elem) | + | if seq.count(elem)!=1: |
+ | | ||
+ | break | ||
+ | if ok: | ||
+ | | ||
return r | return r | ||
- | </ | + | </ |
- | Avec cette fonction, la liste d' | + | Exemple: |
- | On peut faire la même chose avec une chaine de caractère. Par exemple, on veut la liste des mots de 3 lettres de l' | + | <code python> |
+ | p = [[1, | ||
+ | print sansrepetelem(p) | ||
+ | [[1, 2, 3]] | ||
+ | </ | ||
+ | Dans la liste résultat, suppression des séquences répétées de sorte que chaque séquence n' | ||
+ | |||
<code python> | <code python> | ||
- | ch = '' | + | def sansrepetseq(p): |
+ | | ||
+ | r = [] | ||
+ | for seq in p: | ||
+ | if seq not in r: | ||
+ | r.append(seq) | ||
+ | return r | ||
</ | </ | ||
+ | |||
+ | Exemple: | ||
+ | |||
+ | <code python> | ||
+ | p = [[1, | ||
+ | print sansrepetseq(p) | ||
+ | [[1, 2, 4], [1, 2, 3]] | ||
+ | </ | ||
+ | |||
+ | On peut même supprimer les 2 type de répétitions d'un seul coup: | ||
+ | |||
+ | <code python> | ||
+ | def sansrepet(p): | ||
+ | return sansrepetelem(sansrepetseq(p)) | ||
+ | </ | ||
+ | |||
+ | On peut aussi vouloir calculer le nombre d' | ||
+ | |||
+ | <code python> | ||
+ | def elemdiff(seq): | ||
+ | """ | ||
+ | r = [] | ||
+ | for elem in seq: | ||
+ | if elem not in r: | ||
+ | r.append(elem) | ||
+ | return len(r) | ||
+ | </ | ||
+ | |||
+ | Reprenons maintenant notre exemple plus haut: seq=[1, | ||
+ | |||
+ | |||