zoukankan      html  css  js  c++  java
  • 多维空间点索引算法概述

    解决多维空间点索引需要解决2个问题,第一如何把多维降为低维或者一维?第二,一维的曲线如何分形?

     填充曲线(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维的方格的。但是皮亚诺曲线恰恰给出了反例。皮亚诺曲线是一条连续的但处处不可导的曲线。

        皮亚诺曲线的构造方法如下:取一个正方形并且把它分出九个相等的小正方形,然后从左下角的正方形开始至右上角的正方形结束,依次把小正方形的中心用线段连接起来;下一步把每个小正方形分成九个相等的正方形,然后上述方式把其中中心连接起来……将这种操作手续无限进行下去,最终得到的极限情况的曲线就被称作皮亚诺曲线。

        一年后,即1891年,希尔伯特就作出了这条曲线,叫希尔伯特曲线(Hilbert curve)。如下图就是1-6阶的希尔伯特曲线。

    • 如下图,希尔伯特曲线填充满3维空间示意图。 

     

        在数学分析中,空间填充曲线是一个参数化的注入函数它将单位区间映射到单位正方形,立方体,更广义的,n维超立方体等中的连续曲线,随着参数的增加,它可以任意接近单位立方体中的给定点。除了数学重要性之外,空间填充曲线也可用于降维,数学规划,稀疏多维数据库索引,电子学和生物学。空间填充曲线的现在被用在互联网地图中

    •  

    分形


        皮亚诺曲线的出现,说明了人们对维数的认识是有缺陷的,有必要重新考察维数的定义。这就是分形几何考虑的问题。在分形几何中,维数可以是分数叫做分维。多维空间降维以后,如何分形,也是一个问题。分形的方式有很多种,这里有一个列表,可以查看如何分形,以及每个分形的分形维数,即豪斯多夫分形维(Hausdorff fractals dimension)和拓扑维数。

    Z阶曲线(Z-order curve)


       前几单介绍的 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)。

    •  一阶的希尔伯特曲线,生成方法就是把正方形四等分,从其中一个子正方形的中心开始,依次穿线,穿过其余3个正方形的中心。如下图:
    • 二阶的希尔伯特曲线,生成方法就是把之前每个子正方形继续四等分,每4个小的正方形先生成一阶希尔伯特曲线。然后把4个一阶的希尔伯特曲线首尾相连。
    •  三阶的希尔伯特曲线,生成方法就是与二阶类似,先生成二阶希尔伯特曲线。然后把4个二阶的希尔伯特曲线首尾相连。
    • n阶的希尔伯特曲线的生成方法也是递归的,先生成n-1阶的希尔伯特曲线,然后把4个n-1阶的希尔伯特曲线首尾相连。

    为何要选希尔伯特曲线


      这么多空间填充曲线,为何要选希尔伯特曲线?因为希尔伯特曲线有非常好的特性,如下:

    (1) 降维: 首先,作为空间填充曲线,希尔伯特曲线可以对多维空间有效的降维。如下图就是希尔伯特曲线在填满一个平面以后,把平面上的点都展开成一维的线了。

    • 上图里面的希尔伯特曲线只穿了16个点,怎么能代表一个平面呢?当然,当n趋近于无穷大的时候,n阶希尔伯特曲线就可以近似填满整个平面了。如下图

    (2) 稳定: 当n阶希尔伯特曲线,n趋于无穷大的时候,曲线上的点的位置基本上趋于稳定。举个例子,如下图:

    • 上图左边是希尔伯特曲线,右边是蛇形的曲线。当n趋于无穷大的时候,两者理论上都可以填满平面。但是为何希尔伯特曲线更加优秀呢?
    • 在蛇形曲线上给定一个点,当n趋于无穷大的过程中,这个点在蛇形曲线上的位置是时刻变化的。
    •  
    • 这就造成了点的相对位置始终不定。再看看希尔伯特曲线,同样是一个点,在n趋于无穷大的情况下:
    • 从上图可以看到,点的位置几乎没有怎么变化。所以希尔伯特曲线更加优秀。

    (3) 连续

      希尔伯特曲线是连续的,所以能保证一定可以填满空间。 

    参考资料


  • 相关阅读:
    vue中的 computed 和 watch 的区别
    mysql8.0 初始化数据库及表名大小写问题
    sql server alwayson 调整数据文件路径
    zabbix 自定义监控 SQL Server
    mysql 创建用户及授权
    mysql 设置从库只读模式
    mysql8.0 主从复制安装及配置
    centos8.0安装mysql8.0
    centos8替换阿里数据源
    npm publish 报错 【you or one of your dependencies are requesting a package version that is forbidden by your security policy】
  • 原文地址:https://www.cnblogs.com/tgzhu/p/8286616.html
Copyright © 2011-2022 走看看