我很清楚比较浮子所涉及的所有问题.这正是这个问题的原因.
我正在寻找为3D矢量(3个浮点数 - x,y,z)的值创建快速哈希表.可以假设向量的长度始终为1.0(sqrt(x*x+y*y+z*z)
为1.0)
从本质上讲,这意味着我正在寻找一个哈希函数,它接受的值几乎等于相同的unsigned int值,并且相应的相等运算符如果哈希值相等则为true(不一定只有它们相等)
编辑 -
假阳性(即不同但向同一个桶映射的向量)是给定的,因为这是一个哈希表.
假阴性(即关闭但映射到不同桶的向量)是不合需要的,但似乎没有办法避免它们.在我的情况下,它们不会导致完全破损,只是一些数据重复,这是我将不得不忍受的.
我认为你所寻找的东西不是直接可能的.平等的一个重要特性是它具有传递性.(即.如果a == b和b == c,则a == c).但是,通过距离测量,您真的不需要这个属性.例:
拿一个浮子(为简单起见).假设我们想要散列每个浮点数,以便小于1e-3的浮点数是相同的值.现在,假设我们将所有1e-4分别添加到此哈希表1000浮点值.任何相邻的2个值都应该散列到同一个浮点数,因为它们比1e-3更接近.但是,由于传递性,这些值的邻居也应该具有相同的值,以及它们的邻居等等.结果,所有1000个值(包括相距1e-3的对)将散列为相同的整数.如果你要在图片上绘制这些点:
A B C D E F G H ... Y Z
假设所有间隙相距<1e-3,但A和Z相距> 1e-3(不按比例!).这是不能满足的,因为如果所有对的hash(A)== hash(B)和hash(B)== hash(C)等等(因为它们相距<1e-3)而不是hash(A )必须==哈希(Z).
一种可能的选择是定义向量空间的区域,其中所有向量将散列到相同的值(即在对它们进行散列之前将它们舍入),但是仍然可以在它们各自的空间的边缘上获得2个向量但是散列的向量不同的价值.您可以通过在所有相邻空间中搜索矢量来解决这个问题.(即在上面的1-d情况下,你将所有向量四舍五入到最接近的1e-3的倍数,然后搜索邻居,因此5.3e-3将搜索5e-3,4e-3和6-e3.在高维情况下,您必须搜索所有维度的邻居.)