Sous la coupe, la question de savoir comment un bon algorithme d'indexation multidimensionnelle devrait ĂȘtre organisĂ© est Ă©tudiĂ©e. Ătonnamment, il n'y a pas tant d'options.
Indices unidimensionnels, arbres B
La mesure du succÚs de l'algorithme de recherche sera considérée comme 2 faits -
- l'établissement du fait de sa présence ou de son absence se produit pour le nombre logarithmique (par rapport à la taille de l'index) de lectures de pages disque
- le coût d'émission d'un résultat est proportionnel à son volume
En ce sens, les arbres B rĂ©ussissent assez bien et la raison peut ĂȘtre considĂ©rĂ©e comme l'utilisation d'un arbre Ă©quilibrĂ©. La simplicitĂ© de l'algorithme est due Ă la dimension unique de l'espace clĂ© - si nĂ©cessaire, divisez la page, il suffit de diviser par deux l'ensemble d'Ă©lĂ©ments triĂ©s de cette page. GĂ©nĂ©ralement divisĂ© par le nombre d'Ă©lĂ©ments, bien que cela ne soit pas nĂ©cessaire.
Parce que les pages de l'arbre sont stockées sur le disque, on peut dire que l'arbre B a la capacité de convertir trÚs efficacement l'espace clé unidimensionnel en espace disque unidimensionnel.
Lorsque vous remplissez un arbre avec plus ou moins de «bonne insertion», et c'est un cas assez courant, les pages sont générées dans l'ordre de croissance des clés, alternant parfois avec des pages plus élevées. Il y a de fortes chances qu'ils soient également sur le disque. Ainsi, sans aucun effort, une localité de données élevée est atteinte - les données dont la valeur est proche seront quelque part à proximité et sur le disque.
Bien sûr, lors de l'insertion de valeurs dans un ordre aléatoire, les clés et les pages sont générées de maniÚre aléatoire, à la suite de quoi le soi-disant fragmentation d'index. Il existe également des outils anti-fragmentation qui restaurent la localisation des données.
Il semblerait qu'Ă notre Ă©poque des disques RAID et SSD, l'ordre de lecture Ă partir du disque n'a pas d'importance. Mais, au contraire, il n'a pas la mĂȘme signification qu'auparavant. Il n'y a pas de transfert physique des tĂȘtes dans le SSD, donc sa vitesse de lecture alĂ©atoire ne baisse pas des centaines de fois par rapport Ă une lecture solide, comme un disque dur. Et seulement une fois tous les 10 ou
plus .
Rappelons que les B-arbres sont apparus en 1970 à l'Úre des bandes magnétiques et des tambours. Lorsque la différence de vitesse d'accÚs aléatoire pour la bande et le tambour mentionnés était beaucoup plus dramatique qu'en comparaison avec le disque dur et le SSD.
De plus, 10 fois comptent Ă©galement. Et ces 10 fois incluent non seulement les caractĂ©ristiques physiques du SSD, mais aussi le point fondamental - la prĂ©visibilitĂ© du comportement du lecteur. Si le lecteur est trĂšs susceptible de demander le bloc suivant pour ce bloc, il est logique de le tĂ©lĂ©charger de maniĂšre proactive, par hypothĂšse. Et si le comportement est chaotique, toutes les tentatives de prĂ©diction sont dĂ©nuĂ©es de sens et mĂȘme nuisibles.
Indexation multidimensionnelle
De plus, nous traiterons de l'indice des points Ă deux dimensions (X, Y), simplement parce qu'il est pratique et intuitif de travailler avec eux. Mais les problĂšmes sont fondamentalement les mĂȘmes.
Une option simple, «non sophistiquée» avec des indices séparés pour X et Y ne passe pas selon notre critÚre de succÚs. Il ne donne pas le coût logarithmique d'obtention du premier point. En fait, pour répondre à la question, y a-t-il quelque chose dans la mesure souhaitée, nous devons
- faire une recherche dans l'index X et obtenir tous les identifiants de l'étendue de l'intervalle X
- similaire pour Y
- croisent ces deux ensembles d'identifiants
Déjà , le premier élément dépend de la taille de l'étendue et ne garantit pas le logarithme.
Pour ĂȘtre «rĂ©ussi», un index multidimensionnel doit ĂȘtre organisĂ© comme un arbre plus ou moins Ă©quilibrĂ©. Cette dĂ©claration peut sembler controversĂ©e. Mais l'exigence d'une recherche logarithmique nous dicte exactement un tel dispositif. Pourquoi pas deux arbres ou plus? DĂ©jĂ considĂ©rĂ©e comme l'option "peu sophistiquĂ©e" et inadaptĂ©e avec deux arbres. Il y en a peut-ĂȘtre de convenables. Mais deux arbres - c'est deux fois plus de verrous (y compris simultanĂ©s), deux fois plus cher, des chances significativement plus grandes d'attraper un blocage. Si vous pouvez vous en sortir avec un seul arbre, vous devez absolument l'utiliser.
Compte tenu de tout cela, le désir de prendre comme base l'expérience trÚs réussie de l'arbre B et de la «généraliser» pour travailler avec des données bidimensionnelles est tout à fait naturel.
L'arbre R est donc apparu.
R-tree
L'arbre R est organisé comme suit:
Au départ, nous avons une page vierge, ajoutez-y simplement des données (points).
Mais ici, la page est pleine et elle doit ĂȘtre divisĂ©e.
Dans l'arbre B, les éléments de la page sont classés de maniÚre naturelle, la question est donc de savoir combien couper. Il n'y a pas d'ordre naturel dans l'arbre R. Il y a deux options:
- Mettez de l'ordre, c'est-à -dire introduire une fonction qui, basée sur X&Y, donnera une valeur selon laquelle les éléments de page seront ordonnés et divisés en fonction de cela. Dans ce cas, l'index entier dégénÚre en un arbre B régulier construit à partir des valeurs de la fonction spécifiée. En plus des avantages évidents, il y a une grande question - bien, bien, nous avons indexé, mais comment regarder? Plus à ce sujet plus tard, considérons d'abord la deuxiÚme option.
- Divisez la page par critĂšres spatiaux. Pour ce faire, chaque page doit ĂȘtre affectĂ©e Ă l'Ă©tendue des Ă©lĂ©ments situĂ©s sur / en dessous. C'est-Ă -dire la page racine a l'Ă©tendue de la couche entiĂšre. Lors du fractionnement, deux pages (ou plus) sont gĂ©nĂ©rĂ©es, dont l'Ă©tendue est incluse dans l'Ă©tendue de la page parent (pour la recherche).
Il y a une pure incertitude. Comment diviser exactement la page? Horizontale ou verticale? Procéder de la moitié de la surface ou de la moitié des éléments? Mais que se passe-t-il si les points forment deux grappes, mais vous ne pouvez les séparer qu'avec une ligne diagonale? Et s'il y a trois clusters?
La simple présence de telles questions indique que l'arbre R n'est pas un algorithme. Il s'agit d'un ensemble d'heuristiques, au moins pour fractionner une page lors de l'insertion, pour fusionner des pages lors de la suppression / modification, pour le prétraitement pour l'insertion en bloc.
L'heuristique implique la spĂ©cialisation d'un arbre particulier sur un type de donnĂ©es particulier. C'est-Ă -dire sur des ensembles de donnĂ©es d'un certain type, elle se trompe moins souvent. "Lâheuristique ne peut pas ĂȘtre complĂštement trompĂ©e, car dans ce cas, ce serait un algorithme »©.
Que signifie l'erreur heuristique dans ce contexte? Par exemple, que la page sera fractionnée / fusionnée sans succÚs et que les pages commenceront à se chevaucher partiellement. Si soudainement l'étendue de la recherche tombe sur la zone de chevauchement des pages, le coût de la recherche ne sera déjà pas tout à fait logarithmique. Au fil du temps, lorsque vous insérez / supprimez, le nombre d'erreurs s'accumule et les performances de l'arborescence commencent à se dégrader.
Figure 1 Voici un exemple d'arbre R *, qui est construit de maniĂšre naturelle.
Figure 2 Et ici, le mĂȘme ensemble de donnĂ©es est prĂ©traitĂ© et l'arbre est construit par insertion en masseOn peut dire que l'arbre B se dĂ©grade Ă©galement avec le temps, mais il s'agit d'une dĂ©gradation lĂ©gĂšrement diffĂ©rente. Les performances de l'arbre B diminuent du fait que ses pages ne sont pas alignĂ©es. Ceci est facilement traitĂ© en «redressant» l'arbre - dĂ©fragmentation. Dans le cas d'un arbre R, il n'est pas si facile de s'en dĂ©barrasser, la structure de l'arbre lui-mĂȘme est «courbe» afin de corriger la situation, il doit ĂȘtre complĂštement reconstruit.
Les généralisations de l'arbre R aux espaces multidimensionnels ne sont pas évidentes. Par exemple, lors du fractionnement des pages, nous avons minimisé le périmÚtre des pages enfants. Que minimiser dans le cas tridimensionnel? Volume ou surface? Et dans le cas à huit dimensions? Le bon sens n'est plus un conseiller.
L'espace indexĂ© pourrait bien ĂȘtre non isotrope. Pourquoi ne pas indexer non seulement les points, mais leurs positions dans le temps, c'est-Ă -dire (X, Y, t). Dans ce cas, par exemple, les heuristiques basĂ©es sur le pĂ©rimĂštre n'ont pas de sens puisque empile la longueur Ă intervalles de temps.
L'impression générale de l'arbre R est quelque chose comme
des crustacĂ©s Ă
pieds branchiaux . Ceux-ci ont leur propre niche écologique dans laquelle il est difficile de rivaliser avec eux. Mais dans le cas général, ils n'ont aucune chance de concurrencer les animaux plus développés.
Arbre quad
Dans un
quadtree, chaque page non-feuille a exactement quatre descendants, qui divisent également son espace en quadrants.
Figure 3 Exemple d'un arbre quad construitCe n'est pas une bonne conception de base de données.
- Chaque page ne rĂ©duit l'espace de recherche pour chaque coordonnĂ©e que deux fois. Oui, cela fournit la complexitĂ© logarithmique de la recherche, mais c'est le logarithme de base 2, pas le nombre d'Ă©lĂ©ments sur la page, (mĂȘme 100) comme dans un arbre B.
- Chaque page est petite, mais derriĂšre elle, vous devez toujours aller sur le disque.
- La profondeur de l'arbre quad doit ĂȘtre limitĂ©e, sinon son dĂ©sĂ©quilibre affecte les performances. Par consĂ©quent, sur des donnĂ©es fortement regroupĂ©es (par exemple, des maisons sur une carte - il y a beaucoup de villes dans les villes, peu dans les champs), une grande quantitĂ© de donnĂ©es peut s'accumuler sur les pages de feuilles. Un index Ă partir d'un index exact devient bloc et nĂ©cessite un post-traitement.
Une taille de réseau mal sélectionnée (profondeur d'arbre) peut nuire aux performances. Néanmoins, je voudrais que les performances de l'algorithme ne dépendent pas de maniÚre critique du facteur humain.
- Le coût de l'espace pour stocker un point est assez élevé.
Numérotation des espaces
Il reste à considérer la version précédemment différée avec une fonction qui, sur la base d'une clé multidimensionnelle, calcule la valeur d'écriture dans un arbre B régulier.
La construction d'un tel index est Ă©vidente, et l'index lui-mĂȘme a tous les avantages de l'arbre B. La seule question est de savoir si cet index peut ĂȘtre utilisĂ© pour une recherche efficace.
Il existe un grand nombre de ces fonctions, on peut supposer que parmi elles il y a un petit nombre de «bonnes», un grand nombre de «mauvaises» et un grand nombre de «tout simplement horribles».
Trouver une fonction terrible n'est pas difficile - nous sérialisons la clé dans une chaßne, considérons MD5 à partir de celle-ci et obtenons une valeur complÚtement inutile pour nos besoins.
Et comment aborder le bien? Il a déjà été dit qu'un index utile fournit la «localité» des données - des points qui sont proches dans l'espace et sont souvent proches les uns des autres lorsqu'ils sont enregistrés sur le disque. Appliquée à la fonction souhaitée, cela signifie que pour des points spatialement proches, elle donne des valeurs proches.
Une fois dans l'index, les valeurs calculées apparaßtront sur les pages "physiques" dans l'ordre de leurs valeurs. Du point de vue du «sens physique», l'étendue de la recherche devrait affecter le moins de pages d'index physique possible. Ce qui est généralement évident. De ce point de vue, les courbes de numérotation qui «tirent» les données sont «mauvaises». Et ceux qui «se confondent en boule» - plus prÚs du «bien».
Numérotation naïve
Une tentative de presser un segment dans un carrĂ© (hypercube) tout en restant dans la logique de l'espace unidimensionnel, c'est-Ă -dire couper en morceaux et remplir le carrĂ© avec ces morceaux. Ăa pourrait ĂȘtre
Balayage 4 lignes
5 entrelacé
Fig.6 spiraleou ... vous pouvez trouver beaucoup d'options, elles ont toutes deux inconvénients
- ambiguïté, par exemple: pourquoi la spirale est enroulée dans le sens horaire et non contre elle, ou pourquoi le balayage horizontal est d'abord le long de X puis le long de Y
- la présence de longues piÚces droites qui rendent l'utilisation d'une telle méthode inefficace pour l'indexation multidimensionnelle (périmÚtre de grande page)
Fonctionnalités d'accÚs direct
Si la principale revendication des mĂ©thodes «naĂŻves» est qu'elles gĂ©nĂšrent des pages trĂšs allongĂ©es, gĂ©nĂ©rons nous-mĂȘmes les pages «correctes».
L'idée est simple - qu'il y ait une division externe de l'espace en blocs, attribuez un identifiant à chaque bloc et ce sera la clé de l'index spatial.
- laissez les coordonnées X et Y sur 16 bits (pour plus de clarté)
- nous allons couvrir l'espace avec des blocs carrés de taille 1024X1024
- grossir les coordonnées, décaler de 10 bits vers la droite
- et obtenez l'ID de la page, collez les bits de X&Y. Maintenant, dans l'identifiant, les 6 chiffres inférieurs sont les plus anciens de X, les 6 chiffres suivants sont les plus anciens de Y
Il est facile de voir que les blocs forment un balayage de ligne, par conséquent, pour trouver des données pour l'étendue de recherche, vous devrez effectuer une recherche / lecture dans l'index pour chaque ligne de blocs sur laquelle cette étendue est appliquée. En général, cette méthode fonctionne trÚs bien, bien qu'elle présente plusieurs inconvénients.
- lors de la création d'un index, vous devez choisir la taille de bloc optimale, ce qui n'est pas évident
- si le bloc est significativement plus grand qu'une requĂȘte classique, la recherche sera inefficace car doivent trop lire et filtrer (post-traitement)
- si le bloc est significativement plus petit qu'une requĂȘte typique, la recherche sera inefficace car devra faire beaucoup de requĂȘtes ligne par ligne
- si le bloc contient en moyenne trop ou trop peu de données, la recherche sera inefficace
- si les données sont regroupées (ex: à la maison sur la carte), la recherche ne sera pas efficace partout
- si l'ensemble de donnĂ©es a augmentĂ©, il se peut bien que la taille du bloc cesse d'ĂȘtre optimale.
En partie, ces problĂšmes sont rĂ©solus en crĂ©ant des blocs Ă plusieurs niveaux. Pour le mĂȘme exemple:
- veulent toujours des blocs 1024X1024
- mais maintenant, nous aurons toujours des blocs de niveau supérieur de blocs inférieurs de taille 8X8
- la clé est disposée comme suit (de bas en haut):
3 chiffres - chiffres 10 ... 12 coordonnées X
3 chiffres - chiffres 10 ... 12 coordonnées Y
3 chiffres - chiffres 13 ... 15 coordonnées X
3 chiffres - chiffres 13 ... 15 coordonnées Y
7 blocs de bas niveau forment des blocs de haut niveauMaintenant, pour les grandes étendues, vous n'avez pas besoin de lire un grand nombre de petits blocs, cela se fait au détriment des blocs de haut niveau.
Fait intĂ©ressant, il Ă©tait possible de ne pas rendre les coordonnĂ©es plus rugueuses, mais de la mĂȘme maniĂšre de les presser dans la clĂ©. Dans ce cas, le post-filtrage serait moins cher car se produirait lors de la lecture de l'index.
Les
index GRID spatiaux sont organisés
dans MS SQL de la mĂȘme maniĂšre; jusqu'Ă 4 niveaux de bloc y sont autorisĂ©s.
Fig.8 Index GRIDUne autre façon intéressante d'indexation directe consiste à utiliser un arbre quadruple pour le partitionnement externe de l'espace.
L'arbre quad est utile en ce qu'il peut s'adapter Ă la densitĂ© des objets, car lorsque le nĆud dĂ©borde, il se divise. Par consĂ©quent, lorsque la densitĂ© des objets est Ă©levĂ©e, les blocs se rĂ©vĂšlent petits et vice versa. Cela rĂ©duit le nombre d'appels d'index vides.
Certes, l'arbre quad est une construction peu pratique pour la reconstruction à la volée, il est avantageux de le faire de temps en temps.
De la chose agréable, lors de la reconstruction d'un arbre quadruple, il n'est pas nécessaire de reconstruire l'index si les blocs sont identifiés par le
code Morton et les objets sont encodés à l'aide de celui-ci. Voici l'astuce: si les coordonnées du point sont encodées avec un code Morton, l'identifiant de page est un préfixe dans ce code. Lors de la recherche de données de page, toutes les clés comprises entre [préfixe] 00 ... 00B et [préfixe] 11 ... 11B sont sélectionnées, si la page est divisée, cela signifie que seul le préfixe de ses descendants s'est allongé.
Fonctionnalités similaires
La premiÚre chose qui me vient à l'esprit lorsque l'on mentionne des fonctions auto-similaires est le «balayage des courbes». "Une courbe notable est une cartographie continue, dont le domaine est le segment unitaire [0, 1], et le domaine est l'espace euclidien (plus strictement, topologique)." Un exemple est la
courbe de Peano.
Fig.9 premiÚres itérations de la courbe de PeanoDans le coin inférieur gauche se trouve le début de la zone de définition (et la valeur zéro de la fonction), dans le coin supérieur droit la fin (et 1), chaque fois que nous déplaçons 1 étape, ajoutez 1 / (N * N) à la valeur (à condition que N - degré 3, bien sûr). Par conséquent, dans le coin supérieur droit, la valeur atteint 1. Si nous en ajoutons un à chaque étape, une telle fonction numérote simplement le réseau carré de maniÚre séquentielle, ce que nous voulions.
Toutes les courbes de balayage sont auto-similaires. Dans ce cas, le simplexe est un carrĂ© de 3 x 3. Ă chaque itĂ©ration, chaque point du simplexe se transforme en le mĂȘme simplexe, pour assurer la continuitĂ©, il faut recourir Ă des mappings (flips).
L'autosimilaritĂ© est une qualitĂ© trĂšs importante pour nous. Cela donne de l'espoir pour la valeur logarithmique de la recherche. Par exemple, pour un simplexe 3x3, tous les nombres gĂ©nĂ©rĂ©s dans chacun des 9 carrĂ©s Ă©lĂ©mentaires par des itĂ©rations de dĂ©tail ultĂ©rieures seront dans la mĂȘme plage. Tout simplement parce que le nombre est le chemin parcouru depuis le dĂ©but. C'est-Ă -dire si vous divisez l'Ă©tendue en 9 parties, le contenu de chacune d'elles peut ĂȘtre obtenu par une traversĂ©e d'index. Et ainsi de suite rĂ©cursivement, chacun des 9 sous-carrĂ©s de chacun des carrĂ©s peut ĂȘtre obtenu par une seule requĂȘte sur l'index (bien que dans une plage plus petite). L'Ă©tendue de la recherche peut donc ĂȘtre dĂ©composĂ©e en un petit nombre de sous-requĂȘtes carrĂ©es, lues soit en totalitĂ©, soit avec un filtrage (autour du pĂ©rimĂštre). La figure 9 montre l'Ă©tendue de la recherche en vert, divisĂ©e par des lignes rouges en sous-requĂȘtes.
Cependant, l'autosimilarité ne rend pas automatiquement la courbe de numérotation appropriée à des fins d'indexation.
- la courbe doit remplir la grille carrĂ©e. Nous indexons les valeurs dans les nĆuds du rĂ©seau carrĂ© et chaque fois nous ne voulons pas rechercher un nĆud appropriĂ© sur le rĂ©seau, par exemple triangulaire. Au moins pour Ă©viter les problĂšmes d'arrondi. Ici, par exemple, tels (figure 10)

Figure 10 lac ternaire Kokha
la courbe ne nous convient pas. Bien qu'il «ponte» parfaitement la surface.
- la courbe doit remplir l'espace sans lacunes ( dimension fractale D = 2). La voici (Fig.11):

11 courbe fractale anonyme
ne convient pas non plus.
- la valeur de la fonction de numĂ©rotation (le chemin parcouru le long de la courbe depuis le dĂ©but) doit ĂȘtre facilement calculĂ©e. Il en rĂ©sulte qu'en raison de l'ambiguĂŻtĂ© qui en rĂ©sulte, les courbes auto-touchantes ne conviennent pas, comme la courbe de Sierpinski

Fig.12 Courbe de Sierpinski
ou, qui est la mĂȘme chose (pour nous), "en passant le triangle le long de Cesaro "

FIG. 13 Triangle Cesaro, pour plus de clartĂ©, l'angle droit est remplacĂ© par 85 ° - il ne doit pas y avoir de paramĂštres dans la fonction de numĂ©rotation, la courbe doit ĂȘtre uniforme (prĂ©cise Ă la symĂ©trie). . : ( )

. 14 âA Plane Filling Curve for the Year 2017â
, ( ) .
, , , .
â . , . , N- N (N-1) . , , -.
. 15 3x3x3, .
.
, . , ( ). , , . , .
.
- ,
- ( ) , . , . â . .
- â , .. .
- , . , , . , , â () 3...10% () Z-.
â , .
, () , ( ) .
, , - , . , , . ,
.
.
, ? .
().
, , . , . , 3X3 3 X, 3 Y. . () 5X5, 5 . (ex: 2+3), .
- â , 5- 7- , .
. , .
. 2 . 4 . .
, 33 22 , 3 > 2, 44 33, 88 55. , 22âŠ
? . Parce que , . 3X3 , 3 . 8x8 (.16), â 64 .
. 16 8x8, , 2x2, , .
. 17 2x2, , , âZâ, ââ ââ.
, ââ , . 4 . 256 8- .
, ( ââ), . .
. 18 Z-
. 19 ââ â,
. .
- , , .
â
- (KMin, KMax)
- ( ) KMin, KMax
- , SMin, , SMax
- . , , SMin, . .
- , , ( ).
- Z- . z- â , â ( ). , , .
- , , . ,
- , . â â â >= â â () , â â
- â â > , ,
- , ,
- â â > , , ,
- â â == ,
- 0 1 â
- 0 1 â
- , , 1, 0. .
Sur une courbe en Z, cela fonctionne comme ceci:
FIG. 20 - fractionnement de sous-requĂȘte en cas de courbe en Z
FIG. 21 Courbe de Hilbert, le cas oĂč l'Ă©tendue de dĂ©part est le maximumLa premiĂšre Ă©tape est illustrĂ©e ici - couper la couche excĂ©dentaire de l'Ă©tendue maximale.
FIG. 22 Courbe de Hilbert, zone de requĂȘte de rechercheEt voici une ventilation en sous-requĂȘtes, points trouvĂ©s et appels d'index dans la zone de requĂȘte de recherche. Il s'agit toujours d'une demande trĂšs infructueuse du point de vue de la courbe de Hilbert. Habituellement, tout est beaucoup moins sanglant.
Cependant, les statistiques de requĂȘte indiquent que (Ă peu prĂšs) sur les mĂȘmes donnĂ©es, un index bidimensionnel basĂ© sur une courbe de Hilbert lit en moyenne 5% de pages de disque en moins, mais il fonctionne Ă moitiĂ© plus lentement. Le ralentissement est Ă©galement dĂ» au fait que le calcul lui-mĂȘme (direct et inverse) de cette courbe est beaucoup plus difficile - 2000 horloges de processeur pour Hilbert contre 50 pour la courbe Z.
En cessant de supporter la courbe de Hilbert, l'algorithme pourrait ĂȘtre simplifiĂ©; Ă premiĂšre vue, un tel ralentissement n'est pas justifiĂ©. D'un autre cĂŽtĂ©, ce n'est qu'un cas Ă deux dimensions, par exemple, dans un espace Ă 8 dimensions ou plus, les statistiques peuvent briller avec des couleurs complĂštement nouvelles. Cette question attend toujours des Ă©claircissements.
PS : La courbe en Z est parfois appelĂ©e courbe d'entrelacement de bits en raison de l'algorithme de calcul de la valeur - les chiffres de chaque coordonnĂ©e tombent dans la valeur clĂ© Ă travers une, ce qui est trĂšs technologique. Mais vous pouvez, aprĂšs tout, entrelacer les dĂ©charges non pas individuellement, mais en paquets de 2,3 ... 8 ... piĂšces. Maintenant, si nous prenons 8 bits, alors sur une clĂ© 32 bits, nous obtenons un analogue de l'index GRID Ă 4 niveaux de MS SQL. Et dans un cas extrĂȘme - un pack de 32 bits chacun - un algorithme de balayage horizontal.
Un tel indice (pas en minuscules, bien sĂ»r) peut ĂȘtre trĂšs efficace, encore plus efficace que la courbe Z sur certains ensembles de donnĂ©es. Malheureusement, en raison de la perte de gĂ©nĂ©ralitĂ©.
PPS : L'index dĂ©crit est trĂšs similaire au travail avec un arbre quadruple. L'Ă©tendue maximale est la page racine de l'arbre quadruple, elle a 4 descendants ... Et donc, l'algorithme peut ĂȘtre attribuĂ© Ă des "mĂ©thodes d'accĂšs direct".
Les différences sont toujours fondamentales.
L'arbre quadruple n'est stockĂ© nulle part, il est virtuel, intĂ©grĂ© dans la nature mĂȘme des nombres. Il n'y a aucune restriction sur la profondeur de l'arbre; nous obtenons des informations sur la population de descendants Ă partir de la population de l'arbre principal. De plus, l'arbre principal est lu une fois, on passe des valeurs les plus petites aux plus anciennes. C'est drĂŽle, mais la structure physique de l'arbre B permet d'Ă©viter les requĂȘtes vides et de limiter la profondeur de rĂ©cursivitĂ©.
Une derniĂšre chose - Ă chaque itĂ©ration, seuls deux descendants apparaissent - Ă partir de lĂ , 4 sous-requĂȘtes peuvent ĂȘtre gĂ©nĂ©rĂ©es et ne peuvent pas ĂȘtre gĂ©nĂ©rĂ©es s'il n'y a pas de donnĂ©es sous elles. Dans le cas en 3 dimensions, nous parlerions de 8 descendants, dans le cas en 8 dimensions - environ 256.
PPPS : au début de cet article, nous avons parlé de dichotomie lors de la recherche dans un index multidimensionnel - afin d'obtenir la valeur logarithmique, il est nécessaire de diviser une ressource finie à chaque itération - soit l'espace de valeur clé ou l'espace de recherche. Dans l'algorithme présenté, cette dichotomie s'est effondrée - nous partageons simultanément la clé et l'espace.
«Je vis dans les deux cours et mes arbres sont toujours plus grands.» (
C )
PPPPS : DÚs qu'ils appellent la courbe Z, vous avez ici l'ordre Z et l'entrelacement des bits et le code / courbe de Morton. Il est également connu sous le nom de courbe de Lebesgue, afin de maintenir l'équilibre, l'auteur a intitulé l'article, y compris en l'honneur de
Henry Leon Lebesgue .
PPPPPS : Dans l'illustration du titre, la vue sur
le glacier Fedchenko est tout simplement magnifique et il y a suffisamment de vide. En fait, l'auteur a été impressionné par la façon dont les différentes idées et méthodes s'enchaßnent sans heurts, fusionnant progressivement en un seul algorithme. Tout comme les nombreuses petites sources d'eau qui composent le bassin versant forment un seul ruissellement.