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

为什么Java文档不包含时间复杂性?,java,algorithm,Java,Algorithm,我发现java没有为任何集合库指定任何时间或空间复杂性,这确实令人惊讶。考虑到java中的垃圾收集是不可预测的,因此没有什么是可以保证的,但至少给出一个平均时间复杂度不是很有帮助吗?我在这里遗漏了什么?时间复杂性取决于您如何使用集合,但它们通常遵循标准时间复杂性。您可以在任何地方找到数组、链表、树或哈希映射的时间复杂性,但不要求实现遵循这些复杂性 简而言之,时间复杂度适用于理想机器,而不是具有实际实现的真实机器,因此即使您知道时间复杂度,实际用例的细节也可能更重要。时间复杂度取决于您如何使用集合

我发现java没有为任何集合库指定任何时间或空间复杂性,这确实令人惊讶。考虑到java中的垃圾收集是不可预测的,因此没有什么是可以保证的,但至少给出一个平均时间复杂度不是很有帮助吗?我在这里遗漏了什么?

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


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

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


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

基于实现,时间复杂度大多是不言自明的。LIKEDLIST将是恒定的时间来添加项目到最后,接近线性添加项目在中间。HashMap将接近恒定的访问时间,ArrayList将是线性的,直到它需要增加数组等等。

基于实现,时间复杂性基本上是不言自明的。LIKEDLIST将是恒定的时间来添加项目到最后,接近线性添加项目在中间。HashMap将接近恒定的访问时间,ArrayList将是线性的,直到它需要增加数组,等等。

主要的方法有时间复杂性,关于方法性能的警告以及对原始作品的引用。我认为这些评论是有用的,而big-O的可能并不总是有用的

即数组。sortObject[]数组:

实施说明:此实施是一种稳定的、自适应的, 迭代合并排序,需要的lgn比较远远少于n个 当输入数组部分排序时 输入数组为空时传统mergesort的性能 随机排列的。如果输入数组几乎已排序,则 实现大约需要n个比较。短暂的 存储要求从一个小的常数到几乎分类的 输入数组到n/2个对象引用,用于随机顺序输入 数组

