1、介绍
许多在CGAL中实现的几何算法都是增量的,因此它们的速度取决于插入顺序。此软件包提供了排序算法,可以大大提高此类算法的运行时间。
其基本原理是沿着空间填充曲线对对象进行排序,这样在插入顺序上,几何上接近的两个对象将很有可能接近。这样,在插入过程中将要查看的数据结构的一部分很可能已经在最近的插入中被查看过,因此很可能在缓存内存中而不是主内存中。作为另一个副作用,这些排序函数通常会提高增量算法产生的数据结构的内存局部性,有时会导致使用这些数据结构的其他算法的速度加快。
一些算法在随机假设下具有很好的复杂性,这与使用任何排序标准对输入进行排序的想法相矛盾。在这种情况下,可以引入一点随机性,以结合良好的随机复杂性和良好的局部性效果。
此包使用的谓词是坐标之间的比较,因此这里没有涉及鲁棒性问题,例如选择内核的算法。
2、希尔伯特排序
在二维中,可以构造空间填充曲线,即从[0,1]到单位正方形[0,1]的映射f,使得f(0)=(0,0)和f(1)=(1,0),具体方式如下:将单位正方形细分为四个正方形,使得
然后,每个方块以同样的方式递归细分。下图说明了这一过程。
希尔伯特映射
现在给定一组二维点,它们可以在这样的空间填充曲线上按顺序排列。请注意,在每一步中,我们都在正中间将一个正方形分割开;我们称之为中间策略。
如果不像上面那样在中心以固定方式对正方形进行细分,而是在中点(在x或y方向交替)进行分割,我们构建了一个适应点集的二维树。该树可以以类似的方式进行访问,我们也可以得到点的适当排序;我们称之为中点策略。
中间策略更容易分析,并且在点集在低维度中分布良好的情况下(如果点的数量真的大于2d)在实践中很有趣。对于高维度或点集分布不规律(或未知)的情况,应首选中位数策略。由于中位数策略不会比中间策略差很多,而相反的情况可能会发生,因此中位数策略是默认行为。大多数理论结果使用中间策略。
CGAL为二维、三维和更高维度的点提供希尔伯特排序,采用中间和中位数策略。
我们还考虑给定球上的空间填充曲线。该方法适用于单位球,通过仿射变换适用于任何球体。假设要排序的点靠近球体。
实际上,我们在单位球上近似一个空间填充曲线,通过在立方体(面在x、y、z=±1/3–√处)上填充空间填充曲线。大致来说,我们将原始点集分成六个子集,对应于立方体的六个面。对应于面f的子集是位于由面f的支撑平面定义的一半空间内的点集,该平面不包含原点。
然后,我们基本上在每个子集上使用2D希尔伯特排序及其相应的策略,就像上面解释的那样,将点的投影投射到立方体的相应面上。每个面上的轴方向选择使得空间填充曲线覆盖整个立方体而不会跳跃;参见图4。一个点可以位于多个这样的半平面中,因此我们为立方体的每个面赋予优先级。优先级顺序是:首先,立方体在x=1/3–√的面;其次,立方体在y=1/3–√的面;第三,立方体在x=−1/3–√的面;第四,立方体在z=1/3–√的面;第五,立方体在y=−1/3–√的面;第六,立方体在z=−1/3–√的面。
如果点不靠近球体,它们仍然以相同的方式排序,但不能保证这样的顺序不再有效。
立方体每个面的二维希尔伯特排序
根据上述描述在球体上排序的点如图所示。
球上的Hilbert排序
3、空间排序
在将随机算法输入之前,不能直接使用希尔伯特排序。因此,诀窍是将点集组织在大小递增的随机桶中,希尔伯特排序仅在桶内使用。
在Delaunay三角剖分的背景下,已经证明这种顺序提供了足够的随机性,可以结合随机顺序和空间填充曲线顺序的优点。
CGAL库提供二维、三维和更高维度的点空间排序,在桶中采用 Hilbert 排序的中间和中间值策略。
空间排序特征类提供了点类型和函子,用于比较例如两个点的x坐标。如果你想对点以外的东西进行排序,例如包含一个点的元组序列,或者点向量中的索引序列,你需要另一个间接级别。CGAL提供了由另一个空间排序特征类模板化的空间排序特征类别适配器和属性映射。这允许从你想要排序的任何东西中获得一个点。
4、并行空间排序
在二维(三维)中,希尔伯特或空间排序递归地将输入范围细分为四个(八个)子范围。因此,并行化排序算法的一个自然方法是将初始范围细分为四个(八个)子范围,并让单个线程处理给定子范围的任何进一步细分和排序。这种并行算法仅在使用中位数策略策略时可用(默认情况下是这样),因为该策略确保了所有子范围之间的平衡。对于中间策略,情况不一定如此,其中子范围大小可能差异很大。
通过指定模板参数CGAL::Parallel_tag启用算法的并行版本。如果不确定TBB是否可用且已与CGAL链接,则可以使用CGAL::Parallel_if_available_tag。默认情况下,使用顺序版本。
5、其他
空间排序可以降低,三角剖分的时间
希尔伯特排序和空间排序是两种不同的概念,它们分别用于不同的应用场景,并且各自有不同的特性和目标。
希尔伯特排序是一种排序算法,主要用于对数字进行排序。它利用了递减增量的策略,将序列划分为一个个小序列,每个小序列使用直接插入排序,完成后增量递减,每个小序列变大,继续进行直接插入排序,直到增量递减为1,进行最后的直接插入排序。希尔伯特排序的主要思想是利用直接插入排序的优点和消灭直接插入排序的缺点来进行排序。
空间顺序是指在三维空间中,事物的位置排列和分布的方式。它是通过观察和感知事物在空间中的相对位置和关系而形成的。空间顺序不仅仅涉及物体的位置,还包括它们的大小、形状和颜色等属性。在建筑设计、城市规划、艺术创作等应用中,空间顺序是一个关键概念。它涉及到建筑物内部和外部空间的组织和布局,以及不同空间之间的联系和转换。通过合理的空间顺序设计,可以创造出舒适、高效的使用环境,提升建筑物的功能性和美学价值。
因此,希尔伯特排序是一种算法,主要用于数字排序;而空间顺序是一个描述物体在空间中的位置和关系的概念,广泛应用于建筑设计、城市规划等领域。
CGAL::hilbert_sort是CGAL库中的一个函数,用于对点集进行Hilbert排序。Hilbert排序是一种基于Hilbert曲线的方法,用于对二维平面上的点进行排序。
CGAL::hilbert_sort_on_sphere是CGAL库中的一个函数,用于在球面上进行Hilbert排序。
Hilbert排序是一种基于Hilbert曲线的方法,用于对球面上的点进行排序。球面上的点可以用它们的经度和纬度来表示。CGAL::hilbert_sort_on_sphere函数使用Hilbert曲线对球面上的点进行排序,使得在排序后的结果中,相邻的点在球面上具有尽可能大的角度差。
使用CGAL::hilbert_sort_on_sphere函数的一般步骤如下:
- 创建一个球面上的点集,每个点由其经度和纬度表示。
- 调用CGAL::hilbert_sort_on_sphere函数,并将点集作为参数传递给它。
- 函数会对点集进行排序,并返回排序后的结果。
通过使用CGAL::hilbert_sort_on_sphere函数,可以对球面上的点进行有效的排序,这在处理地理信息系统、地图绘制、空间索引等应用中非常有用。
CGAL::hilbert_sort是一个用于对球面上的点进行排序的函数,它使用Hilbert曲线进行排序。关于中间策略和中点策略的区别,可以从以下几个方面进行比较:
-
定义:
- 中间策略:在排序过程中,将元素分成两部分,中间元素作为基准,然后将其他元素与基准进行比较和交换。
- 中点策略:在排序过程中,将元素分成两部分,中间位置(中位数)的元素作为基准,然后将其他元素与基准进行比较和交换。
-
算法复杂度:
- 中间策略:由于需要选择一个中间元素作为基准,因此算法复杂度较高。
- 中点策略:由于只需要找到中间位置的元素作为基准,算法复杂度较低。
-
稳定性:
- 中间策略:不稳定,因为中间元素的选择可能会影响排序结果。
- 中点策略:稳定,因为中位数是唯一确定的基准元素。
-
适用场景:
- 中间策略:适用于快速排序、堆排序等基于比较的排序算法。
- 中点策略:适用于快速选择、归并排序等基于比较和合并的排序算法。
总结:中间策略和中点策略的区别主要在于选择基准元素的方式不同。中间策略选择一个中间元素作为基准,而中点策略选择中位数作为基准。在算法复杂度、稳定性和适用场景方面也存在差异。在实际应用中,可以根据具体需求选择适合的策略。
CGAL::spatial_sort是CGAL库中的一个函数,用于对几何对象进行空间排序。该函数可以用于对点、线段、多边形等几何对象进行排序,以便在几何计算中按照特定的顺序处理这些对象。
CGAL::spatial_sort函数基于四叉树数据结构,它可以在高维空间中高效地进行排序。通过将空间划分为四个象限,然后递归地对每个象限进行排序,该函数能够快速地确定对象的相对位置关系。
CGAL::spatial_sort和CGAL::hilbert_sort是CGAL库中的两个不同函数,它们用于不同的排序目的。
CGAL::spatial_sort是一个用于对几何对象进行空间排序的函数。它基于四叉树数据结构,可以将空间划分为四个象限,然后递归地对每个象限进行排序。空间排序的目的是确定对象的相对位置关系,以便在几何计算中按照特定的顺序处理这些对象。
而CGAL::hilbert_sort是一个用于对球面上的点进行排序的函数,它使用Hilbert曲线进行排序。Hilbert曲线是一种将二维平面上的点按照顺序映射到一条曲线上的方法,使得相邻的点在曲线上具有尽可能大的角度差。球面上的点可以用它们的经度和纬度来表示,因此CGAL::hilbert_sort可以用于对球面上的点进行排序。
总结:CGAL::spatial_sort和CGAL::hilbert_sort的区别在于它们的排序目的和应用场景不同。CGAL::spatial_sort用于对几何对象进行空间排序,而CGAL::hilbert_sort用于对球面上的点进行排序。在实际应用中,需要根据具体需求选择适合的排序函数。
CGAL 5.6 - Spatial Sorting: User Manual