我发现java并没有为任何Collection库指定任何时间或空间复杂性,这真的很令人惊讶。鉴于java中的垃圾收集是不可预测的,因此没有任何保证,但至少给出平均时间复杂度并不是有帮助的吗?我在这里缺少什么?
答案 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实现相比,常数因子较低。