Dan*_*iel 8 algorithm math hash
背景:
我正在处理整数序列{0,1,2 ......,n}的排列.我有一个局部搜索算法,以某种系统的方式将排列转换为另一种排列.算法的要点是产生最小化成本函数的置换.我想处理各种各样的问题,从n = 5到n = 400.
问题:
为了减少搜索工作,我需要能够检查我之前是否处理过特定的整数排列.我正在使用哈希表,我需要能够为每个排列生成一个id,我可以将其用作表中的键.但是,我想不出任何好的哈希函数将一组整数映射到一个键中,这样碰撞不会太频繁发生.
我试过的东西:
我开始生成一个n个素数序列,并将我的排列中的第i个数乘以第i个素数,然后对结果求和.然而,即使对于n = 5,所得到的密钥也会产生冲突.
我还想将所有数字的值连接在一起,并将结果字符串的整数值作为键,但即使对于小的n值,id也会很快变得太大.理想情况下,我希望能够将每个键存储为整数.
stackoverflow对我有什么建议吗?
从您的问题和您留下的评论来判断,我会说您的问题无法解决.
让我解释.
你说你需要一个独特的哈希组合,所以让我们制定规则#1:
好的,然后在评论中你已经说过,因为你使用了很多数字,由于内存的限制,将它们存储为字符串或诸如哈希表的关键字是不可行的.所以让我们将其重写为另一条规则:
基本上,你试图占用大量数据,并将其存储在一个小得多的数字范围内,并且仍然具有唯一性.
对不起,但你做不到.
典型的散列算法产生相对独特的散列值,所以除非你愿意接受碰撞,否则新组合可能被标记为"已经看到",即使它没有,那么你运气不好.
如果你要尝试一个位字段,每个组合都有一个位,如果没有看到它就是0,你仍然需要大量的内存.
对于你在评论中留下的n = 20的排列,你有20个!(2,432,902,008,176,640,000)组合,如果您尝试将每个组合简单地存储为位字段中的1位,则需要276,589TB的存储空间.
你将不得不限制你想要做的事情的范围.