Michel Scholl CNAM and INRIA
February 1, 2002
0-0
Plan
1. Introduction: applications visées, qualités d’un index, limites.
2. Indexation spatiale: Structures "space driven" (Grid, structures linéaires) 3. Indexation spatiale: Structures "data driven" (Rtree)
4. Indexation multi-dimensionnelle, autres opérations
Introduction
espace multi-dimensionnel
On se restreint à un espace à deux ou trois dimensions 1. SIG et aplications spatio-temporelles
2. La représentation de circuits a une problématique voisine
3. La représentation et l’interrogation de scènes fixes ou animées peut utiliser certaines techniques, e.g. “quand l’objet est-il à gauche de l’objet ”
4. robotique 5. etc.
Qu’est-ce qu’on indexe?
1. Des points, des lignes et des polygones (Représentation vecteur)
1. Parce qu’on ne peut pas utiliser l’arbre B 2. En effet
Celui-ci repose sur l’existence d’un ordre total sur le domaine de la clé (2 objets dont les clés d’accès sont proches dans l’espace des clés sont proches en
mémoire)
Il n’y a pas d’ordre spatial qui respecte totalement la proximité
Pour quelles opérations l’indexation est-elle utile?
Pour accélérer:
1. le pointé: retrouver l’objet qui contient un point donné
2. le fenêtrage: retrouver les objets contenus dans ou coupant une fenêtre donnée 3. la recherche des points les plus proches d’un point donné, notamment dans les
espaces de grande dimension (similarité entre objets, voir exposés) 4. les jointures spatiales
5. etc...
Plusieurs prédicats de jointure (intersection, au sud de, le plus proche de, etc.) Exemple : Superposition (map overlay)
1. on prend deux thèmes (OS et communes)
2. on veut la partie boisée des communes du Haut-Rhin
3. il faut pour toutes les communes du Haut-Rhin, pour toutes les parcelles boisées (de France), faire l’intersection de polygones.
Indexation de lignes et de polygones
Dans le cas de points, on indexe les points eux-même.
Dans le cas de lignes et de polygones, – On n’indexe pas les objets spatiaux – mais une approximation
– on utilise très couramment comme approximation, l(’hyper)e Rectangle englobant minimum (REM)
Le pointé ou le fenêtrage de lignes et polygones se font alors en deux étapes :
1. Filtrage des REM qui contiennent le point (qui coupent la fenêtre): on restreint l’ensemble de départ à un très petit ensemble de REM correspondant à un
surensemble de la solution;
2. Raffinement: Test géométrique en séquence des objets obtenus à la première étape:
Exemple de test géométrique : PointdansPolygone, RectanglecoupeLigne, etc.
2 catégories d’index
1. space-driven: partitionnement de l’espace indépendant de la collection d’objets spatiaux, e.g. la Grille, l’ordre z
2. data-driven: le partionnement de l’espace dépend de la distribution des données, e.g.
les Arbres R
Qu’est-ce qu’on attend d’un Index spatial?
1. Efficacité en temps et espace pour la recherche d’objets (points ou rectangles) 2. Mises à jour dynamiques efficaces
Complexité d’une recherche
taille de la collection d’objets: N Capacité d’une page : B
taille du résultat: T Index optimal:
1. temps de recherche O(
) 2. temps de mise à jour O(
) 3. espace nécessaire O(N/B)
Les index ci-dessous ne sont pas optimaux mais ont un bon comportement en moyenne.
Index space-driven
La grille régulière pour les points
1. Quadrillage régulier du plan en cellules rectangulaires élémentaires r, 2. A chaque cellule r, une page du disque,
3. un point est mis dans la page de r, s’il est dans la cellule r, 4. si la page déborde, on alloue une page de débordement.
Pointé avec la grille régulière
1. calcul du rectangle r qui contient p 2. accès à la page associée à r
3. parcours de cette page et de sa ou ses pages de débordement pour voir si elle(s) contiennent le point p
y
a b
x
1 1
x1 x2 x3 x4
x0 y2
y1 y0 y3 y4
l k
[k,l]
...
[a,b]
...
Figure 1: Quadrillage régulier
adresses de page associées à un rectangle sont dans tableau GRID (N)
Détermination du rectangle contenant p : simple calcul
Accès à GRID(I) contenant l’adresse de page : rapide sauf si grille ne tient pas en mémoire.
2e phase: accès à une ou plusieurs pages.
Inconvénients
Technique Simple
mais beaucoup d’inconvénients: performances se dégradent en cas de croissance du fichier, de non uniformité, la grille doit etre en mémoire centrale, etc.
Quand une page déborde, on coupe la cellule en deux: le partitionnement s’adapte à la distribution des points.
On a besoin d’un répertoire et de deux échelles. Quand on insère, 3 cas:
1. Pas de débordement, on calcule grâce à l’échelle la cellule, le point est mis dans la page associée
2. Débordement d’une cellule mais pas du répertoire (D dans la figure): une page p4 est affectée lors de l’insertion de Pf
3. Débordement d’une cellule et du répertoire: plus compliqué, voir cas C dans la figure.
... ...
... ...
... ...
... ...
A -
C - D -
B -
p3 p1
p1 p2
p2 p4 p2
p3 p1
p1
a
c
b
d f
e
Figure 2: Insertion dans une grille
Indexation de rectangles (REM) avec une grille
1. on affecte un rectangle à toutes les cellules avec lesquelles l’intersection est non nulle
2. Très forte redondance
3. Insertion et débordements: voir figures, analogue au cas des points.
9,10,13 [8.11.12.13]
p4 p2
...
x1
1
4
11
3 13
2 c3
c2
6
9 5
y0
x0 x1 x2 x
y y3
y2
y1
0
c4
c5 c6
y2 y3
y1 y0
2 1 3
1 2
p5
p4 p5
p3 p1
p4 p2
1,2,5,6 12
8
10 7
c1
x2 x0
Figure 3: Une grid file pour les rectangles
Le pointé avec la Grid File por les REM
Deux étapes:
1. Filtrage: on récupère la liste des objets dont les rems contiennent le point 2. Raffinement: on fait le test PointDans Rectangle pour chaque objet de la liste
obtenue dans l’étape de filtrage.
Algorithm PointQuery (P(a, b): Point): set(oid) begin
result: set(oid)
// Compute the cell containing P i = Rank(a, ); j = Rank(b,
) page = ReadPage (DIR[i,j].PageID) for each (e in page)
if (P e.mbb) result += { e.oid}
end for
return result end
begin
result: set(Oid)
// Compute the low-left cell intersecting W i1 = Rank(x1, ); j1 = Rank(y1,
)
// Compute the top-right cell intersecting W i2 = Rank(x2, ); j2 = Rank(y2,
) // Scan the grid cells
for (i=i1; i i2; i++) for (j=j1; j j2; j++)
// Read the page, and test each entry page = ReadPage ( DIR[i,j].PageID)
for each (e in page)
if ( ) result += { e.oid}
end for end for end for
// Sort the result, and remove duplicates sort(result); RemoveDupl (result);
return result end
9,10,13 8,11,12,13 1,2,5,6 5,6,14
...
4
7
8
13 3 12
2
9 10
y0
x y2
y1
0
y1 y0
2 1
1 6
3 2
p5 p6
p1
p3 p4
p2 p1 p3
p2 p4
x0 x3 x1 x2
Figure 4: Insertion de l’objet 14
1,2,5,6 5,6,14
9,10,13
p4 DIR
8.11.15
p2
8,12,13,15 1
4
7
8
11
13 3 12
2
9 10
y0
x y
y3
y2
y1
0
y2 y3
y1 y0
2 1 3
1
...
14
6 5
3 2
x1
x0 x3 x2
15
p5 p6
p1 p3
p5 p6 p7 p4 p3 p1 p2
p7
x3
x0 x1 x2
Figure 5: Insertion de l’objet 15
15 8
13 12
y0
x0 x1 x2 x
y2
y1
0
y2 y1 y0
2 1
1
...
3 2
P P.y
P.x
p5 p6
p1 p3 p3
p1 p2 p4
p4
1,2,5,6 5,6,14 8.11.15
p7
8,12,13, 15
Figure 6: PointL’ avec la grid file
Inconvénients de la Grid file
Plus la taille de la collection est grande:
1. plus grand le risque que le répertoire ne tienne plus en mémoire
2. plus la redondance augmente: exponentiellement lorsque la taille des rems s’approche de la taille des cellules
Structures linéaires
1. L’espace est partitionné en cellules
2. Rectangles (ou points) affectés à des cellules 3. Cellules ordonnées et indexées par un arbre B
4. Clé dans l’arbre-B: le rang de la cellule dans la collection ordonnée de cellules
Structures linéaires
Avantage d’utiliser l’arbre B du SGBD
1. extension facile du système pour accès efficace aux données spatiales 2. concurrence
3. accès à travers le langage de requêtes
3 structures au moins 1. Arbre Q linéaire
2. Arbre z-order (variante simple choisie dans ORACLE SDO) 3. Variante sans redondance
On décrit la première
Arbres Q ou Quadtrees
1. découpage récursif en 4 quadrants
2. on affecte un rem à tous les quadrants qui le coupent
3. le nb max de couples (rem,oid) affectés à 1 quadrant q lié à capacité de page 4. si q déborde, on découpe q en 4 quadrants
7 2
d c
b
x y z t
a
R c d
z
[3,4,7]
3
10 8
13 6 12
[9,10,13]
4
9
t
[1,2,5,6] [5,6,14] [2,3,6] [6]
[8,11,12,13]
Figure 7: Arbre quaternaire
Discussion sur l’arbre Q
1. très simple
2. efficace en mémoire centrale
3. pas adapté pour une grosse collection résidant sur disque: difficile de mapper l’arbre sur des pages
4. redondance: un rectangle est stocké dans toutes les cellules qui le coupent
Arbre Q linéaire
1. arbre Q de profondeur d
2. grille correspondant à l’arbre Q complet de profondeur d 3. cellules ordonnée suivant l’ordre z
On affecte aux noeuds de l’arbre Q une étiquette:
1. la racine a pour étiquette : (chaine vide)
2. le fils NW (NE,SW,SE) d’un noeud d’étiquette k a pour rang k.1 (k.2,k.3,k.4), où “.”
dénote la concaténation
3. une cellule ou feuille de l’arbre complet est une chaine de caractères de taille d sur l’alphabet [1,2,3,4]
4. les cellules (feuilles de l’arbre) sont ordonnées suivant l’ordre lexicographique de leur étiquette
5. si Q (q) a pour étiquette L (l) et si L l, alors Q contient q
6. ordre respecte a peu près la localité. Il en existe d’autres (e.g. Hilbert)
2 3
Figure 8: Ordre Z
Arbre Q linéaire
1. les feuilles de l’arbre sont à une profondeur quelconque d.
2. L’ordre de balayage des feuilles de gauche à droite correspond à l’ordre lexico de leurs étiquettes
3. affecter les rem à une feuille comme pour l’arbre Q donc à une page d’adresse p.
4. Soit e l’étiquette de la feuille: à chaque feuille correspond une paire [e,p].
5. on stocke dans un arbre B la collection de paires [e,p] avec pour clé l’étiquette
0 1 2 3
020 021 022 023 300 301 302 303
30 02
a,b,o
33
e,f e,f,d e,b,c e,c,d 2
12 13
32 33
31 300 301
303 020 021
022 023
d e
h
a
b c
f l g
o
n p 03
302
P
Figure 9: Quadtree linéaire
020 03
33 32 31
303 302 301
300 2 13 12
d
e e b c
c d
c b 01
00 020 021 022 023 03 10 11 12
31 301
e f
e f
Figure 10: Les feuilles de l’arbre Q indexées avec un arbre B+
1. calculer l’étiquette l de la cellule de la grille (profondeur d) contenant le point 2. calculer [L,p]=Maxinf(l) (accès à l’arbre B): l’entrée (feuille de l’arbre Q)
d’étiquette L la plus grande l.
3. accéder à la page p
4. garder les rems dans cette page qui contiennent le point p 5. nb d’I/O : D+1 où D est la profondeur de l’arbre B
Algorithm PointQuery (P: Point): set(oid) begin
Input : point P,Output : set(oid) result // Step 1: compute the label of the point l = label(P)
// Step 2: the entry [L,p] is obtained by traversing the B+tree with key l.
[L,p] = MaxInf(l)
// Step 3: get the page and retrieve the objects ReadPage(p)
for each e in p
if (e.mbb contains P) then result += { e.oid}
end
Algorithm LQ-WINDOWQUERY ( : rectangle): set(oid) begin
result =
// Step 1: From the vertices and of the window, compute // the interval
. This necessitates two searches through the B+tree.
= POINTLABEL ( );
= MAXINF ( )
= POINTLABEL ( );
=MAXINF( ) // Step 2: The set of B+tree entries
with
is computed.
= RANGEQUERY ([
])
// Step 3: For each entry in whose quadrant overlaps , access the page for each in do
if (QUADRANT ( ) overlaps ) then
for each in do
if ( overlaps ) then result +={ e.oid}
endfor endif
endfor
// Sort the result, and remove duplicates SORT (result); REMOVEDUPL (result);
return result end
Discussion sur l’arbre Q linéaire
1. regroupement élégant des feuilles d’un arbre Q dans un arbre B 2. regroupement dynamique
3. l’ordre z permet de conserver une certaine localité 4. mais même redondance que pour l’arbre Q
1. Au contraire de toutes les autres index spatiaux, on n’utilise pas le rem, comme approximation, mais
2. l’ensemble des quadrants de l’arbre Q qui coupent l’objet lui-même
3. on obtient une collection de paires [l,oid] où l est l’étiquette d’un quadrant qui coupe un objet d’identificateur (adresse de page) oid
4. Cette collection est indexée par un arbre B sur l.
023
211
302
301 300
103
12 03
201 210
Figure 11: ordre z et décomposition d’un objet
{211}
c = d = e = f = g =
{102, 103, 120, 121, 123}
{303, 312, 321, 330}
h =
{020, 021, 022, 023}
{010, 011, 012, 013, 030, 031}
{303}
12 13
03 02
30
20 31
32 33
23 22
21
f
a d
e g
b h
Figure 12: Une collection d’objets et sa décomposition z-order
120
031 21 233 312
[01,c]
[02,d]
[030,c]
[031,c]
[102,f]
[103,f]
[120,f]
[121,f]
[123,f]
[21,a]
[203,a]
[201,a]
[230,a]
[231,a]
[233,b]
[211,g]
[303,e]
[312,e]
[303,h]
[321,e] [322,b]
[330,e]
Figure 13: Les feuilles de l’arbre z-order indexées avec un arbre B+
begin
result =
// Step 1: From the vertices and of the window, compute // the interval
. This necessitates two searches through the B+tree.
= POINTLABEL ( );
= MAXINF ( )
= POINTLABEL ( );
= MAXINF ( ) // Step 2: Compute the set of entries
such that
.
= RANGEQUERY (
)
// Step 3: For each entry in that overlaps , report the for each in do
if (QUADRANT ( ) overlaps ) then result +={e.oid}
endfor
// Sort the result, and remove duplicates SORT (result); REMOVEDUPL (result);
return result end
Discussion sur l’arbre z-order
1. redondance: plus la grille est fine, meilleure l’approximation, plus il y a d’entrées dans l’arbre B
2. donc comparé à l’arbre Q linéaire, la profondeur de l’arbre risque d’être plus grande
Arbre z-order sans redondance
1. l’objet est approximé par son rem
2. un mbb est affecté à un quadrant unique: le plus petit qui le contient.
3. On indexe avec un arbre B la collection [l,mbb,oid], où l est l’étiquette du quadrant auquel est associé l’objet d’adresse oid et de rem mbb
4. l’algorithme de fenêtrage est un peu plus compliqué
5. avantage de cette structure: pas de redondance donc l’arbre B devrait être moins profond
Structures data-driven
Arbre R
Structure d’indexation des rems
S’adapte à la distribution des rems dans l’espace (data driven) Pas de redondance
Comme l’arbre B, arbre balancé, où chaque noeud correspond à une page disque.
utilisé dans PostgreSQL
le rem de ses fils
chaque noeud interne contient entre m et n entrées
n déterminé par capacité de page, m = n/2 dans la suite
une entrée par fils: [dr, nodeid] où dr est le rem du fils d’adresse nodeid les rem frères peuvent se chevaucher
dans chaque feuille une collection d’entrées [mbb,oid] une par objet d’adresse oid, de rem mbb
la racine a entre 2 et n entrées
toutes les feuilles sont au même niveau
[8,9,14]
4
7
[1,2,5,6] [3,4,7,10] [11,12,13]
11
13 6
8 5
10 3
2
b
d c
a
R
12
9
R
1 14
d c
b a
Figure 14: Arbre R
Pointé avec l’arbre R
1. à chaque niveau, garder les rems qui contiennent p : il peut y en avoir plusieurs!
parcourir les sous-arbres correspondant
2. DONC on peut parcourir plusieurs chemins, accéder plusieurs feuilles
Algorithm RTREETRAVERSAL (nodeid: PageID, : Point): set of leaves begin
result =
// Get the node page
= READPAGE ( )
if ( is a leaf) return { } else
// Scan the entries of , and visit those which contain for each in do
if ( contains ) then
res += RTREETRAVERSAL (e.nodeid, P) endif
endfor endif
return result end
Performances du pointé
1. accès aux feuilles : dépend du nombre de noeuds parcourus minimum d la profondeur de l’arbre, maximum tout l’arbre!
2. à chaque noeud, accès à une page, parcours et test de tous ses rems FenŁtrage: extension triviale du pointL’.
1. à chaque niveau de l’arbre, soit il y a un noeud dont le rem contient celui de l’objet et on choisit ce sous-arbre et on recommence
2. soit il n’y en a pas, on choisit celui dont l’agrandissement est minimal 3. lorsqu’on arrive à une feuille on insère l’objet dans la feuille
4. si la feuille a dû être agrandie, alors mettre à jour l’entrée correspondante dans le père
5. si la feuille déborde alors une nouvelle feuille est allouée et les n + 1 entrées sont distribuées entre les feuilles et le noeud père est mis à jour
4
7 3
2
1 5
6
14 11 15
13 12
8
10 9
b 16
a
R
c d
e
f R’
R’
a c
b e
R f
[1,2,5,6] [3,4,7] [10,16] [8,9,14] [11,12,13,15]
d
Figure 15: Apr´Ls l’insertion des objets 15 et 16
begin
// Initializes the search with root node = root
// Choose a path down to a leaf while (node is not a leaf) do
node = CHOOSESUBTREE (node, e) endwhile
// Insert in the leaf
INSERTINLEAF (node, e)
// Split and adjust the tree if the leaf overflows, else adjust the path if (node overflows) then
SPLITANDADJUST (node) else
ADJUSTPATH (node) endif
end
Minimiser
1. la superposition des deux feuilles 2. la surface des noeuds
3. le périmètre des noeuds
L’arbre R* améliore ces paramètres.
Figure 16: Arbre-R: Etat de Connecticut
Figure 17: Arbre R*: Etat de Connecticut
Paquetage d’Arbre R
Variante
1. la structure ci-dessus est dynamique
2. dans le cas statique (la collection à indexer est connue à l’avance) on peut prétraiter les rems avant création de l’arbre
3. construction bottom-up après tri
Algorithme STR de paquetage
1. Tri des rem sur le x de leur centre.
2. Partition en
groupes (N nb de rems et n capacité page) 3. chaque groupe est trié sur y et découpé en feuilles de n rems
4. on calcule pour chaque feuille son rem et on recommence au niveau en dessus
Figure 18: Arbre R STR paquetL’: Etat de Connecticut
Il existe bcp d’autres arbres 1. k-d-B tree (space driven) 2. R+tree (space driven) 3. LSD tree (data-driven)
4. X-tree, SR-tree, A-tree, M-tree, Pyramid tree, etc.. (similarity search)
Et dans les plus grandes dimensions
De nombreuses applications représentent les objets comme des points d’espace à 8 , 16, 20 30 voire plus de dimensions.
Ces applications font des recherches de similarité, e.g. recherche d’images par le contenu. On se donne un point requête, et on cherche:
le point le plus proche: Nearest neighbor (NN) les K points les plus proches: K-NN
K-NN approché
Range query (les points dans un rayon donné)
La plupart des structures (space ou data driven) présentées plus haut s’adaptent à n’importe quelle dimension:
Mais:
Elles n’ont pas toutes été implantées pour une dimension
A partir d’une dimension autour de 10, un balayage s’equentiel est meilleur que l’utilisation d’un index arborescent pur les recherches de similarité [WSB98].
Jointures spatiales
Jointure spatiale entre R et S:
L’ensemble des paires de nuplets de R et S dont les attributs géométriques satisfont un prédicat spatial
Prédicat spatial:
overlap, contains, distance d, NW, etc.
On se restreint à overlap
Les 2 étapes de la jointure spatiale
Chaque attribut spatial a pour valeur: (mbb,représentation spatiale) 1. Filtre: test d’intersection sur chaque paire de rectangles
2. Raffinement: chercher les représentations spatiales et faire le test géométrique d’
intersection
On se concentre sur l’étape de filtrage
De nombreux algorithmes. Par exemple,
1. arbres z-order: on suppose que chaque relation est indexée avec un arbre z-order 2. arbres-R: on suppose que chaque relation est indexée avec un arbre R
3. Boucle imbriquée: on suppose qu’une seule relation est indexée, par exemple avec un arbre R
4. Aucune relation n’est indexée: distribution sweeping (algorithme d’intersection de rectangles) ou encore technique de partitionnement
1. Premier partitionnement: découper l’ensemble des rectangles de la 1e relation, disons R en feuilles, (figure de droite)
2. variante avec redondance comme pour la grille associer les mbb à des feuilles qui n’overlappent pas; comme pour la grille, redondance: un mbb est affecté à toutes le feuilles qui coupent (figure de gauche)
3. Deuxième partitionnement: balayer les mbb de S: un mbb est affecté à toutes les feuilles de R qu’il coupe (redondance): on obtient un deuxième jeu de feuilles
4. jointure: Joindre les feuilles deux à deux on suppose qu’une feuille de R tient en mL’moire. Pour toutes les feuilles de R,
5. parcourir tous les rems de S affectés à la même feuille et faire le test de jointure
Jointure spatiale : partitionnement
B
C D
A
O
A
B
C D O
Jointure spatiale : partitionnement
1. Il n’y a pas de dupliqués
2. On peut améliorer la phase de jointure (balayage, structure de données)
3. le premier partionnement doit être bien choisi pour que les feuilles aient toutes même taille.
Biblio sommaire
indexation spatiale: [RSV01], chapitre 6; [GG98]
jointures spatiales: [RSV01], chapitre 7
indexation multi-dimensionnelle et recherche par similarité: [BBK02]
References
[BBK02] Bohm, Berchtold, and Keim. Searching in High-dimensional spaces-Index structures for improvingthe preformanc eof multimedia databases. ACM computing surveys, 2002. http://www.informatik.uni- halle.de/ keim/PS/ACMsurvey.pdf.
[GG98] V. Gaede and O. Guenther. Multidimensional Access Meth- ods. ACM Computing Surveys, 1998. Also available at http://www.icsi.berkeley.edu/ oliverg/survey.ps.Z.
[RSV01] P. Rigaux, M. Scholl, and A. Voisard. Spatial Databases, with application to GIS. Morgan Kaufman, 2001.
[WSB98] R. Weber, H.-J. Schek, and S. Blott. A quantitative Analysis and Perfor- mance Study for Similarity-Search Methods in High-Dimensional Space.
In Proc. of Intl. Conf. on Very Large Data Bases (VLDB), 1998.