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 :

Recherche dichotomique dans une matrice n*n


Sujet :

Algorithmes et structures de données

  1. #21
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    On ajoute 1 quand on veut passer du "plus grand inférieur ou égal" au "plus petit supérieur"

  2. #22
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    Mon algo est aussi trivial que rapide et s'implémente en quelques minutes. Commence donc par faire un test avec, puis tu essaies d'optimiser en testant les autres.
    j'ai pas compris ton algo. Ca a l'air intéressant. Tu peux le mettre en pseudo-code ?
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

  3. #23
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Je me permet de le mettre :

    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
    17
    18
    find(x, matrix[n][m]):
     
      i = n - 1;
      j = 0;
      found = false;
     
      while(NOT found AND i >= 0 AND j < m) :
        if (x > matrix[i][j])
          ++j;
        else if(x < matrix[i][j])
          --i;
        else
          found = true;
     
      if(found) :
        print "Element aux indices (" i "," j ")."
      else
        print "Element non trouvé."

  4. #24
    Futur Membre du Club
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 9
    Points
    9
    Par défaut
    @donquich
    La dichotomie sur la ligne du haut et la colonne de gauche ne permettent que de faire un decalage de 1 si elles ne contiennent pas la valeur cherchee je ne me trompe pas?
    Si c est bien le cas j ai implementé l'algo correspondant en java mais je ne peux pas le diffuser ici avant 2 semaine, puis je vous l envoyer par mp pour verifier et confirmer la complexité? Puis je posterai biensur a la fin de ce delai.

  5. #25
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    @kenzo
    Non, pas forcément, considère par exemple la matrice suivante et la valeur 14, on peut exclure les deux lignes du bas d'après la colonne de droite.
    1 2 5 7
    8 9 11 12
    10 13 16 19
    11 14 17 23

    Concernant la vérification, je t'engage plutôt à faire des tests. D'abord parce que je n'ai pas envie de me fatiguer à le relire, ensuite parce que de toute façon je ne suis pas infaillible.


    Enfin, autre variante possible de l'algo que je viens de remarquer : à chaque valeur considérée on peut éliminer un quart de la matrice et diviser le problème en deux sous-matrices. Par exemple si je prends la valeur du milieu de la matrice (13) et que la valeur cherchée est inférieure à 13, alors je peux toujours éliminer les valeurs en bas à droite (en rouge). Ou le quart inférieur gauche si on cherche une valeur supérieure à 13.
    01 02 05 07
    08 09 11 12
    10 13 16 19
    11 14 17 23


    Après ça le problème peut être divisé en deux matrices, l'une d'elles contenant la bonne valeur.
    01 02 05 07
    08 09 11 12

    10
    11


    La complexité est du même acabit que le précédent algo mais celui-ci est peut-être un peu plus simple à comprendre et peut mieux se comporter.

  6. #26
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Pour mon algo, sur un tableau T(M,N), on cherche V :
    - commencer en bas à gauche T(0,N), soit x=0, y=N.
    - Tant que V n'est pas trouvé et que l'on est dans la matrice
    ----- si T(x,y) == V , sortir.
    ----- sinon si T(x,y) < V => x++
    ----- sinon si V < T(x,y) => y++
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  7. #27
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut c'est beau !
    Citation Envoyé par Trademark Voir le message
    Je me permet de le mettre :

    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
    17
    18
    find(x, matrix[n][m]):
     
      i = n - 1;
      j = 0;
      found = false;
     
      while(NOT found AND i >= 0 AND j < m) :
        if (x > matrix[i][j])
          ++j;
        else if(x < matrix[i][j])
          --i;
        else
          found = true;
     
      if(found) :
        print "Element aux indices (" i "," j ")."
      else
        print "Element non trouvé."
    en effet c'est magnifique !

    ça me fait réflachir que l'algo de sedjevick que j'ai proposé n'est pas adapté à la question posée. Il concerne une recherche dans un nuage de points du plan.
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

  8. #28
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Citation Envoyé par Trademark Voir le message
    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
    17
    18
    find(x, matrix[n][m]):
     
      i = n - 1;
      j = 0;
      found = false;
     
      while(NOT found AND i >= 0 AND j < m) :
        if (x > matrix[i][j])
          ++j;
        else if(x < matrix[i][j])
          --i;
        else
          found = true;
     
      if(found) :
        print "Element aux indices (" i "," j ")."
      else
        print "Element non trouvé."
    Ben c'est l'algo que j'avais proposé : aussi simple que rapide !
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

Discussions similaires

  1. [XL-2007] VBA Recherche titre dans une matrice
    Par vivi4561 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/05/2011, 15h43
  2. [XL-2007] Recherche chronologique dans une matrice
    Par lebonprince dans le forum Excel
    Réponses: 20
    Dernier message: 10/05/2010, 17h18
  3. [find] Comment rechercher une valeur dans une matrice
    Par VanessaDu67 dans le forum MATLAB
    Réponses: 6
    Dernier message: 06/06/2007, 14h55
  4. [Débutant] Recherche de minimum non nul dans une matrice
    Par sebastien69 dans le forum MATLAB
    Réponses: 2
    Dernier message: 05/06/2007, 16h00
  5. Réponses: 1
    Dernier message: 24/05/2007, 14h46

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