我在arraylist中有N个数字。要获得indexOf
,arraylist必须迭代最多N次,因此复杂度为O(N)
,这是正确的吗?
答案 0 :(得分:10)
来源Java API
是的,复杂性是O(N)。
size,isEmpty,get,set,iterator和listIterator操作以恒定时间运行。添加操作以分摊的常量时间运行,即添加n个元素需要O(n)时间。所有其他操作都以线性时间运行(粗略地说)。与LinkedList实现相比,常数因子较低。
答案 1 :(得分:3)
是的,它是 O(n),因为它需要在最坏的情况下迭代列表中的每个项目。
实现更好的唯一方法是在列表中使用某种结构。最典型的示例是在 O(log n)时间内使用二进制搜索查看排序列表。
答案 2 :(得分:2)
是的,这是正确的。该订单基于最坏的情况。
答案 3 :(得分:1)
确实如此。最佳案例是1所以O(1),平均情况是N / 2所以O(N)和最坏情况是N所以O(N)
答案 4 :(得分:0)
100%,需要遍历列表才能找到正确的索引。
答案 5 :(得分:0)
ArrayList是一个具有更多功能的数组。因此,对ArrayList执行的操作的复杂性顺序与Array相同。
答案 6 :(得分:0)
在最坏的情况下,您会在最后一个位置找到元素,该元素需要N步,即O(N)。在最好的情况下,您要搜索的项目是第一个,因此复杂度为O(1)。平均长度是平均步数。如果我们没有进一步的背景,那么就可以进行计算:
avg =(1 + 2 + ... n)/ n =(n *(n + 1)/ 2)/ n =(n + 1)/ 2
如果 n - >无穷大,然后加上正常数并除以正常数没有影响,我们仍然有无穷大,所以它是O(n)。
但是,如果您要使用大量有限数据,那么您可能需要计算上面的确切平均值。
此外,您可能有一个上下文可以帮助您进一步准确计算。
示例:
让我们考虑一下您的数组按使用频率降序排序的示例。如果你的indexOf
的使用是一种用法,那么最可能的项目是第一个,然后是第二个,依此类推。如果您有每个项目的确切使用频率,那么您将能够计算可能的等待时间。