【问题标题】:Difference between a general Hash table and java's HashMap in Big OBig O中一般Hash表和java的HashMap的区别
【发布时间】:2014-01-06 14:05:43
【问题描述】:

Hash table wiki 条目将其大 O 列为:

搜索:O(n)
插入:O(n)
删除:O(n)

当 java HashMap 与 Big O 一起列出时:

得到:O(1)
把:O(1)
删除:O(1)

有人能解释一下为什么概念和实现之间的大 O 不同吗?我的意思是,如果有一个最坏情况为 O(1) 的实现,那么为什么概念中可能存在 O(n)?

【问题讨论】:

  • 基本上你需要区分“最坏情况”和“平均” - 你为 HashMap 引用的 O(1) 是平均的,而不是最坏的可能。
  • @JonSkeet 我知道这听起来很愚蠢,但大 O 不是只用来描述最坏的情况吗?
  • @Songo:理论上是的。在实践中,很多人(包括我自己)对此不太准确。
  • @JonSkeet 没有。在最严格的理论意义上,大 O 和大 Theta 都描述了函数的界限,区别在于上(大 O)和紧(大 Theta ) 界限。最坏/平均/最佳情况与界限的类型正交,它描述了您界限的什么:您可以界定最坏情况输入所用的时间,或平均输入所用的时间。我在这里使用时间作为示例函数,但当然也可以使用其他指标:占用的空间、执行某些操作的频率、树的高度、图中的链接数、缓存数未命中等。

标签: java algorithm data-structures hashmap big-o


【解决方案1】:

最坏的情况是 O(n),因为您放入 HashMap 的每个条目都有可能产生相同的哈希值(比如说 10)。这会为每个条目产生冲突,因为每个条目都放在 HashMap[10] 中。根据实施的冲突解决策略,HashMap 要么在索引 10 处创建一个列表,要么将条目移动到下一个索引。

但是当再次访问该条目时,哈希值用于获取HashMap的初始索引。由于在每种情况下都是 10,因此 HashMap 必须解决这个问题。

【讨论】:

    【解决方案2】:

    因为最坏情况和平均情况之间存在差异,甚至维基百科列出了平均情况的 O(1) 复杂度。 Java 的 HashMap 与维基百科的 Hash 表完全相同。所以这只是一个文档问题。

    基本上,哈希表从您要存储的对象中计算出一个数值。该数值大致用作访问将对象存储到的位置的索引(导致 O(1) 复杂度)。但是,有时某些对象可能会导致相同的数值。在这种情况下,这些对象将存储在一个列表中,该列表存储在哈希图中的相应位置,因此最坏情况下的复杂度为 O(n)。

    【讨论】:

    • 好几个博客(example1example2)提到它有 Big-O(1),不应该用 Big-Theta(1) 来表示平均情况吗?跨度>
    【解决方案3】:

    我不确定您在哪里找到了所报告的 java HashMap 复杂性,但它列出了平均情况,这与您链接的页面上的维基百科状态相匹配。

    【讨论】:

    • 好几个博客(example1example2)提到它有 Big-O(1),不应该用 Big-Theta(1) 来表示平均情况吗?跨度>
    猜你喜欢
    • 2010-11-24
    • 2012-08-07
    • 2012-08-21
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 2012-10-25
    相关资源
    最近更新 更多