为什么在链接列表中按索引访问项目的速度比数组慢?

时间:2016-06-11 23:37:05

标签: java

我认为我错过了一个非常明显的观点,但在我的Java教科书中找不到它。

据我所知,节点存储不一定必须在内存中连续列表。这是否也意味着链表不可索引?如果是这样,那么在链表中查找项目的唯一方法是遍历列表,右边,而你可以通过索引从数组中test: exit 1 ;\ echo 'hi' ;\

3 个答案:

答案 0 :(得分:5)

  

为什么在链接列表中按索引访问项目的速度比数组慢?

链表有一系列条目。如果你想得到(说)位置42的元素,代码必须:

  • 获取第一个元素(位置0
  • 的条目
  • 关注位置next
  • 条目的1链接
  • 关注位置next
  • 条目的2链接

等......总共42次。

没有捷径。

  

我仍然不明白为什么链表不可索引....

现在,LinkedList可以编入索引,因为get(int)操作可以正常运行。只是索引LinkedList 效率低下。通常,在O(N)的链接列表中执行get(i)需要N个步骤。与数组或ArrayList相比,您可以在一个步骤中检索数据结构的任何元素。我们说复杂性是O(1)

将此与一般Set个对象进行对比,特别是HashSetHashSet类不可索引,因为没有get(int)方法来检索位置i的set元素。实际上,甚至连一组中“位置i”的概念也毫无意义。 Set中元素的排序未指定,(对于某些Set实现,如HashSet),它可能实际上是不确定的。

答案 1 :(得分:1)

一些链接列表实现提供了一种使用索引访问它的元素的方法,但事实是如果你想在链表中获得第10个元素,你的编译器仍然必须经历从0到9的所有序列,因为元素可能会传遍记忆。另一方面,当您使用索引在数组中请求第10个元素时,编译器会计算第10个元素的确切位置并直接跳转到该元素。数组和列表有不同的用途;如果您的算法需要在数据结构上前后移动,那么使用数组效率很高。如果您主要需要添加/删除操作,那么使用列表

是有效的

答案 2 :(得分:0)

使用链接列表,您可以随时添加和删除元素,因此索引没有任何意义。想象一下,您创建了一个指向列表第三个元素的索引。之后,在列表的开头插入一个新元素。什么值应该返回索引?

然而,例如,可以在列表的中间创建索引,并且只有在列表的后半部分添加o remove元素时才使用它。

@paxdiablo在这里解释得很清楚Is there a known implementation of an indexed linked list?