LinkedList.subList(int,int)的时间复杂度

时间:2017-10-27 17:42:09

标签: java data-structures time-complexity big-o

如果我有一个对象的链接列表,我想要索引2到5的子列表。这个操作是o(1)吗?您需要做的就是在索引2的节点上对prev的引用为空,并在索引2处返回节点,对吗?这是否需要将链表的内容复制到另一个并返回或仅将头设置为索引2处的节点?

3 个答案:

答案 0 :(得分:1)

  

此操作是否为(1)?

通常,获取链表的子列表是O(k),而不是O(1) *

但是,对于任何特定的索引值,例如2,5或5000,任何操作都是O(1),因为特定索引变为从Big-O表示法中分解出来的常量。

* 可以优化子列表的构建,以便您在子列表的第一个导航上支付建筑成本,而不是构造。换句话说,构建子列表而不迭代它是O(1)。

答案 1 :(得分:0)

如果您考虑算法的一般情况,那么O(n)。即使你做了你所说的,找到第n和第m个元素也会完全遍历列表。

认为找到2到5的子列表是O(1)是错误的。它是O(1),但它需要不断的操作才能做到这一点,但是你是否为sublist(2,5)创建算法?如果你那样做,那么它总是O(1)

更好的例子是排序100个数字具有O(1)复杂度,因此排序10,000个数字。但这不是我们所关心的。我们想知道基于输入到该算法的输入的算法的性质。

答案 2 :(得分:0)

似乎sublist方法在O(1)时间内运行。见the source code for the method.

此代码执行的所有操作都返回一个新的SubList实例,该实例使用调用sublist的列表进行初始化。这里没有发生迭代,因此操作在恒定时间内运行。