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 :

Trouver efficacement à quel intervalle appartient un élément


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2018
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 104
    Par défaut Trouver efficacement à quel intervalle appartient un élément
    Bonjour,

    Pour un segment [a,b], j'ai une subdivision donnée de taille N: le segment est divisé en N sous-segments disjoints dont la réunion fait [a,b].
    Etant donnée une valeur x, je souhaiterais savoir à quel intervalle de la subdivision il appartient, si possible en temps constant.
    J'ai fait quelques recherches, et j'ai trouvé ce sujet. Mais la meilleure solution reste en O(log(N)) au pire.

    Cependant, je suis intrigué sur le fait que ce ne soit pas possible de le faire en temps constant pour deux raisons :
    - on peut imaginer une discrétisation du segment, qui transforme alors ce dernier en tableau dans lequel chaque élément correspond à l'indice du sous intervalle correspondant. On a alors une complexité constante: il faut juste lire la valeur dans le tableau. Evidemment, on ne peut pas se permettre de discrétiser le segment, mais je me dit (sûrement à tort) que ce qui est faisable en discret peut être faisable en continu...
    - le problème me fait penser aux tables de hachage (que je ne connais pas très bien), qui à une valeur en associe une autre en temps constant. N'y aurait-il pas moyen de ramener nos sous-intervalles à ces valeurs?

    De plus, je peux me permettre de faire un travail préliminaire (connaissant la subdivision mais pas la valeur x) qui n'a pas besoin d'être en temps constant.

    Voilà, si vous connaissez des méthodes dans ce domaine, ou que vous avez des idées sur le sujet, je suis preneur.
    Merci d'avance

    PS: mon problème est en fait en deux dimensions: un rectangle divisé en sous-rectangles, mais je pose d'abord le problème en une dimension, en espérant ensuite pouvoir le ramener en 2D (voire n dimensions )

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 489
    Par défaut
    salut

    en prenant la valeur median de ton segment et faire une recherche dichotomique cela ne le ferais pas ?
    il Faut chercher la valeur la plus proche et normalement tu trouve le bon segment
    pour la 2d il faudra prendre le point median en x et en y et appliquer la meme regle sur les rectangle cela devrais te limiter ta recherche
    ce qui te donne une complexité de ... O(logn) je ne pense pas que tu pourra pas faire mieux

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2018
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 104
    Par défaut
    Citation Envoyé par anapurna Voir le message
    en prenant la valeur median de ton segment et faire une recherche dichotomique cela ne le ferais pas ?
    [...]
    une complexité de ... O(logn) je ne pense pas que tu pourra pas faire mieux
    Salut. Merci d'avoir porté ton intérêt au problème.
    Oui, la dichotomie est une solution pour obtenir du log(N), comme il l'a été évoqué dans le sujet que j'ai indiqué.
    Mais j'ai toujours espoir qu'il y ait une solution en temps constante (éventuellement avec un travail préliminaire non constant) dans la mesure où j'ai évoqué deux problèmes proches résolubles en temps constant...

  4. #4
    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 : 52
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par AbsoluteLogic Voir le message
    le problème me fait penser aux tables de hachage (que je ne connais pas très bien), qui à une valeur en associe une autre en temps constant.
    C'est en temps constant seulement si on fixe un certains nombres de paramètres, en particulier le nombre de bits et d'opérations par bit.

    De même, ta recherche dichotomique en o(log(n)) sera "en temps constant" si tu fixes le nombre de subdivisions N.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour

    L'équivalent continu d'un tableau (associatif ou non) s'appelle une fonction.
    En l'occurrence, ici, c'est une fonction en escalier.

    Charge pour toi de trouver la meilleure façon de définir.

    Je pense en particulier à la fonction sigmoïde utilisée dans les réseau de neurones, que tu peux utiliser comme une fonction de heaviside que tu empilerais.

    Formule mathématique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gnuplot> plot [0:10][0:10] 0, 2/(1+exp(100*(-x)))+ 5/(1+exp(100*(5-x))) - 3/(1+exp(100*(8-x)))
    Nom : sigmoidePourEscalier.png
