赞
踩
1.存储
数组存储必须有提前声明空间,因为数组的存储是连续的,没有足够的空间是无法存储数组的。
链表可以将数据存储在不连续的空间中,从第一个空间开始,链表会记录下下一个空间的位置,这样就能检索到整条链表了
2.查询
根据数组的特有属性,只要找到第一个元素就能知道所有元素的地址,因为是连在一起的,所以理论上,get(0)与get(10000)所用的时间是一样的。
链表就不一样了,因为每个元素只知道自己上一个和下一个元素的地址(双向链表),所以得一个一个的查找,这里有个问题要注意一下,比如这个链表共有100个元素,是不是get(99)耗时最多呢?答案是否定的,这里以linkedlist源码为例,在get时会进行一个判断,如果get的索引小于size的一半就从0开始检索,否则从99开始检索,就是顺序查找与倒序查找,所以理论上查找中位数消耗的时间最长,下面是linkedlist中get方法的源码片段:
3.插入与删除
数组插入一个数据比较复杂,先要判断数组空间还能不能放得下,有足够空间的情况下将需要插入位置后面的数组整体向后移动,最后把这个数插入进来,如果数组没有足够的空间还需要进行扩容操作,费时费力。
链表因为对整块空间大小没有要求,见缝插针即可,所以随便找个地方存放这个元素,然后把需要插入的位置前一个元素的next指针指向这个新的元素,然后再把插入数据的next指针指向下一个元素(pre指针修改类似),建明快捷,删除一个元素也是一样,数组要整体移动,而链表只需要移动指针,所以在这个方面链表的效率要大大的高于数组。
数组的查询时间复杂度O(1) 修改的时间复杂度O(n)
链表的查询时间复杂度O(n) 修改的时间复杂度O(1)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。