请教hash表的一个基本问题

leiyang 2008-09-24 03:38:33
我的字符串hash算法是ELFhash,返回值是int型;hash表存放的是链表的指针,以防止冲突。

问题是我不知道hash表如何定义及大小如何选定,是不是要如下定义一个数组:
void * hash[sizeof(int)]
这样也太大了吧?2147483647 x 4 = 8G???

所以特请教各位。多谢!
...全文
125 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
请问wuyi8808,如何动态增长?我有几十万的字符串,hash函数算出来的key都不固定,有大有小,范围也不确定。
重点就在你的算法,要尽量想办法防止冲突,至于你说的大小不确定,很容易搞定,假如你的字符串是30万个,那你把hash后的key再对30万求余就可以了,关键是之后再考虑要防冲突。
test4ever 2008-09-25
  • 打赏
  • 举报
回复

int ELFhash(char *key)
{
unsigned long h=0;
while(*key)
{
h=(h<<4)+*key++;
unsigned long g=h&0Xf0000000L;
if(g) h^=g>>24;
h&=~g;
}
return h%MOD; //MOD 为与你HASH表大小相近的质数
}
moxiaolan 2008-09-25
  • 打赏
  • 举报
回复
你可以定义一个hash表长度的序列表,当然里面存的都是质数;
申请hash表空间的时候,先按照预先的估计申请一个长度,然后每次插入数据的时候,根据冲突的情况考虑重新申请空间,而重新申请空间的长度就是此时空间的长度的下一个长度序列表中的值;
如:int hash_len[] = {2,3,5,7,11,13,...};
当前hash表的长度为7,即hash_len[3],那么如果发生冲突时,你可以考虑将hash表的长度扩充为11,即hash_len[4]

感觉stl的内存管理也是这么做的。
ghyxy 2008-09-25
  • 打赏
  • 举报
回复
当然要根据实际应用需求定,一般要是2倍的数据长度,才能保证冲突率不高,所以一般哈希表的存储效率只有50%。
GoldenHunter 2008-09-24
  • 打赏
  • 举报
回复
hash算法的关键就是需要找出合适的hash表长度和hash函数,尽量减少冲突,并使得你的冲突链表不会太长
yanghehong 2008-09-24
  • 打赏
  • 举报
回复
你既然知道你的字符串有几十万个,那么hash表大小就可以取几十万的数量级。
在ElfHash算法的最后对 表大小 取模,那么得到的索引就在表大小的范围内。取质数可以让最后得到的hash值分布得更均匀些。
leiyang 2008-09-24
  • 打赏
  • 举报
回复
请问wuyi8808,如何动态增长?我有几十万的字符串,hash函数算出来的key都不固定,有大有小,范围也不确定。

yanghehong,sizeof(int)你是对的,我这里只是说明一下是int的范围,没想到写错了。
关于你说的取一个合适的质数,我还是没有看明白。
yanghehong 2008-09-24
  • 打赏
  • 举报
回复
表的大小应该根据问题取一个合适的质数。
在hash函数中对 表大小 取模,让返回值在表索引的范围内。

BTW. sizeof(int)应该是存一个int需要多少个byte,而不是2147483647 x 4
wuyi8808 2008-09-24
  • 打赏
  • 举报
回复
hash表只需定义为一个可以动态增长的字典,以hash值为key。

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