【发布时间】: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