Bonjour,
Je cherche un algorithme qui prend en entrée une liste d'entiers (qu'on nomme `l`) dont les valeurs sont comprises dans l'intervalle 0 à N exclus, et qui produit une liste d'entiers (qu'on nomme `r`) dans le même intervalle de valeur. La liste en entrée contient au plus N valeurs.
Les contraintes de la liste produite sont:
- Sa taille doit être au plus celle la même taille que la liste d'entrée (len(r) <= len(l))
- Chaque valeur est unique, il n'y a pas de doublons
J'ai déjà programmée une version mais les contraintes ne sont respectée pour des listes qui en moyenne font une taille de N/4 soit 25%. J'aimerais un algo qui puisse accepter des listes d'au moins 50% en moyenne (75% serait encore mieux).
Voici la version en Python de cet encodeur:
Le décodeur associé:Code:def encode(l, N): size = N // 2 vals = list(range(size)) r = [] for i in l: idx = i % len(vals) v = vals[idx] if i > len(vals): v += size r.append(v) del vals[idx] return r
Enfin une fonction qui sert à vérifier les contraintes:Code:def decode(l, N): size = N // 2 vals = list(range(size)) r = [] for i in l: after = i >= size if after: i -= size v = vals.index(i) idx = v if after: v += len(vals) r.append(v) del vals[idx] return r
Code:def check(l, N): cod = encode(l, N) sz = len(cod) if sz > len(l): raise Exception('The length of the encoded list can exceed the len of the input list') if sz != len(set(cod)): raise Exception('The values are not unique') if decode(cod, N) != l: raise Exception('The decoded list is wrong')
-----