希尔伯特按分而治的算法排序?
我正在尝试按希尔伯特顺序对 d 维数据向量进行排序,以便批量加载空间索引。
但是,我不想显式计算每个点的希尔伯特值,这尤其需要设置特定的精度。在高维数据中,这涉及诸如位之类的精度,这变得非常混乱,无法有效地完成。当数据分布不均匀时,其中一些计算是不必要的,并且需要对数据集的某些部分进行额外的精度。32*d
相反,我正在尝试执行分区方法。当您查看 2D 一阶希尔伯特曲线时
1 4
| |
2---3
我首先沿着x轴拆分数据,以便第一部分(不一定包含一半的对象!)将由1和2(尚未排序)组成,第二部分将仅包含3和4中的对象。接下来,我会在Y轴上再次拆分每半部分,但以3-4反转顺序。
因此,从本质上讲,我想执行一种分而治之的策略(与QuickSort密切相关 - 在均匀分布的数据上,这甚至应该是最优的!),并且仅根据需要计算希尔伯特指数的必要“位”。因此,假设“1”中有一个对象,则无需计算它的完整表示;如果对象均匀分布,分区大小将迅速下降。
我确实知道通常的教科书方法,即转换为长,灰色编码,维度交错。这不是我想要的(有很多这样的例子)。我明确地想要一个懒惰的分而治之的排序。另外,我需要的不仅仅是2D。
有没有人知道以这种方式工作的文章或希尔伯特排序算法?或者一个关键的想法是如何获得正确的“旋转”,为此选择哪种表示?特别是在更高维度...在2D中,它是微不足道的;1 旋转 +y, +x,而 4 是 -y,-x(旋转和翻转)。但是在更高的维度中,我想这会变得更加棘手。
(结果当然应该与按希尔伯特顺序对对象进行排序时相同,并且立即具有足够大的精度;我只是试图节省在不需要的时候计算完整表示的时间,并且必须管理它。许多人保留一个哈希图“对象到希尔伯特数”,这是相当昂贵的。
对于皮亚诺曲线和Z曲线,类似的方法应该是可能的,并且可能更容易实现......我可能应该先尝试这些(Z曲线已经在工作了 - 它确实归结为与QuickSort非常相似的东西,使用适当的平均值/网格值作为虚拟枢轴,并在每次迭代的维度中循环)。
编辑:请参阅下文,了解我如何解决Z和peano曲线。它也已经适用于2D希尔伯特曲线。但是我还没有希尔伯特曲线的旋转和反转。