IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Codage/décodage d'une liste d'entiers en une autre liste d'entiers uniques


Sujet :

Algorithmes et structures de données

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Codage/décodage d'une liste d'entiers en une autre liste d'entiers uniques
    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).

    SVP arrêtez de dire que c'est impossible, lisez correctement tout. J'ai mis après une version qui fonctionne, mais je veux juste un algo qui fasse ce travail avec des listes beaucoup plus longues que N/4, genre N/2 ou 3N/4, il sera évidemment impossible d'avoir en entrée une liste de taille supérieure à N sans avoir de doublon (à cause du principe du tiroir à chaussettes).

    Voici une version en Python de cet encodeur:
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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

    Le décodeur associé:
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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

    Enfin une fonction qui sert à vérifier les contraintes:
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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')
    Dernière modification par Invité ; 06/08/2020 à 20h04.

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/10/2005, 21h34
  2. Réponses: 3
    Dernier message: 08/10/2005, 00h02
  3. Soustraire une liste d'une autre.
    Par NicoNGRI dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/10/2005, 11h00
  4. Formulaire avec liste basée sur une autre table
    Par sabotage dans le forum Langage SQL
    Réponses: 6
    Dernier message: 10/08/2005, 13h43
  5. Griser 1 liste déroulante liée à une autre, pb de concaténat
    Par linou dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/03/2005, 16h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo