快速散列算法,用于将浮子集合的映射/量化到一小组排序的浮点上
-
29-09-2020 - |
题
使用我的应用程序,我有
- 集合x:数千个浮点数,值范围[0,1],不排序。
- 集合Y:11浮子从[0,1]的范围,分类。
- X的大小是已知的。让它是l。
目标是量化x并将其映射到y上,以便我们获得x的次数的散列阵列。然后,y将被量化到指向它的10个离散的东西上。
一个例子让它更清晰,
-
Y = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
-
X = [0.678, 0.124, ..., 1.0, ., 0.013, 0.475]
我希望算法输出为基于0的指数:
-
H(Y[0]) = H(0.678) = 6
-
H(Y[1]) = H(0.124) = 1
-
H(Y[n-2]) = H(0.013) = 0
-
H(Y[n-1]) = H(0.475) = 4
尝试
天真地,我尝试了线性和二进制搜索用于将x中的每个元素定位在Y中的元素之间,以便在y中的相邻元素之间找到。
但是,性能对我的应用程序不够好。该量化发生在慢速计算的实时线程中,这是不希望的。问题
这种散列/量化的最佳方式是什么? x未排序。
谢谢!
解决方案
带x,乘以10,000,舍入到最接近的整数。在普通的c,z=(int)中(x次10000.0)。
有10,000个可能的z值。对于z的大多数值,您可以从z确定索引。所以创建一个有10,000个条目的表。在表格中,存储索引i如果您可以证明x应映射到i,知道z和store -1如果您无法证明这一点。
结果,您可以获得正确的值,可能在10,000个值的9,980中,然后使用您的剩余算法在500值中使用任何慢速算法。
ps。相同的表格尺寸将用于双精度数字。无论表尺寸如何,只有很少的值x无法使用此方法正确映射,也许是10或20。如果您拍摄大小10,000,那么99.8%或99.9%映射正确,0.1%或0.2%需要一个慢速算法。双重发生了同样的事情。您可以使用1000个条目,然后10或20个失败的输入将是1%或2%。
和一件好事是,这种方法将工作,但是y值是分布式的。只有在y值的数量较大,那么你可能想要增加表大小。
不隶属于 cs.stackexchange