完美hash函数应该怎么构造?
完美hash函数应该怎么构造?
自己准备把每个文章的一个个单词存到hash表里面,
看了下算法导论,用完美hash的话最左两次hash,这样会很快。
但是hash函数该怎么构造?
h(k)=((ak+b)mod p)mod m
a,b,p,m应该怎样选择呢?
[解决办法]
在博弈论里,对局面的HASH是这样的:
每个点,对不同值,给一个KEY,对局面中存在的各个点的数值,把每个KEY异或一下,得到的结果就是HASH。这里,KEY的值(每位)尽可能随机
换到这里,或许可以这样:
给出一个[100][26]的KEY表(一般KEY为32位整数),每个单词中的字母找到KEY值,异或的结果,作为HASH值(如果太大,可以只取表的长度)比如,HASH表大小为0x10000,HASH=KEY&0xFFFF
计算举例:
Hello的HASH=(KEY[7][0] ^ KEY[4][1] ^ KEY[11][2] ^ KEY[11][3] ^ KEY[14][4]) & 0xFFFF
[解决办法]
>a,b,p,m应该怎样选择呢?
随机试。这真没啥好办法。load factor低一些的话基本试O(1)个函数就可以找到了。