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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Par défaut Recherche dichotomique dans une matrice n*n
    Bonjour, j'essaye d'implémenter un algorithme de recherche d'élément par dichotomie (récursif si possible) sur une matrice trié par ligne et par colonne mais je n y arrive pas trop voir même pas du tout.
    Sur un tableau 1D j' y arrive parfaitement mais sur une autre matrice c'est une autre affaire.

    Voici un exemple de matrice triée :

    1 2 5 9
    8 12 15 17
    10 13 16 19
    11 14 17 23

    J'ai pensé à diviser à prendre l'élément du milieu par exemple 13, puis comparer l'élément x recherché a 10 (premier élément de la ligne du milieu) et a 19 (dernier élément de la ligne du milieu). Si x > 10 et x > 19 alors on recherchera en bas de du milieu.
    Si x < 10 et x < 19 on recherchera en haut du milieu etc ..
    Ensuite faire de même à gauche et a droite, donc on divise la matrice en 4 en quelque sorte.
    Mais il reste plusieurs sous cas que je ne trouve pas et je ne suis même pas sur que c'est faisable.
    Merci de m'aider

  2. #2
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonjour.

    D'abord j'imagine que tes lignes sont triées en fonction de leur premier élément seulement ? Mais qu'entre deux lignes consécutives, deux éléments de la même colonne (hormis le premier) peuvent être arbitrairement ordonnés ? Autrement dit on peut affirmer que M[i,0] < M[j,0] mais on ne peut rien dire sur M[i,k] et M[j,k] ?

    Si oui tu ne peux pleinement exploiter la dichotomie que sur la dimension horizontale, au sein d'une ligne. Mais entre les lignes tu ne peux utiliser la dichotomie que pour rechercher la dernière des lignes à scanner. En effet tu ne dois scanner que les i tels que M[i,0] <= x. Mais tu dois impérativement scanner tout ce sous-ensemble. Soit un O(n.log(n))



    Si en revanche je me trompe et que M[i,k] < M[j,k] quel que soit k et quels que soient i < j, alors je pense que la bonne stratégie est de chercher (en utilisant la dichotomie) la dernière des ligne à parcourir d'après le premier élément, puis au sein de ce sous-ensemble la dernière des colonnes à parcourir en utilisant la dernière ligne, puis au sein de ce sous-ensemble la première des lignes en utilisant la dernière colonne, puis la première colonne en utilisant la première ligne, etc. Autrement dit tu décrirais une spirale pour circonscrire un rectangle de plus en plus petit. C'est du O(2*log(n) + 2*log(n/2) + 2*log(n/4) + ...). C'est inférieur à O(log(n)*log(n)) puisqu'on a log2(n) termes. Je pense qu'on ne peut pas faire mieux.

  3. #3
    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 : 46
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Bonjour,

    dans le cas d'une matrice, la dichotomie n'est plus l'algorithme le plus approprié : tu ne supprimes plus la moitié des éléments, mais un quart.
    Il existe une recherche beaucoup plus 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.

  4. #4
    Membre averti
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Par défaut
    @donquiche
    Si il y a une relation d ordre entre deux elements d'une même colonne :

    1 2 5 9
    8 12 15 17
    10 13 16 19
    11 14 17 23

    Ici : 1<8<10<11 et même raisonnement pour les autres colonnes
    Pour les lignes : 1<2<5<9

    Je pense qu'un algo en o(n) est faisable : en comparant l element cherché à chaque premier élement des lignes de la matrice, puis en effectuant une dichotomie sur la ligne qui correspond.
    Mais y aurai-t-il un un algorithme de meilleur complexité??

  5. #5
    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 : 46
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Citation Envoyé par kenzo75 Voir le message
    Mais y aurai-t-il un un algorithme de meilleur complexité??
    Pour une matrice de taille NxM, il y a un algorithme en O(N+M). Il suffit de partir d'en bas à gauche et de comparer la valeur avec celle cherchée : plus petit tu montes, plus grand tu vas à droite.
    Cela est possible car ta matrice est doublement triée.
    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.

  6. #6
    Membre averti
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Par défaut
    Je pense aussi que c'est la meilleure implémentation, j vais essayer ça, biensur si quelqu'un d'autre à meilleure j'suis preneur.
    Merci pour tout

  7. #7
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    Pour une matrice de taille NxM, il y a un algorithme en O(N+M). Il suffit de partir d'en bas à gauche et de comparer la valeur avec celle cherchée : plus petit tu montes, plus grand tu vas à droite.
    Cela est possible car ta matrice est doublement triée.
    Citation Envoyé par kenzo75 Voir le message
    @donquiche
    Si il y a une relation d ordre entre deux elements d'une même colonne :
    Alors c'est le second cas de figure pour lequel j'avais proposé un algo en O(ln(n) * ln(n)), ce qui est meilleur que du O(n+n).

  8. #8
    Membre averti
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Par défaut
    @donquiche
    Je ne comprends pas trop l'algo, y aurait moyen de l'expliquer un peu plus , ou donner un exemple ? Merci

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