已知有4万多个string,要放入自己定义的 hashtable 里,有什么好建议吗?

anggogo 2004-11-05 10:35:33
刚看到要求的时候,本来想就采用 jdk 的方法,当每当加入一定的记录, array 就自动扩展,然后就 rehash

但突然一想,不对。那种方法是在记录数未知的时候才有意义,我已经有一个大概的范围了,还每次 rehash 那么麻烦干嘛。

可是,我总不能建一个 size 为 4万多的数组吧,好像有点傻

要不建了 2万多?每个元素 link 多一个,那么 hash 后的查找也最多找两次

还是建1万多?4000?

但当我的元素越少的时候,collision 发生的机会就大,即使有很好的 hash function, 也不能保证数组每一个元素 link 下去的能够平均分配哦

有什么其他的建议吗?
谢谢
...全文
278 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
若林林 2004-11-09
  • 打赏
  • 举报
回复
序列化,缓冲池。
zqj9899 2004-11-08
  • 打赏
  • 举报
回复
hashtable注重安全,hashmap追求速度
treeroot 2004-11-05
  • 打赏
  • 举报
回复
如果你一定要用哈希表的化就一次指定最好

你只有String,用什么做Key呀?
treeroot 2004-11-05
  • 打赏
  • 举报
回复
即使有冲突,hash表也会rehash的.
所以如果知道有多少条的化最好一开始指定4w

rehash是根据size的大小来rehash的,和是否冲突没有关系.
    if (size++ >= threshold)
      resize(2 * table.length);
所以你的考虑是多余的.
anggogo 2004-11-05
  • 打赏
  • 举报
回复
拜托,这是 requirement,只能用自定义 hashtable,是个类似 dictionary 的东西

就算放数据库,也不会有 hashtable 那个查找效率哦

to ahtu

什么意思?hashtable指定大小?
当然可以,jdk就是这么写的,可是那个就是 array 的 linkedlist 而已

而且只有在大小未知的时候,jdk那种做法才有意义
ahtu 2004-11-05
  • 打赏
  • 举报
回复
不是可以指定大小的吗
sgdb 2004-11-05
  • 打赏
  • 举报
回复
这么多东西,为什么不放到数据库里?
yub1981_cn 2004-11-05
  • 打赏
  • 举报
回复
需求,太不具体了吧??让人看了,面太广了,根本不知道,你要干什么,出于什么目的,达到什么效果,让人家怎么讨论阿。。。。
gks_cn 2004-11-05
  • 打赏
  • 举报
回复
自己写好。java就是封装得太高层了。实际上很多要求高的需求还是需要地层的编程。这样的机会不多啊。
HitXU 2004-11-05
  • 打赏
  • 举报
回复
楼主,你问的这个问题应该通过自己测试来解决,因为到底hash表开多大既满足你的要求又有最理想的效率是要靠多次测试总结的出来的,在这里问,别人也不好说是开4w好还是开2w好。还有,这与你的内存使用情况,以及要求的执行效率有关,如果你的内存很大,而要求效率最高,那让内存闲着也是闲着,当然开的足够大好了。如果内存吃紧,那就要折中了。另外你是用什么函数计算hash值的。有一些,即使空间足够,还是有冲突的,也就是说你开了4w,可能还会有冲突,有的空闲。当然数据量小的时候不太可能出现这种情况。
AllError 2004-11-05
  • 打赏
  • 举报
回复
就是!哪有这样的客户,说不定是你们误会了人家的意思.支持楼上的建议
xdev 2004-11-05
  • 打赏
  • 举报
回复
数据库 + LRU Hashtable 缓冲
yuantiou 2004-11-05
  • 打赏
  • 举报
回复
你这个需求说的不是很明确。

如果是文字固定的话,直接用properties文件吧。然后对properties文件进行操作。

自己重写的hashtable的话,是有一定风险的。希望你能注意。
anggogo 2004-11-05
  • 打赏
  • 举报
回复
唉,算了,说不清楚

自己重写 hashtable 是 requirement

其实我也觉得这些东西很傻,可是没办法
huntgf 2004-11-05
  • 打赏
  • 举报
回复
那你还不如创建一个Vector呢,给每给string编上id
1-40000,效率绝对高,占用的内存也不过几百k,完全可以,而且效率绝对高
treeroot 2004-11-05
  • 打赏
  • 举报
回复
你要自己重写hashtable,何必呢,何苦呢?
你开始指定大小就不会有rehash的过程了
anggogo 2004-11-05
  • 打赏
  • 举报
回复
唉,大家都没看清楚

我是要自己重新写一个 hashtable ,不是直接用 util 里面那个

我知道 jdk 里面的 hash 是怎么写的,我是说它那种方法是当数量总数达到一定的时候,就会自动扩展。而且实际上是比 4w 还要大的一个数组,如果我事先已经知道大小,就好像没有 rehash 的必要。

因此,我就是觉得一开始就创建那么大一个数组好像有点傻

算了,这种 standard 的东西,估计也没有什么好方法,我还是就这么写算了

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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