Affichages : 746
Taille : 7,9 Ko

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Déjà, comment représentes-tu ton rectangle initial par rapport aux sous rectangles ?
    Ont-ils une largeur et longueur différente ou seulement soit la longueur soit la largeur ?

    Comment représentes-tu X dans le plan ?

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2018
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 104
    Par défaut
    Merci à tous pour avoir pris le temps de me répondre

    Citation Envoyé par pseudocode Voir le message
    C'est en temps constant seulement si on fixe un certains nombres de paramètres, en particulier le nombre de bits et d'opérations par bit.

    De même, ta recherche dichotomique en o(log(n)) sera "en temps constant" si tu fixes le nombre de subdivisions N.
    Certes, j'imagine que tu veux mettre en avant qu'il y a une infinité d'intervalle possibles, alors qu'un dictionnaire prend un nombre fini d'entiers possibles en entrée.
    Mouais, je ne suis pas convaincu, en allant par là, même le nombre d'intervalle possibles est fini puisque leurs extrémités sont codées sur un certain nombre de bit...


    Citation Envoyé par Flodelarab Voir le message
    Bonjour

    L'équivalent continu d'un tableau (associatif ou non) s'appelle une fonction.
    En l'occurrence, ici, c'est une fonction en escalier.

    Charge pour toi de trouver la meilleure façon de définir.

    Je pense en particulier à la fonction sigmoïde utilisée dans les réseau de neurones, que tu peux utiliser comme une fonction de heaviside que tu empilerais.
    Houlà, ça fait drôle d'entendre parler des réseaux de neurones et des fonctions sigmoïde, alors que c'est justement ce que je suis en train d'étudier à mon école! Mais en aucun j'en aurai parlé sur ce sujet ^^
    C'est vrai, l'idée serait tout simplement d'évaluer une certaine fonction en escalier. Mais je ne pense pas qu'une fonction de Heaviside soit une solution, puisque si l'on considère la complexité par rapport à l'opération la plus longue - ici l'exp -, on reste en temps linéaire par rapport au nombre d'intervalle.
    Je fais alors le raisonnement suivant:
    Pour évaluer la fonction en escalier en temps constant, il faudrait le représenter par son graphe. Mais cela implique de le discrétiser puisqu'on est en informatique . On pourrait donc se dire que ça ne sert à rien: on a justement pris une fonction pour rendre le problème continu, qu'est-ce qu'il raconte là?
    En fait, ça me donne une idée: si on prend comme pas de discrétisation la longueur du plus petit intervalle de notre liste, on peut représenter la subdivision par un tableau dont chaque élément correspond à un pas, et contient le triplet (intervalle de gauche, abscisse de changement, intervalle de droite) si il y a un changement d'ordonnée sur ce pas. Et puisque le pas correspond à la longueur du plus petit intervalle, alors il ne pourra pas y avoir deux changements d'intervalle sur le même pas.
    Nom : FonctionEscalier.png
Affichages : 667
Taille : 1,9 Ko
    Du coup, cela répond à mon problème: on pourra, avec x donné, récupérer l'intervalle correspondant en allant chercher dans le tableau l'élément correspondant et en faisant une comparaison de x avec "l'abscisse de changement". Cela se fait en temps constant, avec une préparation d'un coût non constant. Mais le problème, c'est que l'on est même pas en mesure de connaître ce coût de préparation (et la mémoire occupée) en fonction du nombre d'intervalle, puisque ce sera en O((b-a)/(longueur minimale)).
    Mais bon, si la complexité de la préparation n'a pas besoin d'être majorée, ça va. Et libre à nous de trouver un compromis en permettant par exemple de pouvoir encoder 2 (ou plus) changements de valeur sur un pas au lieu d'un seul.
    Voilà, je marque le sujet en résolu. Mais il n'est pas interdit de proposer des solutions encore plus performantes, à la fois en terme de mémoire consommée ou de complexité de préparation.

    Citation Envoyé par disedorgue Voir le message
    Déjà, comment représentes-tu ton rectangle initial par rapport aux sous rectangles ?
    Ont-ils une largeur et longueur différente ou seulement soit la longueur soit la largeur ?

    Comment représentes-tu X dans le plan ?
    C'est juste un ensemble de rectangles qui en "pave" un plus gros comme sur la figure suivante:
    Nom : Rectangles1.png
Affichages : 645
Taille : 3,3 Ko
    Et je peux facilement me ramener à un problème en une dimension, en me ramenant à un quadrillage séparant tous ces rectangles, en en étudiant séparément les abscisses et les ordonnées:
    Nom : Rectangles2.png
Affichages : 662
Taille : 1,2 Ko

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Et si j'ai bien compris, X est un point et le but est de savoir dans quel rectangle il se trouve ?

    Et dans un espace à 3 dimensions, l'algo doit aussi fonctionner ?

    Je pose cette question, car pour le cas du plan rectangulaire, intuitivement, je pense que c'est possible de passer par des vecteurs, mais comme je dis, pour l'instant c'est juste intuitif, donc pas encore sur de moi...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. A quel classeur appartient la macro en cours d'exécution ?
    Par Oliv- dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/07/2008, 12h59
  2. savoir à quel paquet appartient un fichier ?
    Par mamelouk dans le forum Administration système
    Réponses: 4
    Dernier message: 30/03/2007, 11h12
  3. Algorithme pour trouver efficacement le matching complet (appairement) optimal ?
    Par LordFarquaad dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 28/03/2007, 10h27
  4. Réponses: 4
    Dernier message: 11/11/2006, 02h11
  5. Trouver a quel batiment appartient une classe?
    Par danje dans le forum Langage SQL
    Réponses: 5
    Dernier message: 01/09/2005, 18h53

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