今天遇到的一个问题,可以抽象成如下所述:
有n个整数,就假定是都大于0的,也就是n个正整数,各不相同。从中任选两个数可以构成一对[a,b]其中a!=b),并且认为[a,b] == [b, a],需要用这一对来作为一个签名,或者简单点说就是一个标识用来唯一地确定另外一组东西E。但是,E中的元素e是用一个整数来标记,也就是说不能够直接将[a, b]赋给e。
ok,问题清楚了,实际上这里需要的就是将[a, b]转换成另外一个数k,然后用k来标记e。
如何解决?这实际上是一个将二维空间压缩成一维的问题,直接用简单的四则运算肯定是不行的,那样可能会导致将不同的[a, b]映射到同一个k。期间我也考虑过用位(bit)运算,不过貌似也不行。
考虑到n[i]一般不会太大(基本上都<10 000),可以利用下面这个式子进行映射:
k=K(<a, b>) = min(a, b)*MAX(n) + max(a, b)
其中MAX(n)表示n个正整数中的最大值,对于给定的数集合来说这是一个定值。然后用它乘以a, b中较小的一个,这样可以保证最后得到的k值相对小一些。这个思路有点段地址+偏移量的感觉,前面两个数相乘后相当于一个段地址,后面再加上一个偏移量,这样可以保证唯一地映射到一个k值。
这个方法的缺点是映射后k可能比较大,并且因为有乘法理论上还是存在越界的问题。
继续考虑ing,希望有更好的办法……