我正在尝试确定一个哈希函数,它接受一个输入(i,k)并确定一个唯一的解决方案。
(i,k)的可能输入范围为0到100.将每个(i,k)视为三项树中节点的位置。
Ex: (0, 0) can diverge to (1, 1) (1, 0) (1, -1).
(1, 1) can diverge to (2, 2) (2, 1) (2, 0).
这里给出的样本:
http://www.google.com/imgres?imgurl=http://sfb649.wiwi.hu-berlin.de/fedc_homepage/xplore/tutorials/stfhtmlimg1156.gif&imgrefurl=http://sfb649.wiwi.hu-berlin.de/fedc_homepage/xplore/tutorials/stfhtmlnode41.html&h=413&w=416&sz=4&tbnid=OegDZu-yeVitZM:&tbnh=90&tbnw=91&zoom=1&usg=__9uQWDNYNLV14YioWWbrqPgfa3DQ=&docid=2hhitNyRWjI_DM&hl=en&sa=X&ei=xAfFUIbyG8nzyAHv2YDICg&ved=0CDsQ9QEwAQ
我正在使用地图
map <double, double> hash_table
我需要一个键值来确定从对(i,k)到散列到的值(i,k)
到目前为止,我只能提出线性函数,例如: double Hash_function(int i,int k)
{
//double val = pow(i, k) + i;
//return (val % 4294967296);
return (i*3.1415 + k*i*9.12341);
}
但是,我无法确定具有某个(i,k)的唯一键。我可以用什么样的功能来帮助我这样做?
答案 0 :(得分:2)
从数学上讲,你正在寻找一个bijection。这不是计算机科学意义上的哈希函数,因为哈希函数有时会产生冲突(除非它是perfect hash function)。
您标记为hash_table
的内容不是哈希表。 std::map
是一种称为有序映射的不同数据结构,它可以使用小于运算符<
提供strict weak ordering的任何键类型。实际上,您可以使用utility
标题中的std::pair
:
std::map<std::pair<int, int>, double> table;
要插入表格,您可以使用:
table[std::make_pair(i, j)] = value;
答案 1 :(得分:1)
@Grizzly是正确的,使用double作为键是有问题的。也许最好使用基于字符串的散列技术?
答案 2 :(得分:0)
如果我和我k是0-100,比你的密钥可以是一个简单的短(甚至是有符号的),并且是用short key = i | k << 8
之类的东西唯一生成的。