【问题标题】:java using two hashtables is better than one?java使用两个哈希表比一个好?
【发布时间】:2013-10-14 16:56:08
【问题描述】:

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

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

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

【问题讨论】:

  • 在分析器证明它是瓶颈之前不要想太多,所以对所有键使用一个 Map。是的,使用 HashMap 而不是 Hashtable 类。
  • 您可以通过事先确定确切的数量(或足够接近的东西)或条目将是多少(并相应地设置大小+负载因子)来确定最佳大小。当然这很简单..
  • 我猜是这样,但我想知道这个概念思维是否正确?谢谢!
  • 过早优化,是万恶之源
  • 对于编辑者,只能使用"`" char来格式化成code,嗯,code。 O(N) 不是代码。

标签: java hashtable


【解决方案1】:

冲突的概率只取决于元素个数和HashTable大小的比值。

你可以指定一个初始值,如果你不指定,Java 会为你处理这个就好了。

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

【讨论】:

  • 您还可以指定负载因子,以便在哈希表的性能不能满足您的需要时调整哈希表。虽然它通常也可能是键的不良哈希函数。
  • 假设10个项目,其中3个经过hash后将成为相同的key,这会破坏hashtable的性能,即使比例很小?谢谢
  • @manhon 如果他们都有相同的密钥,看起来更像是你的哈希方法的问题。
  • 我不知道,我只是使用 Java 哈希表,并在其中添加一些单词,比如“苹果”、“橙子”,我不会检查哈希后是否这些水果会有相同的键?或者我应该做些什么来看看是否有碰撞?
  • @manhon 再来一次:如果您的应用程序出现性能问题,请使用分析器来确定它们的位置。如果分析器显示问题出在MapHashtableHashMap 或您使用的任何实现)操作中,则开始担心,否则,不要
【解决方案2】:

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

如果作为键的对象属于您编写的类,那么您可以完全控制hashCode() 的计算方式。使用单个地图并实现hashCode(),这样就不太可能发生冲突。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多