为什么Java文档不包含时间复杂度?

时间:2013-11-26 19:56:49

标签: java algorithm

我发现java并没有为任何Collection库指定任何时间或空间复杂性,这真的很令人惊讶。鉴于java中的垃圾收集是不可预测的,因此没有任何保证,但至少给出平均时间复杂度并不是有帮助的吗?我在这里缺少什么?

4 个答案:

答案 0 :(得分:1)

时间复杂性取决于您如何使用集合,但它们通常遵循标准时间复杂性。您可以在任何地方找到数组,链表,树或哈希映射的时间复杂度,但不要求实现遵循这些复杂性。

简而言之,时间复杂度适用于理想的机器,而不是具有实际实现的真实机器,因此即使您知道时间复杂度,实际用例的细节也可能更为重要。

答案 1 :(得分:1)

基于实施,时间复杂性大多是不言自明的。 LinkedList将是恒定的时间将项目添加到最后,接近线性以在中间添加项目。 HashMap将接近持续访问时间,ArrayList将是线性的,直到需要增长数组等为止。

答案 2 :(得分:1)

主要方面存在时间复杂性,有关方法性能的警告和对原创作品的引用。我认为这些评论很有用,而且大O可能并不总是有用。

即。 Arrays.sort(Object[] array)

  

实施说明:此实施是稳定的,适应性的,   迭代合并,需要远远少于 n lg(n)比较   当输入数组部分排序时,同时提供   输入数组时传统mergesort的性能   随机排序。如果输入数组几乎排序,那么   实施需要大约n次比较。临时   存储要求从近似排序的小常数变化   输入数组到n / 2个对象引用,用于随机排序的输入   阵列。

     

实施同样有利于提升和提升   在其输入数组中降序,并可以利用   在不同部分的升序和降序   输入数组。它非常适合合并两个或多个排序数组:   只需连接数组并对结果数组进行排序。      该实施改编自Tim Peters的列表排序   Python([TimSort - http://svn.python.org/projects/python/trunk/Objects/listsort.txt)。   它使用了Peter McIlroy的“乐观主义”中的技术   排序与信息理论复杂性“,在”论文集“中   第四届年度ACM-SIAM离散算法研讨会,第467-474页,   1993年1月。

CopyOnWriteArrayList

  

这通常成本太高,但可能更多有效   当遍历操作数量大大超过时,   突变,并且在您不能或不想同步时很有用   遍历,但需要排除并发之间的干扰   线程。 “快照”样式迭代器方法使用引用   创建迭代器时的数组状态。   这个数组在迭代器的生命周期中永远不会改变,所以   干扰是不可能的,并且保证迭代器不会   抛出ConcurrentModificationException。

答案 3 :(得分:1)

我不知道你在谈论什么。 HashSet

  

该类为基本操作(添加,删除,包含和大小)提供恒定的时间性能,假设散列函数在桶之间正确地分散元素。迭代此集合需要的时间与HashSet实例的大小(元素数量)加上后备HashMap实例的“容量”(桶数)之和成比例。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或负载因子太低)非常重要。

ArrayList

  

size,isEmpty,get,set,iterator和listIterator操作以恒定时间运行。添加操作以分摊的常量时间运行,即添加n个元素需要O(n)时间。所有其他操作都以线性时间运行(粗略地说)。与LinkedList实现相比,常数因子较低。