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