给出一个数字向量:V =(v1,v2,...,vn)。这些n个数字不需要区分或排序。
假设我们有几个向量V1,V2,...,Vm。可以使用数字(整数或浮点数)来唯一地表示每个向量,这样对于任何不等于Vj的Vi,相应的数字f(Vi)和f(Vj)也不相等。
一个简单的解决方案是使用0到m-1范围内的一个数字作为ID来表示向量,但是我们假设这种解决方案在每个向量存储在少数几个分布的情况下都不起作用机器。也就是说,两台机器中的矢量部分可能会重叠,并且算法不会全局知道矢量的分布。
答案 0 :(得分:1)
当然,如果您有n个数字,则无法将它们压缩为一个相同长度的数字而不会丢失信息(例如,如果您从向量计算某种哈希值,则会出现哈希冲突)。
如果你有无限的空间(比如Java中的BigInteger),你可以编码向量。假设矢量长度是固定的,您可以简单地使用一些“互锁”模式:
vector = [12345,4711,42]
1 2 3 4 5
0 4 7 1 1
0 0 0 4 2
100240370414512 <-- your unique number
对矢量大小进行编码也不应该太难,因此这也适用于不同大小的矢量(例如,您使用八进制长度和8作为“前缀”)。
答案 1 :(得分:0)
我假设输入原则上是无限的,输出数也是如此,否则它是微不足道的。一种简单的方法就是在一些基数b中连接n和v1,v2,... vn的表示。用k位数表示它们,然后用连续位注释每个k位数字(如果下一个k位组开始一个新数字则为0,如果它属于相同数字则为1)。除了相等测试之外,这对任何事情都没有多大用处,但是你没有提到任何其他内容。
如果您还关心保留局部性(即附近的点p,q经常具有附近的值f(p),f(q)),则可以使用一些空间填充曲线用于此目的。将Hilbert curve推广到更高维度有点复杂,并且计算非常重要。 Z-order curve并不擅长保留局部性,但实现任意数量的维度几乎都是微不足道的 - 只是交错二进制表示的位。