一般情况下,我正在寻找一种算法(有效地,有希望地)将单位平方中的任何点(即(0,1)x(0,1))映射到(打开或关闭)区间(0,1 )。
更具体地说,我的问题如下:在2D中给出2个点,我如何找到它们之间的顺序(即一个在另一个之前)
一种可能的想法是像莫顿或希尔伯特这样的空间填充曲线,但我似乎无法找到连续情况的描述(仅适用于离散的情节),我确信必须有一个替代。
答案 0 :(得分:1)
由于计算机不能代表连续数字,我们最终必须坚持离散的情况(无论我们使用什么数字表示)。
让我们假设"单位间隔"收入$ N $数字。那么"单位广场"由$ N ^ 2 $个离散元素组成。
实际上,这意味着我们需要两倍的位来表示单位平方的元素。
这实际上意味着x和y坐标的连接将完成这项工作。 这实际上产生了离散的蛇形空间填充曲线。
由于映射是双射的,因此离散单位区间的井排序也直接转换为单位平方上的井排序。
关键是,在任何情况下,你需要两倍的位,而且它总是以某种的方式归结为一个组合。
我不确定这是不是你的想法。也许你自己并不是很清楚你想要/需要什么?
答案 1 :(得分:0)
如果您有double
或计算机用来模仿具有有限值集的读取数字的任何其他类型,则无法从(0,1)x(0,1)
获取bijection (0,1)
- 因为这种情况|(0,1)x(0,1)| > |(0,1)
,所以没有。
一个有损的解决方案是使用两个元素的平均值:f(x,y)=(x+y)/2
- 当然,正如预期的那样 - 不同值之间会发生冲突(无法避免)。
但是,如果您正在处理实数('真实' (0,1)
),您可以。
每个实数r
可以用字母{0,1,...,9}
中的无限向量表示。 1 因此,您可以创建一个在不同数字之间交错的新向量:
例如:
r1=0.3360000... r2=0.518000....
f(r1,r2) = 0.3531680000....
如果你想要f((x,y)) == f((y,x))
,你可以简单地排序"排序"每对,并将较小的元素放在第一位。对于上面的示例,您将获得:
f(r1,r2) = 0.3513680000....
请注意,此解决方案也存在冲突,以避免冲突 - 您可以引入新功能g()
:
g(3i) = min{r1[i], r2[i]}
g(3i+1) = max{r1[i],r2[i]}
g(3i+2) = r1[i]<r2[i] ? 0 : 1
对于上面的例子,这将给你:
g(r1,r2) = 0.351132681002002.....
(1)或其中包含2个或更多字符的任何其他字母