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 :P)
3 pièce(s) jointe(s)
Trouver efficacement à quel intervalle appartient un élément
Bonjour, :D
Je crois que toute la difficulté de ton projet vient de ce qu'il n'est pas réductible à deux problèmes plus simples, à une dimension:
Citation:
Envoyé par
AbsoluteLogic
... 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.
...
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 :P)
En effet, le découpage en intervalles sur chacun des axes que tu espères
fait intervenir des limites interdépendantes
Il te faut donc définir un ensemble fini de sous-domaines caractérisés par quatre bornes (xi, xj, yk, yl) et associés au booléen
pour obtenir une partition du domaine initial, c'est à dire un partage sans recouvrement mutuel, ni espace vide résiduel.
1 pièce(s) jointe(s)
Trouver efficacement à quel intervalle appartient un élément
On pourrait envisager la constitution de deux listes constituées des seuils successifs délimitant les sous-domaines, sur chacun des axes (x'x) et (y'y):
Code:
1 2 3 4
| CONST Nx = 5; Ny = 4;
VAR LstX: ARRAY[1..Nx] OF Reel; // LstX = (X1, X2, X3, X4, 1)
VAR LstY: ARRAY[1..Ny] OF Reel; // LstY = (Y1, Y2, Y3, 1) |
puis ensuite une matrice rectangulaire (Nx*Ny) qui caractériserait la partition en livrant la correspondance entre frontières horizontales et verticales.
Dans le cas illustré ci-dessous:
la matrice présenterait l'allure suivante:
Code:
1 2 3 4 5 6 7 8 9 10
|
i\j 1 2 3 4 5
1 1 4 4 7 7
2 2 4 4 7 7
3 3 3 5 7 7
4 3 3 6 6 8 |
en convenant de caractériser par leur rang les 8 sous-domaines rencontrés successivement au cours d'un balayage de haut en bas et de gauche à droite - donc dans le sens croissant des indices (i, j).