language-icon Old Web
English
Sign In

Hilbert curve

A Hilbert curve (also known as a Hilbert space-filling curve) is a continuous fractal space-filling curve first described by the German mathematician David Hilbert in 1891, as a variant of the space-filling Peano curves discovered by Giuseppe Peano in 1890.Hilbert curve, first orderHilbert curves, first and second ordersHilbert curves, first to third ordersProduction rulesHilbert curve, construction color-codedA 3-D Hilbert curve with color showing progressionVariant, first three iterations A Hilbert curve (also known as a Hilbert space-filling curve) is a continuous fractal space-filling curve first described by the German mathematician David Hilbert in 1891, as a variant of the space-filling Peano curves discovered by Giuseppe Peano in 1890. Because it is space-filling, its Hausdorff dimension is 2 {displaystyle 2} (precisely, its image is the unit square, whose dimension is 2 in any definition of dimension; its graph is a compact set homeomorphic to the closed unit interval, with Hausdorff dimension 2). H n {displaystyle H_{n}} is the n {displaystyle n} th approximation to the limiting curve. The Euclidean length of H n {displaystyle H_{n}} is 2 n − 1 2 n {displaystyle extstyle 2^{n}-{1 over 2^{n}}} , i.e., it grows exponentially with n {displaystyle n} , while at the same time always being bounded by a square with a finite area. Both the true Hilbert curve and its discrete approximations are useful because they give a mapping between 1D and 2D space that preserves locality fairly well. This means that two data points which are close to each other in one-dimensional space are also close to each other after folding. The converse can't always be true. Because of this locality property, the Hilbert curve is widely used in computer science. For example, the range of IP addresses used by computers can be mapped into a picture using the Hilbert curve. Code to generate the image would map from 2D to 1D to find the color of each pixel, and the Hilbert curve is sometimes used because it keeps nearby IP addresses close to each other in the picture. A grayscale photograph can be converted to a dithered black-and-white image using thresholding, with the leftover amount from each pixel added to the next pixel along the Hilbert curve. Code to do this would map from 1D to 2D, and the Hilbert curve is sometimes used because it does not create the distracting patterns that would be visible to the eye if the order were simply left to right across each row of pixels. Hilbert curves in higher dimensions are an instance of a generalization of Gray codes, and are sometimes used for similar purposes, for similar reasons. For multidimensional databases, Hilbert order has been proposed to be used instead of Z order because it has better locality-preserving behavior. For example, Hilbert curves have been used to compress and accelerate R-tree indexes (see Hilbert R-tree). They have also been used to help compress data warehouses. Given the variety of applications, it is useful to have algorithms to map in both directions. In many languages, these are better if implemented with iteration rather than recursion. The following C code performs the mappings in both directions, using iteration and bit operations rather than recursion. It assumes a square divided into n by n cells, for n a power of 2, with integer coordinates, with (0,0) in the lower left corner, (n − 1, n − 1) in the upper right corner, and a distance d that starts at 0 in the lower left corner and goes to n 2 − 1 {displaystyle n^{2}-1} in the lower-right corner. This is different from the animation shown above where the curve starts from upper left corner and terminates at upper right corner. These use the C conventions: the & symbol is a bitwise AND, the ^ symbol is a bitwise XOR, the += operator adds on to a variable, and the /= operator divides a variable. The handling of booleans in C means that in xy2d, the variable rx is set to 0 or 1 to match bit s of x, and similarly for ry. The xy2d function works top down, starting with the most significant bits of x and y, and building up the most significant bits of d first. The d2xy function works in the opposite order, starting with the least significant bits of d, and building up x and y starting with the least significant bits. Both functions use the rotation function to rotate and flip the (x,y) coordinate system appropriately.

[ "Geometry", "Algorithm", "Theoretical computer science", "Discrete mathematics", "Topology", "hilbert scan" ]
Parent Topic
Child Topic
    No Parent Topic