我对java中LinkedList的搜索复杂性感到困惑。我已经读过从LinkedList搜索元素的时间复杂度是O(n)。 比如说,
LinkedList<String> link=new LinkedList<String>();
link.add("A");
link.add("B");
link.add("C");
System.out.println(link.get(1));
现在,从这里通过get(index)方法我们可以说要搜索一个元素它应该花费O(1)次。但我读过它需要O(n)。 任何人都可以帮助我获得清晰的概念吗?
答案 0 :(得分:3)
链接列表实现中的访问,如java.util.LinkedList
,是O(n)。要从列表中获取元素,有一个循环跟随从一个元素到下一个元素的链接。在最坏的情况下,在n
元素列表中,执行循环的n
次迭代。
与基于数组的列表(如java.util.ArrayList
)进行对比。给定索引,执行一个随机访问操作以检索数据。那是O(1)。
答案 1 :(得分:0)
Ordo函数表示最大近似值。因此它是O(n)因为如果列表有n个条目并且你想获得最后一个条目,那么搜索将遍历n个项目。
另一方面,查找ArrayList是O(1),因为查找时间接近常量,无论列表的大小和您要查找的索引如何。
答案 2 :(得分:0)
链接列表就是这样,通过诸如指针之类的方式链接在一起的项目列表。要搜索链接列表,您将迭代列表中的每个项目。这将花费的最多时间是T(n),其中n是列表的长度。
big-O表示法代表上限或最坏情况。
如果您在索引1处搜索项目,它将几乎立即完成,T(1),因为它是列表中的第一项。如果要搜索第n个项目,则需要T(n)时间,因此保留在O(n)中。
链表的直观表示:
[1] - &gt; [2] - &gt; [3] - &gt; [4] - &gt; ...... [n-1] - &gt; [N]
get()方法的示例
get(int i)
{
Node current = head
while (i > 0)
{
current = current.getNext()
i--
}
return current
}
如您所见,它会迭代列表中的每个节点。