基础知识---数组和链表

数组的优势:数组

  • 随机访问性强
  • 查找速度快
    • 数组要求是一块连续的内存空间来存储,这就要求在物理上这一片空间是连续的,每一个元素都有指定的索引index指向内存地址,所以查询对时候,可根据index快速找到对应地址存储的信息,此为查询快.

数组的缺点:spa

  • 插入和删除效率低
    • 数组进行增删的时候,就必须将目标位置后的全部元素都总体移动,所以就比较耗时,此为增删慢.
  • 可能浪费内存
  • 内存空间要求高,必须有足够的连续内存空间。
  • 数组大小固定,不能动态拓展

链表的优势:索引

  • 插入删除速度快
    • 链表在物理上是动态地分配储存空间,不要求连续性,可是要求逻辑上的连续。它须要存储每一个元素在内存中的地址,以及它相邻元素的地址,而后像链条同样把各元素链起来,保证了在逻辑上的连续性。
      好比:
      单链表,每一个元素除了存储自己的值外,还存储了前驱的引用,也就是存储了前驱所在的内存地址信息。
      双链表就是不只存储了前驱的引用还存储了后继的引用.内存

      增长元素的时候,只需给增长元素添加其前元素或后元素的地址;删除元素的时候,修改目标元素前驱和后驱的首位链接地址. 故此为增删快。效率

  • 内存利用率高,不会浪费内存
  • 大小没有固定,拓展很灵活。

链表的缺点:遍历

  • 不能随机查找,必须从第一个开始遍历,查找效率低
    • 因为没有像数组那样的索引,所以,查询的时候须要遍历整个链表全部元素的内存地址,而后才能肯定目标元素,此为查询慢。

 

内存中的存储形式能够分为连续存储和离散存储两种。所以,数据的物理存储结构就有连续存储和离散存储两种,它们对应了咱们一般所说的数组和链表。引用

由于数组是连续存储的,在操做数组中的数据时就能够根据离首地址的偏移量直接存取相应位置上的数据,可是若是要在数据组中任意位置上插入一个元素,就须要先把后面的元素集体向后移一位为其空出存储空间。链表

与之相反,链表是离散存储的,因此在插入一个数据时只要申请一片新空间,而后将其中的链接关系作一个修改就能够,可是显然在链表上查找一个数据时就要逐个遍历了。
考虑以上的总结可见,数组和链表各有优缺点。在具体使用时要根据具体状况选择。当查找数据操做比较多时最好用数组;当对数据集中的数据进行添加或删除比较多时最好选择链表。总结

 

数组就像身上编了号站成一排的人,要找第10我的很容易,根据人身上的编号很快就能找到。但插入、删除慢,要望某个位置插入或删除一我的时,后面的人身上的编号都要变。固然,加入或删除的人始终末尾的也快数据

链表就像手牵着手站成一圈的人,要找第10我的不容易,必须从第一我的一个个数过去。但插入、删除快。插入时只要解开两我的的手,并从新牵上新加进来的人的手就能够。删除同样的道理。

 

总结:

  • 数组静态分配内存,链表动态分配内存;

  • 数组在内存中连续,链表不连续;

  • 数组元素在栈区,链表元素在堆区;

  • 数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n);

  • 数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1);

相关文章
相关标签/搜索