数组和链表简介
在计算机中要对给定的数据集进行若干处理,首要任务是把数据集的一部分(当数据量非常大时,可能只能一部分一部分地读取数据到内存中来处理)或全部存储到内存中,然后再对内存中地数据进行各种处理。
当内存中有足够大地连续空间时,可以把数据连续地存放在内存中,各种编程语言中的数组一般都是按这种方式存储的;
当内存中只有一些离散的可用空间时,想要连续存储数据非常困难,这时能想到的一种解决方式是移动内存中的数据,把离散的空间聚集成连续的一大块空间。然而有时候移动数据也会存在困难;
另外能想到的方式是把数据分开离散地存储到这些不连续空间中,这时为了能把所有数据联系起来,需要在前一块数据地存储空间中记录下一块数据地地址,这样只要知道第一块内存空间的地址就能环环相扣地把数据集整体联系在一起了。
由上可知,内存中地存储形式可以分为连续存储和离散存储两种。因此,数据地物理存储结构就有连续存储和离散存储两种,它们对应了我们通常所说地数组和链表。
数组和链表地区别
数组是将元素在内存中连续存储
- 优点:因为数据是连续存储地,内存地址连续,所以在查找数据地时候效率较高;
- 缺点:在存储之前,我们需要申请一块连续的内存空间,并且在编译的时候就必须确定好它的空间的大小。在运行的时候空间的大小是无法随着你的需要进行增加和减少而改变的,当数据量比较大时,有可能会出现越界的情况,数据比较小的时候,又可能会浪费内存空间。在改变数据个数时,增加、插入、删除数据效率比较低。
链表是动态申请内存空间,不需要像数组需要提前申请好内存的大小,链表只需要在用的时候申请就可以,根据需要来动态申请或者删除内存空间,对于数据增加和删除以及插入比数组灵活。还有就是链表中数据在内存中可以是任意位置,通过应用来关联数据(就是通过存储元素的指针来联系)。
链表和数组使用场景
- 数组使用场景:数据比较少:经常做的运算是按序号访问数据元素;数组更容易实现,任何高级语言都支持;构建的线性表较稳定;
- 链表使用场景:对线性表的长度或者规模难以估计;频繁做插入删除操作;构建动态性比较强的线性表。