0

我有 8000 个键/值对。我读到哈希速度是 O(1),但是在键上发生冲突时,它将变成 O(n),其中 n 是 log(item number),如果我的概念有误,请纠正我。

然后我想如果我使用多个表,比如说把1到3000放到hashtable1,3001到6000放到hashtable1,那么性能应该有更高的机会达到2*O(1)?此外,如何确定表 1、2 等的最佳尺寸?

另外,我读过帖子说如果我不使用多线程访问哈希图,使用哈希图会更好?这是真的吗?

4

2 回答 2

1

冲突的概率仅取决于元素数量与 HashTable 大小之间的比率。

您可以指定一个初始值,如果您不指定,Java 会为您处理这个问题。

是的,如果您没有并发访问权限,请使用 HashMap,因为您不会有同步数据结构的额外负担。

于 2013-10-14T16:58:39.517 回答
0

您在第一句话中为自己回答了这个问题: 我读到哈希速度为 O(1),但在 key 上有冲突

如果作为键的对象属于您编写的类,那么您可以完全控制如何hashCode()计算。使用单个地图并实施hashCode(),以便极不可能发生冲突。

如果您不控制hashCode()操作方式,您仍然可以编写一个包装关键对象并为它们计算自己的哈希码的类 - 结果将比使用多个映射的东西更容易阅读。

多映射方法是一种 hack - 由于哈希冲突导致的性能问题非常罕见 - 在大多数优化 I/O 的应用程序中,类似的事情比这种微优化带来更大的收益。因此,通常最好以可读性为目标。

于 2013-10-14T18:12:46.513 回答