如果我有一个对象的链接列表,我想要索引2到5的子列表。这个操作是o(1)吗?您需要做的就是在索引2的节点上对prev的引用为空,并在索引2处返回节点,对吗?这是否需要将链表的内容复制到另一个并返回或仅将头设置为索引2处的节点?
答案 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
的列表进行初始化。这里没有发生迭代,因此操作在恒定时间内运行。