解决多维空间点索引须要解决2个问题,第一,如何把多维降为低维或者一维?第二,一维的曲线如何分形?html
填充曲线(Space-filling curve)数据库
在数学分析中,有这样一个难题:可否用一条无限长的线,穿过任意维度空间里面的全部点? 常见的有: Z阶曲线(Z-order curve)、皮亚诺曲线(Peano curve)、希尔伯特曲线(Hilbert curve),以后还有不少变种的空间填充曲线,龙曲线(Dragon curve)、 高斯帕曲线(Gosper curve)、Koch曲线(Koch curve)、摩尔定律曲线(Moore curve)、谢尔宾斯基曲线(Sierpiński curve)、奥斯古德曲线(Osgood curve)等数据结构
在1890年,Giuseppe Peano 发现了一条连续曲线,如今称为 皮亚诺曲线(Peano curve),它能够穿过单位正方形上的每一个点。他的目的是构建一个能够从单位区间到单位正方形的连续映射。 Peano 受到 Georg Cantor 早期违反直觉的研究结果的启发,即单位区间中无限数量的点与任何有限维度集合中无限数量的点基数相同。 Peano 解决的问题实质就是,是否存在这样一个连续的映射,一条能填充满平面的曲线。以下图就是他找到的一条曲线。通常来讲,一维的东西是不可能填满2维的方格的。可是皮亚诺曲线偏偏给出了反例。皮亚诺曲线是一条连续的但到处不可导的曲线。app
皮亚诺曲线的构造方法以下:取一个正方形而且把它分出九个相等的小正方形,而后从左下角的正方形开始至右上角的正方形结束,依次把小正方形的中心用线段链接起来;下一步把每一个小正方形分红九个相等的正方形,而后上述方式把其中中心链接起来……将这种操做手续无限进行下去,最终获得的极限状况的曲线就被称做皮亚诺曲线。函数
一年后,即1891年,希尔伯特就做出了这条曲线,叫希尔伯特曲线(Hilbert curve)。以下图就是1-6阶的希尔伯特曲线。post
在数学分析中,空间填充曲线是一个参数化的注入函数,它将单位区间映射到单位正方形,立方体,更广义的,n维超立方体等中的连续曲线,随着参数的增长,它能够任意接近单位立方体中的给定点。除了数学重要性以外,空间填充曲线也可用于降维,数学规划,稀疏多维数据库索引,电子学和生物学。空间填充曲线的如今被用在互联网地图中。编码
分形spa
皮亚诺曲线的出现,说明了人们对维数的认识是有缺陷的,有必要从新考察维数的定义。这就是分形几何考虑的问题。在分形几何中,维数能够是分数叫作分维。多维空间降维之后,如何分形,也是一个问题。分形的方式有不少种,这里有一个列表,能够查看如何分形,以及每一个分形的分形维数,即豪斯多夫分形维(Hausdorff fractals dimension)和拓扑维数。3d
Z阶曲线(Z-order curve)htm
前几单介绍的 Genhash 是一种地理编码,由 Gustavo Niemeyer 发明的。它是一种分级的数据结构,把空间划分为网格。Genhash 属于空间填充曲线中的 Z 阶曲线(Z-order curve)的实际应用。
何为 Z 阶曲线? 以下图,这个曲线比较简单,生成它也比较容易,只须要把每一个 Z 首尾相连便可。
Z 阶曲线一样能够扩展到三维空间。只要 Z 形状足够小而且足够密,也能填满整个三维空间。
Geohash 可以提供任意精度的分段级别。通常分级从 1-12 级。利用 Geohash 的字符串长短来决定要划分区域的大小,一旦选定 cell 的宽和高,那么 Geohash 字符串的长度就肯定下来了。
地图上虽然把区域划分好了,可是还有一个问题没有解决,那就是如何快速的查找一个点附近邻近的点和区域呢?
Geohash 有一个和 Z 阶曲线相关的性质,那就是一个点附近的地方(但不绝对) hash 字符串老是有公共前缀,而且公共前缀的长度越长,这两个点距离越近。因为这个特性,Geohash 就经常被用来做为惟一标识符。用在数据库里面可用 Geohash 来表示一个点。Geohash 这个公共前缀的特性就能够用来快速的进行邻近点的搜索。越接近的点一般和目标点的 Geohash 字符串公共前缀越长(特殊状况除外)
在前一章讲 Geohash 编码的时候,提到Geohash码生成规划: “偶数位放经度,奇数位放纬度”。这个规则就是 Z 阶曲线。看下图:
x 轴就是纬度,y轴就是经度。经度放偶数位,纬度放奇数位就是这样而来的。
Hilbert Curve 希尔伯特曲线
希尔伯特曲线一种能填充满一个平面正方形的分形曲线(空间填充曲线),由大卫·希尔伯特在1891年提出。因为它能填满平面,它的豪斯多夫维是2。取它填充的正方形的边长为1,第n步的希尔伯特曲线的长度是2^n - 2^(-n)。
为什么要选希尔伯特曲线
这么多空间填充曲线,为什么要选希尔伯特曲线?由于希尔伯特曲线有很是好的特性,以下:
(1) 降维: 首先,做为空间填充曲线,希尔伯特曲线能够对多维空间有效的降维。以下图就是希尔伯特曲线在填满一个平面之后,把平面上的点都展开成一维的线了。
(2) 稳定: 当n阶希尔伯特曲线,n趋于无穷大的时候,曲线上的点的位置基本上趋于稳定。举个例子,以下图:
(3) 连续
希尔伯特曲线是连续的,因此能保证必定能够填满空间。
参考资料