0

我想将大约 100 个非负 32 位整数的列表压缩成一个整数。理想情况下,生成的整数始终是唯一的,但可以接受一些相对罕见的冲突。我怎样才能做到这一点?

我正在写一个解谜者。我的搜索算法的一部分是避免重新探索已经看到的谜题状态。我将使用从列表中生成的整数作为statesAlreadySeen表中的键。目前我使用字符串作为键。但是,从字符串键到整数键时,我已经看到了明显的性能改进,map<,>因此我想切换。

编辑:感谢无序的地图建议!但是我仍然对实际的散列函数感到好奇。IIRC 有一个简单的功能,涉及基本的位操作和异或运算。很高兴看到这一点并对碰撞概率有一些大致的了解。

4

1 回答 1

2

正如评论中所建议的,您需要使用哈希函数。最容易完成boost::hash_range

#include <boost/functional/hash.hpp>
std::size_t vectorhash(std::vector<int> f){
    size_t hash = std::size_t hash = boost::hash_range(f.begin(), f.end());
}

话虽如此,如果你没有真正需要保持状态有序(我不明白你为什么会这样做),我会选择 us2012 的解决方案,即保留string密钥并切换到unordered_map- 从而让容器照顾散列。

于 2013-02-18T00:52:17.140 回答