将单位平方映射到(0,1)

时间:2014-06-05 04:51:19

标签: algorithm

一般情况下,我正在寻找一种算法(有效地,有希望地)将单位平方中的任何点(即(0,1)x(0,1))映射到(打开或关闭)区间(0,1 )。

更具体地说,我的问题如下:在2D中给出2个点,我如何找到它们之间的顺序(即一个在另一个之前)

  • 交换
  • 不涉及“特殊”案例或测试浮点数是否相等

一种可能的想法是像莫顿或希尔伯特这样的空间填充曲线,但我似乎无法找到连续情况的描述(仅适用于离散的情节),我确信必须有一个替代。

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个或更多字符的任何其他字母