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 :

Séparer une liste de nombres en deux sous-listes dont la somme des nombres est égale


Sujet :

Algorithmes et structures de données

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2016
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Séparer une liste de nombres en deux sous-listes dont la somme des nombres est égale
    bonjour a tous
    voila mon problème ;
    j'ai une liste de nombre S; et je doit trouver 2 listes secondaires S1 et S2 égale entre elle ( la somme des valeurs de S1 doit être égale a la somme des valeurs de S2 ) comprenant toutes les valeurs de la liste S
    Si S1=S2 n'existe pas alors je doit trouver S1 le plus proche possible de S2


    Je ne vois pas comment faire cet algorithme sans un algorithme glouton qui consomme beaucoup de ram ; y a t'il un moyen de la faire sans consommer autant ?

    Merci de votre aide

  2. #2
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Est-ce que les nombres sont des nombres entiers ? Si oui, une condition nécessaire (mais pas suffisante), c'est que la somme des éléments de ta liste soit paire. Mieux : tu connais la somme de tes listes S1 et S2 ! Se sera la somme des éléments de ta liste initiale divisée par 2.

    Il ne te reste alors qu'une seule liste à faire. La seconde sera établie automatiquement avec les éléments restants.

    Ensuite, la première idée qui me vient est de tester toutes les solutions possibles. Bien entendu, il faut le faire intelligemment ! Je commencerais par trier la liste des éléments, et à rajouter les éléments au fur et à mesure dans la liste S1 en commençant par les plus gros.


    Je vois le second algorithme comme un dérivé du premier. Au lieu de chercher S/2, on cherche une liste minimisant S/2 - S1.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2016
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par dorinf Voir le message
    Est-ce que les nombres sont des nombres entiers ? Si oui, une condition nécessaire (mais pas suffisante), c'est que la somme des éléments de ta liste soit paire. Mieux : tu connais la somme de tes listes S1 et S2 ! Se sera la somme des éléments de ta liste initiale divisée par 2.
    Oui les nombre sont entiers ; la somme des éléments de la liste n'est pas obligatoirement paire ; si elle est impaire on rajoute un +1 a S1 ou S2

    rajouter les éléments au fur et à mesure dans la liste S1 en commençant par les plus gros.
    j'ai déjà fait ça dans mon algorithme mais le problème c'est que avec cette méthode le bon résultat n'est pas toujours trouvé ; j'avais pensé a réaliser un algorithme en plusieurs étapes qui après un premier algorithme affiche un premier résultat et lance un deuxième algorithme et affiche un autre résultat si il est plus pertinent

    on cherche une liste minimisant S/2 - S1
    je ne vois pas du tous comment faire cela





    pour l'instant j'ai réalisé ce début de "pré"algorithme

    Code : 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
    S=(X1,X2,X3,...,Xn)		# j'appelle X les valeurs dans le vecteur S
    sort S				#je trie dans l'ordre croissant les valeurs du vecteur S
    E=somme des Xn 			# je fais la somme de toutes les valeurs X du vecteur 
    si E%%2=0 alors :		#si E est pair alors je cherche somme S1 = somme S2 ; si S1=S2 n'existe pas (comme ici )alors je cherche S1 et S2 le plus proche possible 
    S1=somme de X1 a Xn-1		#S1= somme de toutes les valeurs sauf la dernière		
    S2=Xn				#S2= la dernière valeur du vecteur ( la plus grande parce que on a fait un sort au debut )
    Si S1=S2 FINI
    si S2>S1 FINI			# S2= la plus grande valeur du vecteur et S1= toute les autre valeur du vecteur   ; on peut donc pas faire mieux
    si S2<S1 faire :
    tant que S2<S1 faire :
    	n=n+1
    	S2=S2+Xn		# on ajoute a S2 la plus petite valeur du vecteur 
    	S1=S1-Xn		#on retire a S1 la plus petites valeur du vecteur
     
    si S2=S1 FINI
    si S2>S1 faire :

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Es-tu dans un cadre scolaire, ou dans un cadre autre. Si tu es dans un cadre autre, tu peux avoir des informations complémentaires.
    Si, dans une configuration moyenne, tu as 1000 nombres dont la somme fait 100 000, ou si tu as 1000 nombres dont la somme fait 10 000 000, la stratégie est probablement différente.
    Dans l'hypothèse 1, il y a certainement une solution pour que les 2 sous-listes fassent 50 000. Mais dans l'hypothèse 2, c'est moins probable. Et donc des algo quipeuvent être différents selon les

    Ca, c'est une chose.

    Mais 'autre chose plus importante, c'est de corriger ce que tu écris.

    Tu écris : j'ai déjà fait ça dans mon algorithme mais le problème c'est que avec cette méthode le bon résultat n'est pas toujours trouvé ;

    Dans la proposition de Dorinf, il y avait des trucs sous-entendus. Tape Parcours d'arbre informatique, ou bien arbre binaire ou des trucs comme ça sur Google, tu y verras plus clair, et tu comprendras mieux ce qu'il suggère.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  5. #5
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Tape Parcours d'arbre informatique, ou bien arbre binaire ou des trucs comme ça sur Google, tu y verras plus clair, et tu comprendras mieux ce qu'il suggère.
    Tant que tu y es , tapes "Partition problem" dans wikipedia.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  6. #6
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par albano06 Voir le message
    Oui les nombre sont entiers
    Très bon à savoir ça !

    Citation Envoyé par albano06 Voir le message
    la somme des éléments de la liste n'est pas obligatoirement paire ; si elle est impaire on rajoute un +1 a S1 ou S2
    Ca ne veut rien dire. Tu cherches à faire en sorte que S1 et S2 soit le plus proche possible, c'est ça ?

    Citation Envoyé par albano06 Voir le message
    j'ai déjà fait ça dans mon algorithme mais le problème c'est que avec cette méthode le bon résultat n'est pas toujours trouvé ; j'avais pensé a réaliser un algorithme en plusieurs étapes qui après un premier algorithme affiche un premier résultat et lance un deuxième algorithme et affiche un autre résultat si il est plus pertinent
    Il ne s'agit pas de construire une unique solution et de voir si elle convient, il s'agit de les explorer toutes mais en choisissant l'ordre d'exploration. tbc92 et pseudocode t'ont donné des pistes quant au nom des problèmes se rapprochant du tien.

    on cherche une liste minimisant S/2 - S1
    je ne vois pas du tous comment faire cela
    Si tu parcours l'ensemble des possibilités, faire ce calcul est très simple. La première étape est donc de résoudre le problème initial, avant de résoudre le second.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  7. #7
    Membre actif

    Homme Profil pro
    Apprenti Langage C, pratiquant OpenOffice et Poo
    Inscrit en
    Février 2015
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre (Centre)

    Informations professionnelles :
    Activité : Apprenti Langage C, pratiquant OpenOffice et Poo
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 229
    Points : 218
    Points
    218
    Par défaut
    Bonjour,

    En utilisant la démarche d'un botaniste : "identifier - ranger- exploiter" tu peux obtenir un résultat assez précis.

    Identifer : calcules le rapport entre chaque valeur et le 100ème(ou 1000ème selon la précision souhaitée) du total cible
    Ranger : ranges chaque valeur par rapport correspondant
    Manipuler : ajoutes chaque valeur selon son rapport pour obtenir le total désiré.

    Ex : 20/100 + 30/100 + 50/100 = total

    Considère comme total cible S1 + S2.
    Pascaltech

    Traduction : guides, manuels, normes : http://tradinfo.e-monsite.com/

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 103
    Points : 110
    Points
    110
    Par défaut
    Bonjour Albano06,

    Je parierais qu'il s'agit du projet de programmation d'Albano06 à l'UNS

    C'est une bonne initiative de demander de l'aide, et de t'être inscrit sur le site.

    Cela serait encore mieux de lire d'abord les ressources mises à ta disposition dans le cadre du projet (notamment les pages wikipedia).

    Je ne vois pas comment faire cet algorithme sans un algorithme glouton qui consomme beaucoup de ram ; y a t'il un moyen de la faire sans consommer autant ?
    Justement, les gloutons sont rapides et peu gourmands, généralement, au détriment de l'exactitude.

Discussions similaires

  1. [Débutant] Récupérer une liste d'objet avec leurs sous liste
    Par Oussema86 dans le forum Linq
    Réponses: 1
    Dernier message: 18/01/2016, 13h55
  2. Réponses: 2
    Dernier message: 25/05/2012, 17h28
  3. Nombre de colonnes sous list.gsp
    Par Robin56 dans le forum Grails
    Réponses: 3
    Dernier message: 20/08/2010, 13h35
  4. Réponses: 4
    Dernier message: 13/11/2007, 15h43

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