这是一个前缀哈希函数。我想计算这种方法中的碰撞次数,但我不知道该怎么做。看起来它可能很简单,但我不能想到一个很好的方法来做它....
int HashTable_qp::preHash(string & key, int tableSize )
{
string pad = "AA";
//some words in the input are less than 3 letters
//I choose to pad the string with A because all padded characters
//have same ascii val, which is low, and will hopefully alter the results less
if (key.length() < 3)
{
key.append(pad);
}
return ( key[0] + 27 * key[1] + 729 * key[2] ) % tableSize;
}
答案 0 :(得分:1)
如果是基础数据结构的数组:
int hash = preHash(&key, array.length);
if(array[hash] != null)
this.count++;
如果它是一系列链表,请执行:
if(array[hash] != null && *(array[hash]) != null)
this.count++
如果您只能访问stl库,我相信只测试该元素为null 在调用哈希函数之后添加它就足够了。
答案 1 :(得分:1)
创建直方图:
unsigned histogram[tablesize] = {0};
生成一些(所有)可能的字符串并计算其hashval,并相应地更新直方图:
for(iter=0; iter < somevalue; iter++) {
hashval = hashfunc( string.iterate(iter) ); // I don't know c++
histogram[hashval] +=1;
}
现在你必须分析块/簇的哈希表。经验法则是,对于(tablesize==iter)
,您期望大约30%的单元格具有count = 1,并且大约30%的单元格为空;其余的有两个或更多。
如果你将所有(count*(count+1))/2
求和,并除以表格大小,你应该期望大约1.5。一个坏的散列函数给出了更高的值,一个完美的散列只有count = 1的单元格(因此:ratio = 1)对于线性探测,你当然不应该使用tablesize = niter,但要使tableize更大,比如说大两倍。但是,您可以使用相同的度量标准(探测次数/条目数)来分析其性能。
更新:关于哈希函数及其性能的精彩介绍可以在http://www.strchr.com/hash_functions找到。
答案 2 :(得分:0)
您可以创建一个整数数组,每个整数表示一个哈希值。当你完成哈希循环遍历数组的嵌套循环。如果你有以下数组,
[0] -> 13
[1] -> 5
[2] -> 12
[3] -> 7
[4] -> 5
对于 0..n 中的每个项目我,请检查项目 i + 1..n 以查找匹配项。用英语表示:检查每个元素是否等于之后的任何元素。