[a,b]=>k

 

今天遇到的一个问题,可以抽象成如下所述:

有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,希望有更好的办法……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值