该实现同样利用了升序和升序 在其输入数组中按降序排列,并可以利用 升序和降序的不同部分相同 输入数组。它非常适合合并两个或多个排序数组: 只需连接数组并对结果数组进行排序。 该实现是根据Tim Peters的排序列表改编的 Python[TimSort-http://svn.python.org/projects/python/trunk/Objects/listsort.txt. 它使用了彼得·麦克罗伊的《乐观》中的技术 分类和信息论复杂性,在 第四届ACM-SIAM离散算法年度研讨会,第467-474页, 1993年1月

或CopyOnWriteArrayList:

这通常过于昂贵,但可能更有效 当遍历操作的数量远远超过其他方法时 突变,并且在无法或不想同步时非常有用 遍历,但需要排除并发 快照样式迭代器方法使用对 创建迭代器时数组的状态。 该数组在迭代器的生命周期内不会更改,因此 干扰是不可能的,并且迭代器保证不受干扰 抛出ConcurrentModificationException


主要的方法有时间复杂性、方法性能警告和对原创作品的引用。我认为这些评论是有用的,而big-O可能并不总是有用的

即数组。sortObject[]数组:

实施说明:此实施是一种稳定的、自适应的, 迭代合并排序,需要的lgn比较远远少于n个 当输入数组部分排序时 输入数组为空时传统mergesort的性能 随机排序。如果输入数组几乎已排序,则 实现需要大约n个比较。临时 存储要求从一个小的常数到几乎分类的 输入数组到n/2个对象引用,用于随机顺序输入 数组

该实现同样利用了升序和升序 在其输入数组中按降序排列,并且可以 利用 升序和降序的不同部分相同 输入数组。它非常适合合并两个或多个排序数组: 只需连接数组并对结果数组进行排序。 该实现是根据Tim Peters的排序列表改编的 Python[TimSort-http://svn.python.org/projects/python/trunk/Objects/listsort.txt. 它使用了彼得·麦克罗伊的《乐观》中的技术 分类和信息论复杂性,在 第四届ACM-SIAM离散算法年度研讨会,第467-474页, 1993年1月

或CopyOnWriteArrayList:

这通常过于昂贵,但可能更有效 当遍历操作的数量远远超过其他方法时 突变,并且在无法或不想同步时非常有用 遍历,但需要排除并发 快照样式迭代器方法使用对 创建迭代器时数组的状态。 该数组在迭代器的生命周期内不会更改,因此 干扰是不可能的,并且迭代器保证不受干扰 抛出ConcurrentModificationException


我不知道你在说什么。哈希集:

假定哈希函数将元素正确地分散在存储桶中,则此类为基本操作add、remove、contains和size提供恒定的时间性能。迭代该集合需要的时间与HashSet实例的大小、元素数量加上支持HashMap实例t的容量之和成比例因此,如果迭代性能很重要,那么不要将初始容量设置得太高或负载系数设置得太低是非常重要的

ArrayList:

size、isEmpty、get、set、iterator和listIterator操作在固定时间内运行。add操作在摊销固定时间内运行,即添加n个元素需要准时。粗略地说,所有其他操作都在线性时间内运行。与LinkedList实现相比,常数因子较低


我不知道你在说什么。哈希集:

假定哈希函数将元素正确地分散在存储桶中,则此类为基本操作add、remove、contains和size提供恒定的时间性能。迭代该集合需要的时间与HashSet实例的大小、元素数量加上支持HashMap实例t的容量之和成比例因此,如果迭代性能很重要,那么不要将初始容量设置得太高或负载系数设置得太低是非常重要的

ArrayList:

size、isEmpty、get、set、iterator和listIterator操作在固定时间内运行。add操作在摊销固定时间内运行,即添加n个元素需要准时。粗略地说,所有其他操作都在线性时间内运行。与LinkedList实现相比,常数因子较低


如果你想了解时间复杂性,这里有一个很好的参考:你为什么这么说?我想文档中确实列出了时间复杂性。Javadoc for ArrayList和PriorityQueue似乎都是这样做的。因为Java是一种可移植语言,在不同平台和/或JVM上的具体实现可能会有所不同。如果我理解w正如您所问的,部分原因是因为各个集合对于方法具有不同的时间复杂性,例如,HashSet可以执行O1包含,但LinkedList不能。接口的特定实现在其文档中应该具有时间复杂性。声明JDK类的时间复杂性是实现的特定于时间的错误。ArrayList的规范(包括时间复杂性)将所有实现绑定到此特性。如果您想了解时间复杂性,这里有一个很好的参考:您为什么这么说?我认为文档确实列出了时间复杂性。ArrayList的Javadoc似乎也这样做es PriorityQueue。由于Java是一种可移植语言,在不同平台和/或JVM上的具体实现可能会有所不同。如果我理解您的要求,部分原因是因为各个集合对方法的时间复杂性不同。例如,哈希集可以执行O1包含,但LinkedList不能。特定的实现f接口的文档中应该有时间复杂性。声称JDK类的时间复杂性是特定于实现的评论是错误的。ArrayList的规范(包括时间复杂性)将所有实现绑定到该特性。这些注释并不适用于所有实现。例如,没有这样的c针对TreeSet或SortedSet提到了复杂性。SortedSet不能有复杂性成本,因为它是抽象的,TreeSet也有复杂性成本:此实现为基本opera提供了有保证的logn时间成本
添加、删除和包含。我同意在一些参考表中明确说明这一点,比如在这个链接的备忘单或C中,可能会有所帮助。这些注释并不适用于所有的实现。例如,TreeSet或SortedSet没有提到这种复杂性。SortedSet不能有复杂性成本,因为它是抽象的,TreeSet也有复杂性成本:此实现为添加、删除和包含的基本操作提供了保证的logn时间成本。我同意在一些参考表中明确说明这一点,比如在这个链接的备忘单或C中,可能会有所帮助。文档没有遵循一个可预测的模式提及这一点。我发现一些复杂性在源代码中提到,但在文档中没有提到。很少有人像@Lavixu:SortedSet这样完全没有接口,而不是实现。若要它描述它并没有实现的方法的时间复杂性,那个将是毫无意义的。然而,TreeSet描述了它的时间复杂性。文档并没有按照可预测的模式提及这一点。我发现一些复杂性在源代码中提到,但在文档中没有提到。很少有人像@Lavixu:SortedSet这样完全没有接口,而不是实现。若要它描述它并没有实现的方法的时间复杂性,那个将是毫无意义的。然而,TreeSet对其时间复杂性有描述。