【发布时间】:2019-02-12 01:16:09
【问题描述】:
我有一个非常特殊的问题想要有效地解决。
几何由 V 个体积定义,编号从 0 到 V-1。 每个体积都以不同的表面为界,编号从 0 到 N-1)。
Volume | Surfaces
--------------------
Geometry A (V=2, N=7): 0 | [0 3 5 6 2]
1 | [5 4 2 1]
2 | [4 0 1 3 6]
请注意,曲面在体积中只会出现一次。 此外,一个表面最多包含 2 个几何体。
这是问题:
我对相同的基础几何有两种不同的描述,我想找出几何 A 中的哪个体积对应于几何 B 中的哪个体积。换句话说,我有相同的 N 个表面,但 V 体积的定义不同。
这是一个可以对应于上述几何 A 的几何 B:
Volume | Surfaces
--------------------
Geometry B (V=2, N=7): 0 | [1 5 4 2]
1 | [3 6 5 0 2]
2 | [0 1 3 6 4]
给定几何 A 和 B,我希望能够以尽可能最有效的方式将几何 A 的每个体积绑定到几何 B 中的相应体积。
A 0 1 2
B 1 0 2
解决方案草案:
按升序或降序对每个曲面数组进行排序,而不是按照其曲面的字典顺序对每个卷进行排序。通过这种方式可以轻松且稳健地解决问题。
更好的解决方案:
为每个数组计算一个快速、唯一的散列,而不是按照该散列对卷进行排序。哈希不应依赖于数组中表面的顺序。
为什么我认为哈希是一个很好的解决方案?
取散列(Volume) = min([Surfaces])
这个散列最多已经有 1 次碰撞,因为一个表面只能出现在 2 个卷中!
现在,如果我取 hash(Volume) = min([Surfaces]) + max([Sufaces])*N,我仍然最多有 1 次碰撞,但是当有很多卷时概率变得非常小和表面。
【问题讨论】:
-
“更好的解决方案”似乎可行。您有什么需要帮助的吗?
-
你很难想出一个“唯一”的哈希值。任何散列方案都有可能发生冲突。不过,您可以降低碰撞的可能性。例如,如果表面数量很少(小于 32,768),您可以在 32 位数字的低位和高位部分编码 min 和 max。